1

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

4

3 に答える 3

1

質問を見て、上記の Drup の回答に気付く前に作業を開始しました。以下は、本質的に Drup のものと同じ自己完結型の ocamlbuild ソリューションです。

open Ocamlbuild_plugin

let enable_plugin () =
  let plugins = try string_list_of_file "plugin.config" with _ -> [] in
  dep ["ocaml"; "link_with_plugin"; "byte"]
    (List.map (fun p -> p^".cmo") plugins);
  dep ["ocaml"; "link_with_plugin"; "native"]
    (List.map (fun p -> p^".cmx") plugins);
  ()

let () = dispatch begin
    function
    | Before_rules -> enable_plugin ()
    | _ -> ()
end

タグlink_with_pluginを ocamlbuild ターゲットで使用すると、ファイルにリストされているパス (拡張子なし) を持つ任意のモジュールに依存するようになりますplugin.config。たとえば、 plugins と file がある場合、書き込みと have はpluga.ml両方plugb.mlmain.mlプラグpluga plugbインモジュールplugin.config<main.{cmo,cmx}>: link_with_pluginメインの実行可能ファイルにリンクします。

于 2016-10-02T01:11:18.107 に答える