プロジェクト ディレクトリ全体をスキャンし、ソース ファイルと対応する (ターゲット) オブジェクト ファイルのリストを収集するヘルパー クラスがあります。コンパイル タスクの依存関係は、以下に示すように、ソース ディレクトリをスキャンした後に定義されます。
CLEAN.include(FileList[obj_dir + '**/*.o'])
CLOBBER.include(FileList[exe_dir + '**/*.exe'])
$proj = DirectoryParser.new(src_dir)
$proj.source_files.each do |source_file|
file source_file.obj_file do
sh "gcc -c ..."
end
end
$proj.obj_files.each do |obj_file|
task :compile => obj_file
end
task :compile do
end
はグローバルであるため、および$proj
を含むいずれかのタスクが呼び出されると、DirectoryParser.new() が呼び出されます。これによりおよびタスクが遅くなり、望ましくありません。clean
clobber
clean
clobber
この問題を回避するために、ファイルの依存関係のすべての生成をデフォルト タスクに移動しました。これにより、タスクclean
とclobber
タスクが高速になりますが、コンパイルまたはリンクのタスクを個別に呼び出すことはできません。
CLEAN.include(FileList[obj_dir + '**/*.o'])
CLOBBER.include(FileList[exe_dir + '**/*.exe'])
task :compile => $proj.source_files do # Throws error!
end
task :default => do
$proj = DirectoryParser.new(src_dir)
$proj.source_files.each do |source_file|
file source_file.obj_file do
sh "gcc -c ..."
end
end
$proj.obj_files.each do |obj_file|
task :compile => obj_file
end
... compile
... link
... execute
end
この問題を回避するにはどうすればよいですか? 誰かが以前に同様の問題に遭遇したと確信しています。助けていただければ幸いです。