У меня есть жестко закодированные пути в моем Makefile - как использовать ocamlfind для их устранения?(или как использовать ocamlbuild или omake) - PullRequest
3 голосов
/ 02 января 2012

Я пытаюсь создать проект 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 ]

3 голосов
/ 02 января 2012

Я вижу, что вы решили свое решение с 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
2 голосов
/ 02 января 2012

Я получил это с помощью ocamlbuild.Вот секретный соус:

_tags file:

<*.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, было бы замечательно увидеть и ответ на этот вопрос.

...