2008-10-14 5 views
8

Ich experimentiere mit einem aktualisierten Build-System bei der Arbeit; zur Zeit versuche ich eine gute Möglichkeit zu finden, Compiler & Flags abhängig von der Zielplattform zu setzen.Gute Möglichkeit, einen "Schalter" in einem Makefile zu tun

Was ich möchte, ist, etwas zu tun wie

switch $(PLATFORM)_$(BUILD_TYPE) 
    case "Linux_x86_release" 
    CFLAGS = -O3 
    case "Linux_x86_debug" 
    CFLAGS = -O0 -g 
    case "ARM_release" 
    CC = armcc 
    AR = armlink 
    CFLAGS = -O2 -fx 
    ... 

, die von GNU ist nicht Stellen unterstützt. Nun, mein erster Gedanke nur zu tun, war zu

-include $(PLATFORM)_$(BUILD_TYPE) 

, der eine ziemlich anständigen Lösung ist jedoch, es macht es schwer, einen Überblick zu bekommen, was zwischen Dateien unterscheidet, nicht zu erwähnen, dass ich freue mich auf Schreiben & Beibehaltung einer guten 60-80 Dateien, die jeweils eine Reihe von Variablen-Definitionen enthalten.

Kennt jemand einen besseren Weg, dies zu erreichen? I.e. Setzen einer Reihe von Flags und anderen Optionen basierend auf einer anderen Variablen?

Antwort

4

auf ein System Switching, die es für Sie tut (auto/autoconf) kann einfacher sein ...

+0

Mein Anwendungsfall ist eigentlich, dass ich ein Makefile-basiertes System habe, das eine große Menge von Komponenten erstellt, von denen einige über Skripts verfügen, die korrekt gesteuert werden müssen. Das Build-System hält die Dinge pro Ausgabeziel mit einer $ (arch) -ähnlichen Zeichenfolge getrennt, die nicht an config übergeben werden kann. Daher benötige ich eine case-Anweisung, die unseren $ (arch) in den Wert von --host in umwandelt an das configure-Skript übergeben werden. Wir erhalten den $ (arch) von etwas wie '-include $ (PLATFORM) _ $ (BUILD_TYPE)' am Anfang des Build-Systems. –

6

Konfigurieren solcher Parameter wäre die Aufgabe eines configure Skript.

Das gesagt, können Sie in die Syntax für conditionals und conditional functions suchen. Zum Beispiel könnten Sie versuchen, die folgenden:

ifeq ($(PLATFORM)_$(BUILD_TYPE),Linux_x86_release) 
    CFLAGS = -O3 
endif 
ifeq ($(PLATFORM)_$(BUILD_TYPE),Linux_x86_debug) 
    CFLAGS = -O0 -g 
endif 
+0

Ja, aber diese Syntax ist GNUmake-spezifisch (der Portable-Teil der Makefile-Sprache ist sehr klein. Fast jedes nicht-triviale Makefile ist nicht portabel) – bortzmeyer

+2

Nun, entweder hängen gmake und ifeq/endif, oder abhängen pmake und verwenden Sie # if/# endif, oder hängen Sie von bmake ab und verwenden Sie .if/.endif oder hängen Sie von einem Makefile-Generator ab. – ephemient

16

Wie wäre:

CFLAGS_Linux_x86_release  = -O3 
CFLAGS_Linux_x86_debug   = -O0 -g 


CFLAGS = ${CFLAGS_${PLATFORM}_${BUILD}} 
+0

Danke, ordentlicher Trick. Funktioniert auch für Solaris-Makefiles, mit denen ich die gleichen Makefiles unter Solaris und Linux verwenden kann. –

4

Die von Makefile verwendete git ist ein gutes Beispiel für ein Makefile, das nicht-triviale Konfigurationsaufgaben im Makefile selbst ausführt (z. B. das Einschalten des Host-Typs). Es ist tatsächlich ziemlich lesbar und relativ einfach zu bedienen.

+0

Das Zeug 'ifeq' /' endif' wurde in die Datei ['config.mak.uname'] (https://git.kernel.org/cgit/git/git.git/tree/config.mak.uname verschoben). Bitte aktualisieren Sie Ihre Antwort und geben Sie einige Beispiele an. Prost ;-) (Frohes neues Jahr) – olibre

+3

Eh, nein, ich werde meine Zeit nicht damit verbringen, eine sechs Jahre alte Antwort zu aktualisieren, nur weil die Git-Entwickler sich entschieden haben, ihre Makefiles zu ändern. Ich habe lustigere Dinge zu tun. :) – JesperE

+0

Okay, ich habe deine Antwort trotzdem verbessert. Wenn jemand das Update sehen möchte, kann er/sie meinen Kommentar lesen. Wie auch immer, ich würde mich freuen, wenn Sie Ihre Antworten gerne aktualisieren ... Prost und ein gutes neues Jahr. – olibre

Verwandte Themen