我决定将编译环境从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做,但我不知道是否可能,如果是的话,我应该怎么做?
答案 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.ml
或externalwrapper_fake.ml
。
您可以实际构建自己的配置脚本来构建_oasis
文件,而不是使用autoconf替换。例如,在BAP中,我们通过从自定义configure脚本中的片段粘贴它来构建最终的_oasis
文件。
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
以启用条件代码编译。