Ho usato questo Makefile
per eseguire alcuni test con GNU Make e verificare il valore origin e di default di alcune variabili:
define whatisit
$(info $(1) origin is ($(origin $(1))) and value is ($($(1))))
endef
$(call whatisit,CC)
$(call whatisit,CFLAGS)
ecco i risultati:
$ 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)
Come potete vedere ci sono due tipi di variabili. Questi tipi sono definiti in the manual.
Il primo set di variabili (AR
, AS
, CC
, ...) ha valori default
.Il secondo set di variabili (ARFLAGS
, ASFLAGS
, CFLAGS
, ...) è predefinito su una stringa vuota (ad esempio undefined
).
Per impostazione predefinita, possono essere sovrascritti per ambiente o riga di comando.
Imposta valore predefinito per le undefined
variabili
Per le variabili undefined
(e anche altre variabili utente) devi solo utilizzare l'operatore ?=
per impostare un valore di default che può essere di override per l'ambiente o il comando linea.
CFLAGS ?= -Wall -Wextra -Werror
Imposta valore predefinito per le variabili default
Il modo migliore per modificare il valore predefinito per le variabili default
è quello di verificare la presenza di loro origine e modificare il valore solo quando è necessario.
ifeq ($(origin CC),default)
CC = gcc
endif
Conclusione
Il 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)
Il risultato finale:
$ 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)
Opzionale
È possibile utilizzare la variabile MAKEFLAGS
per disabilitare le regole implicite incorporate e le impostazioni delle variabili integrate. In questo modo:
MAKEFLAGS += -rR
Questo pulire un sacco di impostazioni predefinite (si può controllare usando make -p
). Ma le variabili default
(come CC
) avranno ancora un valore predefinito.
CC non ha un valore predefinito nel proprio makefile, basta impostarlo, CC è solo una convenzione per un nome variabile – aaronman
@aaronman: 'CC' ha valore' cc' di default (almeno in GNU make stavo testando). Viene descritto con il valore predefinito nella documentazione: [Variabili utilizzate da regole implicite] (http://www.gnu.org/software/make/manual/make.html#Implicit-Variables). Le [regole implicite] (http://www.gnu.org/software/make/manual/make.html#Catalogue-of-Rules) che usano 'CC' e altre variabili ci sono. Ad esempio, se hai il file 'prog.c' e solo un vuoto (!)' Makefile' invocando 'make prog' eseguirà' cc prog.c -o prog'. – pabouk