0

我决定将我的编译环境从 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 中进行,但我不知道这是否可能,如果可以,我应该怎么做?

4

2 回答 2

1

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

但是,解决方法很少。

预处理

您可以添加一个额外的间接层,并从_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.ml或的变量externalwrapper_fake.ml

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

使用 Object 部分并扩展 OCamlBuild

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

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

于 2017-02-07T17:17:30.380 回答
0

一种可能性是使用带有库名称的标志,并在库存在时要求 opam 启用它们(oasis2opam为您执行此操作)。例如,参见lwt标志的定义及其用于有条件地构建库。如果库存在,您也可以setup.ml 启用该标志。最后,您可以添加cppo 规则myocamlbuild以启用条件代码编译。

于 2017-02-07T18:06:32.820 回答