Da ich ein Projekt mit einer einfachen Makefile habe etwa so:Wie kann ich Makefile-Build-Ausgaben für verschiedene Konfigurationen trennen?
all: foobar
foobar: foo.o bar.o
, dass ich verschiedene Architekturen gezielt aufbauen kann:
$ CC=clang make # or
$ CC=x86_64-w64-mingw32-gcc make # or
$ CC=arm-linux-gnueabihf-gcc make
Dies funktioniert, aber ich möchte in der Lage sein, Ausgänge für mehr zu halten Konfigurationen gleichzeitig, zum Beispiel auf einem Build-Server.
Was wäre ein guter, sauberer Weg? Ich habe folgende betrachtet:
- Verwenden Autotools oder einen anderen Build-Tool, aber ich will sehen, was ohne möglich ist
- bauen Erstellen Sie Verzeichnisse mit Makefiles in ihnen diesen Satz VPATH und schließen die Wurzel Makefile
- schreiben ein Skript, das die Ausgabe nach dem Erstellen jeder Architektur verschiebt
- Ändern Sie das Makefile, um mehrere Konfigurationen zu erstellen. Ich mag diese Lösung nicht, weil Sie am Ende eine Art Meta-Makefile haben, das komplex und eng mit Ihrer spezifischen Build-Umgebung verbunden ist.
- Fügen Sie dem Makefile eine Variable hinzu, um das Ausgabeverzeichnis festzulegen. Dies könnte funktionieren, aber es bedeutet, dass ich keine impliziten Makefile-Regeln verwenden kann. Musterregeln würden sich zu chaotisch
Wenn Sie sagen, Sie die Ausgabe gespeichert werden soll, meinen Sie die Objekte, oder einfach nur die endgültige ausführbare Datei? Es ist üblich, '$ (OBJDIR)' als Ausgabeverzeichnis für Objekte festzulegen, und Sie können dies abhängig von der Build-Konfiguration festlegen. Die impliziten Regeln sind ziemlich einfach umzuschreiben, obwohl Sie erst eine Regel erstellen müssen, um $ (OBJDIR) zu erstellen. – blackghost
Ich denke, Sie sollten verschiedene Ziele (mit Verzeichnissen) zu jeder Architektur verwenden. Sage 'arm/foo',' x86_64/foo' und 'main/foo'. Ich schlage vor, versuchen Sie so einfach wie möglich zu sein :) – uzsolt
Ich denke, dass ich mit der '$ (OBJDIR)' Lösung gehen werde, die von @John erwähnt wird. Ich habe wirklich gehofft, dass etwas wie 'make -f ../Makefile VPATH = ...' möglich ist, aber ich nehme an, dass es nicht so ist. @uzsoft Ich glaube nicht, dass das Makefile Wissen über diese verschiedenen Umgebungen haben sollte, stattdessen sollte es anpassungsfähig sein. Daher meine Meta-Makefile-Bemerkung. –