プロジェクトが実際にコンパイルされてファイルになるものである場合は、一般的なデバッグ タスクとリリース タスクを作成しないことをお勧めします。あなたが述べているように、あなたの例では非常に実行可能なファイルタスクを使用する必要があります。出力は別のディレクトリに送られます。プロジェクトが test.c ファイルを out/debug/test.out と out/release/test.out に gcc でコンパイルするだけだとすると、次のようにプロジェクトをセットアップできます。
WAYS = ['debug', 'release']
FLAGS = {}
FLAGS['debug'] = '-g'
FLAGS['release'] = '-O'
def out_dir(way)
File.join('out', way)
end
def out_file(way)
File.join(out_dir(way), 'test.out')
end
WAYS.each do |way|
desc "create output directory for #{way}"
directory out_dir(way)
desc "build in the #{way}-way"
file out_file(way) => [out_dir(way), 'test.c'] do |t|
sh "gcc #{FLAGS[way]} -c test.c -o #{t.name}"
end
end
desc 'build all ways'
task :all => WAYS.map{|way|out_file(way)}
task :default => [:all]
このセットアップは次のように使用できます。
rake all # (builds debug and release)
rake debug # (builds only debug)
rake release # (builds only release)
これは、要求されたとおりにもう少し機能しますが、私のポイントを示しています。
- 必要に応じて、出力ディレクトリが作成されます。
- ファイルは必要な場合にのみ再コンパイルされます (この例は、最も単純な test.c ファイルに対してのみ正しいものです)。
- リリース ビルドまたはデバッグ ビルドをトリガーする場合は、すべてのタスクをすぐに実行できます。
- この例には、デバッグ ビルドとリリース ビルドの小さな違いも定義する方法が含まれています。
- グローバル変数でパラメーター化されたビルドタスクを再度有効にする必要はありません。これは、異なるビルドが異なるタスクを持つようになったためです。ビルドタスクのコード再利用は、コードを再利用してビルドタスクを定義することによって行われます。ループが同じタスクを 2 回実行するのではなく、後でトリガーできるタスクを作成する方法を確認してください (すべてのタスクによって、または rake コマンドラインでそれらの 1 つを選択することによって)。