Rakefile Regelausgabe Erzeugungsproblem
Frage
ich habe eine Rakefile mit einer Regel wie folgt aus:
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
Wie Sie sehen können, ist es viele .so Bibliotheken aus dem ‚stdlib‘ Verzeichnis erzeugt (die die Quellen enthalten) an das ‚bauen‘ Verzeichnis, in dem die Binärdateien gespeichert werden.
Das Problem ist jetzt, aufgrund dieses „Verzeichnisses exchange“, Harke scheint nicht die .so-Dateien zu erkennen, wie Dateien, die er erzeugt hat, wodurch die erneute Kompilierung jedes .so Modul jedes Mal o den Rechen Befehl ausführen, auch wenn nichts geändert wird.
Gibt es eine Möglichkeit, diese zu lösen?
Danke
Lösung
Sie können entweder die pathmap Syntax verwenden oder eine explizite proc die Ausgabedateinamen / Pfad in das Eingabedateiname / Pfad zu ändern.
Die pathmap Syntax etwas wie folgt aussehen (ungetestet):
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
Das proc Methode etwas wie folgt aussehen (auch nicht getestet):
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
Beachten Sie, dass Sie loswerden der expliziten ‚mkdir‘ bekommen können in Ihrer Aktion und verwenden Sie ein ‚Verzeichnis‘ Task statt (wenn Sie im Voraus die möglichen Zielverzeichnisse wissen)
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