选择要编译的文件以获取带有Oasis的模块

时间:2017-02-07 15:45:43

标签: ocaml oasis

我决定将编译环境从Makefile和配置文件切换到Oasis。

在我的configure文件中,我有这个命令:

EXTERNALLIB=""
if test "$USEOCAMLFIND" = yes; then
  EXTERNALLIB=$(ocamlfind query -i-format External)
fi

和我的Makefile

externalwrapper.ml: externalwrapper_actual.ml externalwrapper_fake.ml config.status
    @rm -f externalwrapper.ml
    @if [ -z "$(EXTERNALLIB)" ]; then \
    cat externalwrapper_fake.ml >> externalwrapper.ml;\
    else \
    cat externalwrapper_actual.ml >> externalwrapper.ml;\
    fi;\
    chmod -w externalwrapper.ml

这允许我编译一个实际的Externalwrapper模块,如果该库存在于我的计算机中,而假的库则不存在。

现在,我尝试在Oasis做,但我不知道是否可能,如果是的话,我应该怎么做?

2 个答案:

答案 0 :(得分:1)

在撰写本文时,OASIS 0.4.8既不支持可选链接,也不支持条件链接。虽然您可以选择构建目标,但目标的配方应该是静态的。有传言称,OASIS作者计划在0.4.9中添加此功能,但目前,他在ocamlbuild中被an issue阻止。

然而,有一些解决方法。

预处理

您可以添加一个额外的间接层,并从某个_oasis文件构建您的_oasis.in文件。您甚至可以使用autoconf,例如,

AC_INIT([Name], [0.1-beta], [your@email])
AC_CONFIG_FILES([_oasis])  

EXTERNALLIB=$(ocamlfind query -i-format External)
WRAPPER_MODULE=externalwrapper_fake.ml
if test -z "$(EXTERNALLIB)"; then
    WRAPPER_MODULE=externalwrapper_actual.ml
fi

AC_OUTPUT
AC_SUBST(WRAPPER_MODULE)

_oasis.in中,您可以使用@WRAPPER_MODULE@变量,该变量将实现为externalwrapper_actual.mlexternalwrapper_fake.ml

您可以实际构建自己的配置脚本来构建_oasis文件,而不是使用autoconf替换。例如,在BAP中,我们通过从自定义configure脚本中的片段粘贴它来构建最终的_oasis文件。

使用Object部分并扩展OCamlBuild

Drup提出了另一种解决方案(请参阅following PR作为示例)。我们的想法是将每个变体描述为有条件构建的对象,然后使用特殊的构建规则扩展OCamlbuild,这将根据标志找到此对象并直接链接它。

这两种解决方案都有其缺点和优点,因此我们都期待将该功能添加到OASIS中。

答案 1 :(得分:0)

一种可能性是使用带有库名称的标志,并在存在库时请求opam启用它们(oasis2opam为您执行此操作)。例如,请参阅lwt标志的定义及其对conditionally build a library的用法。您还可以setup.ml enable the flag if the library is present。最后,您可以添加cppo rules in myocamlbuild以启用条件代码编译。