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
, Не могли бы вы предоставить (возможно, упрощенные) источники для экспериментов?
(Совет Томаса о структуре программы, конечно, остается в силе, независимо.)