プロジェクトが実際にコンパイルされてファイルが生成されるものである場合は、一般的なデバッグタスクとリリースタスクを作成しないことをお勧めします。あなたが言うように、あなたの例ではかなり実行可能なファイルタスクを使うべきです、あなたの出力は別のディレクトリに行きます。プロジェクトが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回実行するのではなく、作成されたタスクがどのようにトリガーされるかを確認します(後でall-taskによって、またはrakeコマンドラインでそれらの1つを選択して)。