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 の問題を回避する他のツールはありますか?