1

私はこのようなルールを持つ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」ディレクトリ (ソースを含む) からバイナリが格納されている「build」ディレクトリに多くの .so ライブラリが生成されます。

ここでの問題は、この「ディレクトリ交換」が原因で、rake が .so ファイルを生成したファイルとして認識しないように見え、rake コマンドを実行するたびに、何も変更されていない場合でも、各 .so モジュールの再コンパイルが発生することです。

これを解決する方法はありますか?

ありがとう

4

1 に答える 1

2

パスマップ構文または明示的なプロシージャを使用して、出力ファイル名/パスを入力ファイル名/パスに変更できます。

パスマップの構文は次のようになります (未テスト):

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
于 2010-05-20T17:54:02.813 に答える