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.
CC hat keinen Standardwert in Ihrem eigenen Makefile setzen Sie es einfach, CC ist nur eine Konvention für einen Variablennamen – aaronman
@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