質問

私はこのようなルールに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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top