2013-08-02 17 views
12

(GNU) make utilizza diversi variables come:
Come cambiare i valori di default delle variabili come CC nel Makefile

  • CC - compilatore C, per impostazione predefinita cc
  • CFLAGS - bandiere per il compilatore C , per impostazione predefinita vuoto

Desidero specificare i miei valori predefiniti di alcuni di essi nel mio Makefile. Nell'esempio che segue ho usato l'operatore di assegnazione condizionale ?= essere in grado di ignorare i miei valori di default durante l'esecuzione make:

CFLAGS ?= CFLAGS_my_default 
CC ?= CC_my_default 

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

Purtroppo questo non cambia il valore della variabile CC come valore di default originale rimane lì. CFLAGS sono impostati dal mio incarico come variabile era in origine vuoto:

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

Override dalle variabili d'ambiente funziona come previsto:

$ 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 

Come posso cambiare i valori di default delle variabili e di essere ancora in grado di eseguire l'override quando invocano make?

+0

CC non ha un valore predefinito nel proprio makefile, basta impostarlo, CC è solo una convenzione per un nome variabile – aaronman

+0

@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

risposta

4

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.

11

E 'possibile utilizzare l'assegnazione non condizionale:

CFLAGS ?= CFLAGS_my_default 
CC = CC_my_default 

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

ma senza condizioni variabili fissati non possono essere modificate da variabili d'ambiente:

$ 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 

Aspetta, c'è un altro modo di impostare la variabile quando invocando 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 

In questo modo le variabili non condizionatamente set vengono ignorate anche. Questo metodo funziona anche con l'uso ricorsivo di make dove lo variables specified on command-line are automatically passed to the new make process.

Un altro metodo è quello di consentire primario di variabili incondizionatamente fissato dal variabili d'ambiente con l'interruttore di comando -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

Le variabili impostate incondizionatamente possono essere sovrascritte dalle variabili di ambiente se si richiama make con '-e':' CC = CC_from_env CFLAGS = CFLAGS_from_env make -e print' –

+0

Ho aggiunto il metodo alla risposta. Grazie! – pabouk

Problemi correlati