我有一个当前使用 OCamlMake 构建的 OCaml 项目。我对当前的构建系统不满意,因为它将所有构建工件与源文件放在同一目录中,而且它还需要手动指定模块之间的依赖顺序。我想切换到不受这些问题困扰的构建系统。我决定尝试 Oasis,但遇到了问题。
问题源于该项目是以非常特定的方式构建的事实。它支持几种不同的数据库后端(PostgreSQL、MySQL、SQLite)。目前,要编译数据库后端,用户必须安装该后端所需的额外库,并通过设置环境变量来启用它。这是它在 Makefile 中的样子:
ifdef MYSQL_LIBDIR
DB_CODE += mysql_database.ml
DB_AUXLIBS += $(MYSQL_LIBDIR)
DB_LIBS += mysql
endif
请注意,这也会将额外的模块添加到已编译模块的列表中。重要的是,从应用程序入口点可访问的任何模块与数据库后端模块之间没有依赖关系(在模块导入的意义上)。相反,每个数据库后端模块都包含在模块启动时运行的顶级代码,并使用副作用向主应用程序注册自身。
我无法让此设置与 Oasis 一起使用。我将每个数据库后端模块声明为一个单独的库,可以使用标志启用编译:
Library mysql-backend
Path : .
Build $: flag(mysql)
Install : false
BuildTools : ocamlbuild
BuildDepends : main, mysql
Modules : Mysql_backend
但是,我想不出一种方法来告诉 Oasis 将可选模块链接到可执行文件中。我试图通过修改myocamlbuild.ml
文件找出一种方法,但失败了。我可以使用此处rule
描述的功能来实现这一点吗?
如果我所描述的无法实现ocamlbuild
,是否有任何其他工具可以完成这项工作并避免 OCamlMake 的问题?