Ocaml 选择要编译的文件以获得具有Oasis的模块

Ocaml 选择要编译的文件以获得具有Oasis的模块,ocaml,oasis,Ocaml,Oasis,我决定将编译环境从Makefile和configure文件切换到Oasis 在我的configure文件中,我有以下命令: EXTERNALLIB="" if test "$USEOCAMLFIND" = yes; then EXTERNALLIB=$(ocamlfind query -i-format External) fi 在我的Makefile中: externalwrapper.ml: externalwrapper_actual.ml externalwrapper_fake.

我决定将编译环境从Makefile和configure文件切换到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中执行此操作,但我不知道是否可行,如果可行,我应该如何执行?

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

然而,很少有变通办法

预处理 您只需添加一个额外的间接层,然后从文件中的一些\u oasis.in构建您的\u oasis文件。您甚至可以为此使用
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)
\u oasis.in
中,您可以使用
@WRAPPER\u MODULE@
变量,该变量将被实现为
externalwrapper\u actual.ml
externalwrapper\u fake.ml

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

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


这两种解决方案各有利弊,因此我们都期待着将此功能添加到OASIS中

一种可能性是在库名称中使用标志,并在库存在时请求opam启用它们(为您这样做)。例如,请参见标志的定义及其用于。您还可以使用
setup.ml
。最后,您可以添加以启用条件代码编译

我认为这应该有帮助:好吧,根据这篇文章的答案,我应该怎么做?使用德鲁普的解决方案还是你的?;-)呵呵,这是你的决定:)让我在回答中总结一下你的选择,当我开始进入这个空间时,我试图在评论中说。我明天会试试,让你知道臭虫,我喜欢这种回答!如果我能给它+10,我会做的!谢谢好吧,我对你写的东西有一个问题,我不得不用
if test-z“$EXTERNALLIB”
替换
if
,因为它告诉我
-z:command not found
。但是它工作得很好,谢谢!是的,忘了括号是由m4预处理器解释的。将修复它。这是完全不相关的,但您知道为什么当我执行
oasis安装程序时出现此错误:
W:file configure
中找不到replace节吗?可能是因为您启用了DevFiles插件,它试图覆盖您的配置文件。我建议禁用该插件(您可以保留生成的Makefile,它不依赖于_oasis文件)。