質問
私はこのようなルールにRakefileを持っています:
rule '.so' => '.cc' do |t|
puts "@ Compiling #{t.source}"
output = t.source.ext("so")
output['stdlib'] = 'build'
sh "mkdir -p #{File.dirname(output)}"
sh "#{CXX} #{t.source} -o#{output} #{STDLIB_CFLAGS} #{STDLIB_LFLAGS}"
end
あなたが見ることができるように、それはバイナリが保存されている「ビルド」ディレクトリに(ソースが含まれています)「STDLIB」ディレクトリから、多くの.soライブラリを生成します。
さて問題は、熊手も何もない場合、すくいコマンドを実行してoをそれぞれの.soモジュール毎時間の再コンパイルを引き起こし、それが生成したファイルとしての.soファイルを認識しないように見えるこの「ディレクトリ交換」に、あります変更されます。
これを解決する方法は?あります。
おかげ
解決
あなたは、どちらかの入力ファイル名/パスに出力ファイル名/パスを変更するにはパスマップ構文または明示的なPROCを使用することができます。
はパスマップの構文は次のようになります(未テスト):
rule '.so' => '%{build,stdlib}X.cc' do |t|
puts "@ Compiling #{t.source}"
sh "mkdir -p #{File.dirname(t.name)}"
sh "#{CXX} #{t.source} -o#{t.name} #{STDLIB_CFLAGS} #{STDLIB_LFLAGS}"
end
のproc方法は(もテストされていない)、このようになります。
rule '.so' => [proc { |f| f.sub(/build/, 'stdlib').ext('.cc') }] do |t|
puts "@ Compiling #{t.source}"
sh "mkdir -p #{File.dirname(t.name)}"
sh "#{CXX} #{t.source} -o#{t.name} #{STDLIB_CFLAGS} #{STDLIB_LFLAGS}"
end
(事前に可能先ディレクトリを知っていれば)、あなたのアクションで明示的な「MKDIR」を取り除くと、代わりに「ディレクトリ」タスクを使用できることに注意してください。
possible_dest_dirs.each { |d|
directory d
}
rule '.so' => [proc { |f| f.sub(/build/, 'stdlib').ext('.cc') },
proc { |f| File.dirname(f) }] do |t|
puts "@ Compiling #{t.source}"
sh "#{CXX} #{t.source} -o#{t.name} #{STDLIB_CFLAGS} #{STDLIB_LFLAGS}"
end
所属していません StackOverflow