Was ist der beste Ansatz, um verschiedene CFLAGS für die gleichen Quelldateien zu verwenden?

7

Ich muss den gleichen Quellbaum zweimal erstellen,

1 - mit normalen cflags um das Projekt binary zu erstellen 2 - mit cflags plus -fPIC, um eine statische Bibliothek zu erstellen, die eine Art SDK zur Entwicklung von dynamischen Projektmodulen wäre.

Mit nur einem Makefile, was ist der beste Ansatz, um dies zu erreichen?

Es wäre schön, eine Art von:

zu machen %Vor%

Aber offensichtlich kann es nicht gemacht werden.

Danke

    
Simone Margaritelli 25.03.2010, 17:40
quelle

4 Antworten

12

Eine Sache, die ich in der Vergangenheit benutzt habe, ist eine andere Erweiterung:

%Vor%

Sie erstellen dann Ihre statische Bibliothek aus den .lo-Dateien und Ihre Binärdatei aus den .o-Dateien:

%Vor%

Wenn Sie GNU Make verwenden, können Sie einige eingebaute Funktionen verwenden, um die Liste der Objekte nur einmal zu pflegen:

%Vor%     
R Samuel Klatchko 25.03.2010, 17:48
quelle
7

GNU make bietet auch "Zielspezifische Variablenwerte" an. Betrachten Sie das folgende Makefile:

%Vor%

$ machen alle
alle CFLAGS ist: Meine Cflags
$ make lib_rule
lib_rule CFLAGS ist: Meine Cflags wurden um -fPIC erweitert $
(Bitte beachten Sie: Wenn Sie das Beispiel kopieren und einfügen, denken Sie daran, die Tabstops vor den Befehlszeilen wieder hinzuzufügen. Ich werde immer davon abgefangen.)

    
gh57.at 27.03.2010 18:46
quelle
2

Anstatt die kompilierten .o -Dateien im selben Verzeichnis wie die Quelle zu speichern, erstelle ich sie in beschrifteten Unterverzeichnissen. In Ihrem Fall können Sie die statischen Bibliotheksdateien als source_dir/lib/*.o und Ihre normalen Dateien als source_dir/bin/*.o erstellen lassen. Wenn Sie in Ihren verschiedenen Build-Zielen Ihr eindeutiges CFLAGS eingerichtet haben, generieren Sie einfach einen DIR_NAME -Wert, der den Namen des entsprechenden Unterordners enthält. Sie können diese Variable verwenden, wenn Sie die Pfade erstellen, die der Compiler beim Erstellen und beim Verknüpfen verwenden soll.

    
bta 25.03.2010 18:01
quelle
0

In einem anderen make-Tool wie CMake können Sie etwas viel einfacher ausdrücken.

Zum Beispiel könnten Sie das tun

%Vor%

Oder Sie könnten wiederholt das gleiche Verzeichnis mit verschiedenen Flags erstellen, indem Sie es mehrmals vom logischen übergeordneten Element des Verzeichnisses einfügen, d. h.

%Vor%

... und dann if() oder whatnot im Child-Verzeichnis verwenden, um die richtigen Flags zu setzen.

Besonders wenn Sie viele solcher Konfigurationen haben, wird die Verwendung von make ziemlich zerbrechlich; make wird die transitive Schließung von rekursiven make dependancies nicht korrekt finden (und wird sicher nicht die Abhängigkeit vom Makefile selbst finden - wenn Sie beispielsweise Flags ändern), also wenn Sie komplizierte Makefile-Magie machen wollen: tun Sie es mit ein besseres Werkzeug!

(CMake ist einfach das was ich ersetze machen mit, aber es sind natürlich verschiedene andere Ersetzungen möglich)

    
Eamon Nerbonne 25.03.2010 17:57
quelle

Tags und Links