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

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top