2013-08-02 25 views
12

(GNU) make verwendet mehr variables wie sie ändern:
So werden Standardwerte von Variablen wie CC in Makefile

  • CC - C-Compiler, die standardmäßig cc
  • CFLAGS - Flaggen für die C-Compiler , standardmäßig leer

Ich möchte meine eigenen Standardwerte von einigen von ihnen in meinem Makefile angeben. Im Beispiel unten habe ich die bedingte Zuweisung Operator ?= der Lage sein, meine Standardwerte außer Kraft zu setzen, wenn make ausgeführt wird:

CFLAGS ?= CFLAGS_my_default 
CC ?= CC_my_default 

print: 
    echo CC=$(CC) CFLAGS=$(CFLAGS) 

Leider ist dies nicht den Wert der CC Variable ändern, wenn der ursprüngliche Standardwert bleibt dort. CFLAGS durch meine Aufgabe eingestellt sind als die Variable ursprünglich leer war:

$ make print 
echo CC=cc CFLAGS=CFLAGS_my_default 
CC=cc CFLAGS=CFLAGS_my_default 

von Umgebungsvariablen Aufschalten funktioniert wie erwartet:

$ CC=CC_from_env CFLAGS=CFLAGS_from_env make print 
echo CC=CC_from_env CFLAGS=CFLAGS_from_env 
CC=CC_from_env CFLAGS=CFLAGS_from_env 

Wie kann ich die Standardwerte von Variablen und noch außer Kraft setzen können, ändern sie beim Aufruf make?

+0

CC hat keinen Standardwert in Ihrem eigenen Makefile setzen Sie es einfach, CC ist nur eine Konvention für einen Variablennamen – aaronman

+0

@Aaronman: 'CC' hat standardmäßig den Wert' cc' (zumindest in GNU make habe ich getestet). Es wird mit dem Standardwert in der Dokumentation beschrieben: [Variablen, die von impliziten Regeln verwendet werden] (http://www.gnu.org/software/make/manual/make.html#Implicit-Variables). Die [impliziten Regeln] (http://www.gnu.org/software/make/manual/make.html#Catalogue-of-Rules), die 'CC' und andere Variablen verwenden, sind da. Zum Beispiel, wenn Sie die Datei 'prog.c' haben und nur ein leeres (!)' Makefile', das 'make prog' aufruft, wird' cc prog.c -o prog' ausgeführt. – pabouk

Antwort

4

ich diese Makefile verwendet habe einige Tests mit GNU Make und überprüfen Sie den origin und Standardwert laufen einiger Variablen:

define whatisit 
$(info $(1) origin is ($(origin $(1))) and value is ($($(1)))) 
endef 

$(call whatisit,CC) 
$(call whatisit,CFLAGS) 

Hier sind die Ergebnisse:

$ make 
CC origin is (default) and value is (cc) 
CFLAGS origin is (undefined) and value is() 
$ # Environment 
$ CC=clang CFLAGS=-Wall make 
CC origin is (environment) and value is (clang) 
CFLAGS origin is (environment) and value is (-Wall) 
$ # Command line 
$ make CC=clang CFLAGS=-Wall 
CC origin is (command line) and value is (clang) 
CFLAGS origin is (command line) and value is (-Wall) 

Wie Sie sehen können, gibt es zwei Arten von Variablen. Diese Typen sind definiert als .

Die ersten Variablen (AR, AS, CC, ...) haben default Werte.Der zweite Satz von Variablen (ARFLAGS, ASFLAGS, CFLAGS, ...) ist standardmäßig eine leere Zeichenfolge (d. H. undefined).

Standardmäßig können sie von der Umgebung oder der Befehlszeile überschrieben werden.


Set Standardwert für das undefined Variablen

Für das undefined Variablen (und auch andere Benutzervariablen) Sie müssen nur den ?= Operator verwenden einen Standardwert gesetzt, der durch die Umgebung oder Befehlsüberschreibung sein kann Linie.

CFLAGS ?= -Wall -Wextra -Werror 

Set Standardwert für die Variablen default

Der beste Weg, Standardwert für die default Variablen zu ändern, ist für ihre Herkunft zu prüfen und den Wert nur ändern, wenn es gebraucht wird.

ifeq ($(origin CC),default) 
CC = gcc 
endif 

Schlussfolgerung

Die Makefile:

ifeq ($(origin CC),default) 
CC = gcc 
endif 
CFLAGS ?= -Wall -Wextra -Werror 

define whatisit 
$(info $(1) origin is ($(origin $(1))) and value is ($($(1)))) 
endef 

$(call whatisit,CC) 
$(call whatisit,CFLAGS) 

Das Endergebnis:

$ make 
CC origin is (file) and value is (gcc) 
CFLAGS origin is (file) and value is (-Wall -Wextra -Werror) 
$ # Environment 
$ CC=clang CFLAGS=-Wall make 
CC origin is (environment) and value is (clang) 
CFLAGS origin is (environment) and value is (-Wall) 
$ # Command line 
$ make CC=clang CFLAGS=-Wall 
CC origin is (command line) and value is (clang) 
CFLAGS origin is (command line) and value is (-Wall) 

Optional

Sie können die Variable MAKEFLAGS verwenden, um die integrierten impliziten Regeln und die integrierten Variableneinstellungen zu deaktivieren. Auf diese Weise:

MAKEFLAGS += -rR 

Dieses viele Standardeinstellungen reinigen wird (Sie können es durch die Verwendung make -p). Aber die default Variablen (wie CC) haben immer noch einen Standardwert.

11

Es ist möglich, nicht-bedingte Zuweisung zu verwenden:

CFLAGS ?= CFLAGS_my_default 
CC = CC_my_default 

print: 
    echo CC=$(CC) CFLAGS=$(CFLAGS) 

aber bedingungslos Setvariablen nicht von Umgebungsvariablen außer Kraft gesetzt werden:

$ CC=CC_from_env CFLAGS=CFLAGS_from_env make print 
echo CC=CC_my_default CFLAGS=CFLAGS_from_env 
CC=CC_my_default CFLAGS=CFLAGS_from_env 

Warten, gibt es eine weitere Möglichkeit, die Variable der Einstellung, wenn Aufruf make! - from command-line arguments:

$ make print CC=CC_from_cmdline CFLAGS=CFLAGS_from_cmdline 
echo CC=CC_from_cmdline CFLAGS=CFLAGS_from_cmdline 
CC=CC_from_cmdline CFLAGS=CFLAGS_from_cmdline 

diese Weise können die nicht-bedingt Setvariablen auch außer Kraft gesetzt bekommen. Diese Methode funktioniert sogar mit rekursiver Verwendung von make, wo die variables specified on command-line are automatically passed to the new make process.

Ein andere Methode ist überwiegende von bedingungslos festgelegt Variablen von Umgebungsvariablen zu ermöglichen, mit dem Befehl Schalter -e:

$ CC=CC_from_env CFLAGS=CFLAGS_from_env make -e print 
echo CC=CC_from_env CFLAGS=CFLAGS_from_env 
CC=CC_from_env CFLAGS=CFLAGS_from_env 
+3

Bedingungslose Variablen können von Umgebungsvariablen überschrieben werden, wenn Sie make mit '-e' aufrufen:' CC = CC_from_env CFLAGS = CFLAGS_from_env make -e print' –

+0

Ich habe die Methode zur Antwort hinzugefügt. Vielen Dank! – pabouk

Verwandte Themen