首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我的Makefile中有硬编码的路径--如何使用ocamlfind来消除这些?(或者如何使用ocamlbuild或omake )

我的Makefile中有硬编码的路径--如何使用ocamlfind来消除这些?(或者如何使用ocamlbuild或omake )
EN

Stack Overflow用户
提问于 2012-01-02 06:31:05
回答 2查看 794关注 0票数 3

我正在尝试构建一个ocaml项目,它需要一个camlp4扩展(在本例中是pa_deriving)。这是我的Makefile:

代码语言:javascript
运行
复制
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的godi安装。我想去掉它们,这样我就可以分发代码& Makefile,这样任何人都可以使用它进行构建。

我应该使用omake还是ocamlbuild呢?我想使用omake,我也用过OMakefile,但是我不能让任何东西工作--任何建议都将不胜感激。

更新:我尝试在下面的_tags文件中使用ocamlbuild:

代码语言:javascript
运行
复制
<*.ml>: package(unix), package(oUnit), package(deriving-ocsigen.syntax), syntax(camlp4o)

使用以下ocamlbuild命令: ocamlbuild -use-ocamlfind test_logic.native -classic-display

我得到了:

代码语言:javascript
运行
复制
/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文件中添加什么才能纠正这个问题?

EN

回答 2

Stack Overflow用户

发布于 2012-01-02 17:12:26

我看到你用ocamlbuild解决了你的问题,这很好。在一般情况下,您可以使用脚本/Makefile中的ocamlfind query作为命令行接口来查询有关findlib包的信息,特别是避免使用硬编码路径。

代码语言:javascript
运行
复制
$ 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
票数 3
EN

Stack Overflow用户

发布于 2012-01-02 09:43:14

我使用ocamlbuild完成了这项工作。这就是秘方:

_tags文件:

代码语言:javascript
运行
复制
<*.ml> or "test_logic.native": package(unix), package(oUnit), package(deriving-ocsigen), package(deriving-ocsigen.syntax), syntax(camlp4o)

:*或"test_logic.native"*对于链接阶段非常重要。

然后运行:

代码语言:javascript
运行
复制
ocamlbuild -use-ocamlfind test_logic.native -classic-display

所以我可能会坚持使用ocamlbuild解决方案。如果有人知道如何在omake中实现这一点,那么也能看到答案就太好了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8696016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档