regola Rakefile problema generazione uscita
Domanda
ho un Rakefile con una regola come questa:
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
Come si può vedere, genera molte biblioteche .so dalla directory 'stdlib' (che contiene i sorgenti) nella directory 'build' in cui sono memorizzati i file binari.
Ora il problema è, a causa di questo "scambio directory", rastrello sembra non riconoscere i file .so come file che ha generato, causando la ricompilazione di ogni .so modulo di volta in volta o eseguire il comando rake, anche se nulla viene modificato.
C'è un modo per risolvere questo?
Grazie
Soluzione
È possibile utilizzare la sintassi pathmap o un proc esplicita di cambiare l'output nome del file / percorso all'ingresso nome del file / percorso.
La sintassi pathmap sarà simile a questa (non testata):
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
Il metodo proc sarà simile a questo (anche non testata):
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
Si noti che si può sbarazzarsi del esplicito 'mkdir' nella vostra azione e utilizzare un compito 'directory' invece (se si conosce in anticipo le possibili directory di destinazione)
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