ocamlbuild и OUnit

У меня есть проект, структурированный так:

Makefile
src/
  main.ml
tests/
  tests.ml

и Makefile это что-то вроде этого:

tests:
    ocamlbuild -Is src,tests tests.byte -build-dir $(BUILDDIR) $(TESTFLAGS) -lflags -I,/usr/lib/ocaml/oUnit -cflags -I,/usr/lib/ocaml/oUnit -libs oUnit

Бег make tests (после строительства main.byte) возвращает эту ошибку:

ocamlbuild -Is src,tests tests.byte -build-dir build -lflags -I,/usr/lib/ocaml/oUnit -cflags -I,/usr/lib/ocaml/oUnit -libs oUnit 
+ /usr/bin/ocamlc -c -I /usr/lib/ocaml/oUnit -I tests -I src -o tests/tests.cmo tests/tests.ml
File "tests/tests.ml", line 3, characters 46-50:
Error: Unbound value main
Command exited with code 2.
Compilation unsuccessful after building 2 targets (0 cached) in 00:00:00.
make: *** [tests] Error 10

показывая что ocamlbuild не может связаться с main.byte, Что следует tests Правило Makefile выглядит как?

2 ответа

Поскольку программы OCaml не имеют основной функции по умолчанию (OCaml просто запускает код верхнего уровня в каждом модуле при запуске), вам, вероятно, понадобится отдельный файл для запуска кода. например

main.ml
myprog.ml
tests.ml

Куда:

  • main.ml определяет основную функцию let main args = ...
  • myprog.ml просто называет это: let () = Main.main Sys.argv
  • tests.ml называет это одинаково из каждого теста

Затем построить myprog.byte а также tests.byte как ваши две цели для ocamlbuild. Бежать myprog.byte запустить программу и tests.byte запустить тесты.

unbound value main не похоже на ошибку, связанную с main.byte, но настоящая ошибка в коде OCaml tests.ml, Не могли бы вы предоставить (возможно, упрощенные) источники для экспериментов?

(Совет Томаса о структуре программы, конечно, остается в силе, независимо.)

Другие вопросы по тегам