如何使用OCamlMakefile生成子项目使用的库?

时间:2014-11-26 18:28:03

标签: makefile ocaml

使用OCamlMakefile可以指定源,它会自动确定后缀并减轻确定各种目标的文件后缀应该是什么的头痛。因此,如果我想在开发时使用一些ml源代码构建字节代码,然后在完成后部署到本机代码,那么它只是:

make bc

然后:

make nc

我有一个问题,我希望生成两个不同的二进制文件,它们只有一个共同的源代码。最初,makefile的组织方式如下:

ifndef SUBPROJS
    export SUBPROJS = somesubproj 
endif

define PROJ_somesubproj
    RESULT=OnlyResult
    SOURCES = common.ml containsmain.ml
    DOC_FILES=$(SOURCES)
endef
export PROJ_somesubproj

对它做make只是构建了OnlyResult。但是现在我想要生成另一个将common.ml作为消耗项生成的结果,但是它是从不同项目中的不同目录构建的; common.ml是这个目录的一部分,但不是库组织使用它的另一个东西,所以将common.ml作为源来放在现在正在使用它的另一个项目中是不对的。我想将subproj分成两个单独的目标,一个产生common.cma或common.cmxa,然后另一个产生公共库。然后在我的目录构建之外,我可以将common作为lib放置,因为它应该是。

虽然我怎么做?如何指定将common构建为没有containsmain的库?

1 个答案:

答案 0 :(得分:1)

我强烈建议考虑更古老的OCamlMake文件的现代替代品。它适用于小型到中型项目,但由于" make"的限制,对于具有许多子项目的复杂项目来说,它并没有真正很好地扩展。它也不再积极开发。

如果您需要高度的便携性,那么作为OCaml标准发行版的一部分的" ocamlbuild"是一个合理的选择。您甚至可能想要生成" ocamlbuild"文件自动使用Oasis进行打包。如果您打算将您的工作分发为开源,则特别推荐这种方法。 Oasis可以处理一些复杂的构建场景,例如库必须在几个可执行文件之间共享。

另一个成熟的构建工具是OMake,它可以扩展到大型复杂的项目,如果你已经知道" make"就很容易学习。

您甚至可能想要考虑Jenga,其中AFAIK的稳定性不足以供公众使用,但在功能和易用性方面可能最终超过OMake。