Ich würde vorschlagen, keine allgemeinen Debug- und Freigabe-Aufgaben zu erstellen, wenn das Projekt wirklich etwas ist, das kompiliert wird und somit in Dateien resultiert. Sie sollten sich für Datei-Aufgaben entscheiden, was in Ihrem Beispiel durchaus machbar ist, da Sie angeben, dass Ihre Ausgaben in verschiedene Verzeichnisse gehen. Angenommen, Ihr Projekt kompiliert nur eine test.c Datei nach out/debug/test.out und out/release/test.out mit gcc, dann könnten Sie Ihr Projekt wie folgt einrichten:
WAYS = ['debug', 'release']
FLAGS = {}
FLAGS['debug'] = '-g'
FLAGS['release'] = '-O'
def out_dir(way)
File.join('out', way)
end
def out_file(way)
File.join(out_dir(way), 'test.out')
end
WAYS.each do |way|
desc "create output directory for #{way}"
directory out_dir(way)
desc "build in the #{way}-way"
file out_file(way) => [out_dir(way), 'test.c'] do |t|
sh "gcc #{FLAGS[way]} -c test.c -o #{t.name}"
end
end
desc 'build all ways'
task :all => WAYS.map{|way|out_file(way)}
task :default => [:all]
Diese Einstellung kann wie folgt verwendet werden:
rake all # (builds debug and release)
rake debug # (builds only debug)
rake release # (builds only release)
Dies ist ein wenig mehr, als verlangt wurde, zeigt aber meine Punkte:
- Ausgabeverzeichnisse werden je nach Bedarf erstellt.
- die Dateien werden nur bei Bedarf neu kompiliert (dieses Beispiel ist nur für die einfachsten test.c-Dateien korrekt).
- haben Sie alle Aufgaben griffbereit, wenn Sie den Release-Build oder den Debug-Build auslösen wollen.
- Dieses Beispiel enthält eine Möglichkeit, auch kleine Unterschiede zwischen Debug- und Release-Builds zu definieren.
- Es ist nicht nötig, eine Build-Task, die mit einer globalen Variable parametrisiert ist, erneut zu aktivieren, da die verschiedenen Builds nun unterschiedliche Tasks haben. Die Wiederverwendung des Codes für die Build-Tasks erfolgt durch die Wiederverwendung des Codes zur Definition der Build-Tasks. Sehen Sie, wie die Schleife nicht dieselbe Task zweimal ausführt, sondern stattdessen Tasks erstellt, die später ausgelöst werden können (entweder durch die All-Task oder durch die Auswahl einer von ihnen auf der Rake-Kommandozeile).