-1

ocamlbuild プラグインを作成しようとしています。目標は、Qt アプリを構築することです (当面は OCaml コードなしで)。最終的なリンク フェーズを処理するために、obj、mocs、uis、および rcs のリストを .qtobjs ファイル (.itarget など) に書き込み、Qt ライブラリのリストを .qtpackages ファイルに書き込みました。これらのファイルに適用されるルールは、これらのリストを解析し、すべてをリンクする前にオブジェクト、モックなどを動的に構築します。

問題は、変更されていないターゲットを動的にビルドしたくないということです。以下のルールを参照してください。

rule "Link a c++ executable that uses Qt."
  ~deps:["%.qtobjs"; "%.qtpackages"]
  ~prod:"%.cxxnative"
  (fun env build ->
     let dir = Pathname.dirname (env "%.qtobjs") in
     let output = env "%.cxxnative" in
     let objlist = pwd / (env "%.qtobjs") in
     let liblist = pwd / (env "%.qtpackages") in
     let packages = read_lines liblist in
     let lflags = List.map (fun p -> "-l"^p) packages
                  @ find_all "lflags" in
     let objs = List.map (fun o -> dir / o) (read_lines objlist) in



     (* Here, I would like to forget the targets that have not changed *)
     let objs_to_build = List.filter 
         (fun target -> 
            (* something to tell if "target" has to be rebuilt *))
         objs in



     (* This is where I build the dependencies : *)
     let success_builds = build 
         (List.map (fun o -> [o]) 
         objs_to_build) in


     let objects = filter_map
         (function
           | Outcome.Good x when get_extension x = "opp" ->
             Some (pwd / "_build" / (update_extension "o" x))
           | Outcome.Good _ -> None 
             (* Because I don't want to link the ui.h file generated by uic *)
           | Outcome.Bad exn -> raise exn)
         success_builds in
     let tags_objs = tags_of_pathname (env "%.qtobjs") ++ "link" in
     let tags_packs = tags_of_pathname (env "%.qtpackages") in
     Cmd (S [A (find_one "cxx"); T tags_objs; T tags_packs; Command.atomize lflags;
             A "-o"; P output; Command.atomize objects]));

必要がないときは「ビルド」と呼びたくありません。

注意: 関数

newer_than: Pathname.t -> Pathname.t -> bool

私の問題を解決できます。

4

1 に答える 1