2010-06-03 17 views
22

Mam Makefile dla C programu, który posiada deklaracjęCo oznacza CC? = W pliku Makefile?

CC?=gcc 

Zmiana go

CC?=g++ 

nie czyni go skompilować z g ++. Zmiana tego na

CC=g++ 

CZYLI, aby używał g ++.

Więc zastanawiam się, co robi operator? =? Domyślam się, że patrzy na zmienną środowiskową, aby zdecydować, który kompilator użyć, a jeśli nie jest ustawiony, to użyj gcc? Ktoś, kto może to wyjaśnić?

Odpowiedz

29

Od http://www.gnu.org/software/make/manual/make.html:

Jest jeszcze inny operator przypisania dla zmiennych, `=”. Nazywa się to operatorem zmiennej przypisanie zmiennej , ponieważ ma on tylko efekt , jeśli zmienna nie jest jeszcze zdefiniowana . To stwierdzenie:

FOO ?= bar 

jest dokładnie odpowiednikiem tego (patrz funkcja pochodzenia):

ifeq ($(origin FOO), undefined) 
    FOO = bar 
endif 

Prawdopodobnie CC jest już zdefiniowany jako gcc, więc CC ?= g++ nie zastąpi istniejący gcc.

5

Operator ?= ustawia zmienną tylko wtedy, gdy nie jest już ustawiony: info make* Using Variables* Setting.

0

Jak inni wspomniano, jest to prawdopodobnie już predefiniowane.

Na GNU, możesz zobaczyć, co jest zdefiniowane w make -p z katalogu, który nie zawiera Makefile.

Jest to udokumentowane w: https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html

Zazwyczaj CC=cc domyślnie. Następnie na Ubuntu 14.04 na przykład, cc jest zwykle dowiązaniem symbolicznym do gcc.

Aby wyłączyć wszystkie zmienne naraz zobacz: Disable make builtin rules and variables from inside the make file Wydaje się niemożliwe.