У меня есть жестко закодированные пути в моем Makefile - как использовать ocamlfind для их устранения? (или как использовать ocamlbuild или omake)
Я пытаюсь создать проект ocaml, который требует расширения camlp4 (в данном случае pa_deriving). Вот мой Makefile:
include ./Makefile.config
OCAMLC := ${OCAMLFIND} ocamlc
OCAMLOPT := ${OCAMLFIND} ocamlopt
OCAMLDEP := ${OCAMLFIND} ocamldep
PP := -package camlp4 -ppopt /home/p/godi-3.12.1.0/lib/ocaml/site-lib/deriving-ocsigen/pa_deriving.cma -syntax camlp4o
LIBS := -I /home/p/godi-3.12.1.0/lib/ocaml/site-lib/deriving-ocsigen -package unix -package oUnit
OCAMLFLAGS = -w Aef
SOURCES = logic.ml \
fsm.ml \
test_logic.ml
test_logic: ${SOURCES:.ml=.cmo}
${OCAMLC} -o $@ ${LIBS} -linkpkg deriving.cma $^
# Common rules
%.cmi: %.mli
${OCAMLC} ${OCAMLFLAGS} ${PP} ${LIBS} -c $<
%.cmo: %.ml
${OCAMLC} ${OCAMLFLAGS} ${PP} ${LIBS} -c $<
%.cmx: %.ml
${OCAMLOPT} ${OCAMLFLAGS} ${PP} ${LIBS} -c $<
# Clean up
clean:
-rm -f *.cm[ioax] *.cmxa *.cmxs *${OBJEXT} *${LIBEXT} *.annot
-rm -f tests${EXEEXT}
distclean: clean
-rm -f *~ \#* .\#*
# Dependencies
depend:
${OCAMLDEP} ${PP} *.ml *.mli > .depend
-include .depend
Этот Makefile работает; он выполняет свою работу, но проблема в том, что у меня есть жестко запрограммированные пути выше, например: /home/p/godi-3.12.1.0/lib/ocaml/site-lib/deriving-ocsigen/pa_deriving.cma, который ссылается на мой годи инсталляция OCaml. Я хочу избавиться от них, чтобы я мог распространять код и Makefile, чтобы любой мог строить с ним.
Должен ли я использовать omake или ocamlbuild для этого? Я хотел бы использовать omake, и я играл для этого с OMakefile, но ничего не получилось - любые предложения будут оценены.
Обновление: я пытался использовать ocamlbuild со следующим файлом _tags:
<*.ml>: package(unix), package(oUnit), package(deriving-ocsigen.syntax), syntax(camlp4o)
с помощью следующей команды ocamlbuild: ocamlbuild -use-ocamlfind test_logic.native -classic-display
И я получаю:
/home/phil/godi-3.12.1.0/bin/ocamlfind ocamldep -package deriving-ocsigen.syntax -package oUnit -package unix -syntax camlp4o -modules fsm.ml > fsm.ml.depends
/home/phil/godi-3.12.1.0/bin/ocamlfind ocamldep -package deriving-ocsigen.syntax -package oUnit -package unix -syntax camlp4o -modules logic.ml > logic.ml.depends
/home/phil/godi-3.12.1.0/bin/ocamlfind ocamlc -c -package deriving-ocsigen.syntax -package oUnit -package unix -syntax camlp4o -o logic.cmo logic.ml
/home/phil/godi-3.12.1.0/bin/ocamlfind ocamlc -c -package deriving-ocsigen.syntax -package oUnit -package unix -syntax camlp4o -o fsm.cmo fsm.ml
/home/phil/godi-3.12.1.0/bin/ocamlfind ocamlopt -c -package deriving-ocsigen.syntax -package oUnit -package unix -syntax camlp4o -o logic.cmx logic.ml
/home/phil/godi-3.12.1.0/bin/ocamlfind ocamlopt -c -package deriving-ocsigen.syntax -package oUnit -package unix -syntax camlp4o -o fsm.cmx fsm.ml
/home/phil/godi-3.12.1.0/bin/ocamlfind ocamlopt -linkpkg -linkpkg logic.cmx fsm.cmx test_logic.cmx -o test_logic.native
+ /home/phil/godi-3.12.1.0/bin/ocamlfind ocamlopt -linkpkg -linkpkg logic.cmx fsm.cmx test_logic.cmx -o test_logic.native
File "_none_", line 1, characters 0-1:
Error: No implementations provided for the following modules:
Deriving_Show referenced from test_logic.cmx
Deriving_Enum referenced from test_logic.cmx
OUnit referenced from test_logic.cmx
Что мне нужно добавить в файл _tags, чтобы исправить это?
2 ответа
Я вижу, что вы решили свое решение с ocamlbuild
это нормально. В общем случае вы можете использовать ocamlfind query
из ваших скриптов /Makefile в качестве интерфейса командной строки для запроса информации о пакетах findlib и, в частности, избегайте жестко заданного пути.
$ ocamlfind query deriving-ocsigen
/usr/lib/ocaml/deriving-ocsigen
$ ocamlfind query deriving-ocsigen -i-format
-I /usr/lib/ocaml/deriving-ocsigen
$ ocamlfind query deriving-ocsigen -predicates byte -a-format
deriving_num.cma
$ ocamlfind query deriving-ocsigen.syntax -predicates syntax,preprocessor -a-format
pa_deriving.cma
$ ocamlfind query deriving-ocsigen.syntax -predicates syntax,preprocessor -format "-I %d %a"
-I /usr/lib/ocaml/deriving-ocsigen pa_deriving.cma
Я получил это работает с помощью ocamlbuild. Вот секретный соус:
файл _tags:
<*.ml> or "test_logic.native": package(unix), package(oUnit), package(deriving-ocsigen), package(deriving-ocsigen.syntax), syntax(camlp4o)
ПРИМЕЧАНИЕ: * или "test_logic.native"* очень важны для фазы связывания.
Затем запустите:
ocamlbuild -use-ocamlfind test_logic.native -classic-display
Так что я, вероятно, буду придерживаться этого решения ocamlbuild. Если кто-нибудь знает, как это сделать в omake, было бы здорово увидеть ответ на этот вопрос.