2010-06-03 8 views
22

J'ai un Makefile pour un programme C qui a la déclarationQue signifie CC? = Dans un Makefile?

CC?=gcc 

Changer à

CC?=g++ 

ne permet pas compiler avec g ++. Changement à

CC=g++ 

utilise le g ++. Donc, je me demande ce que fait l'opérateur? =? Ma conjecture est qu'elle regarde une variable d'environnement pour décider quel compilateur utiliser et si elle n'est pas définie alors utilisez gcc? Quelqu'un qui peut éclaircir ça?

Répondre

29

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

Il y a un autre opérateur d'affectation pour les variables, `= »?. C'est ce qu'on appelle l'opérateur d'attribution de variable conditionnelle , car il n'a qu'un effet si la variable n'est pas encore définie. Cette déclaration:

FOO ?= bar 

est exactement équivalente à ce (voir l'origine Fonction):

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

probablement CC est déjà défini comme gcc, donc CC ?= g++ ne remplacera pas la gcc existante.

5

L'opérateur ?= définit la variable que si elle est pas déjà fixé: info make* Using Variables* Setting.

0

Comme d'autres ont mentionné, il est probablement déjà prédéfini. Sur GNU, vous pouvez voir ce qui est défini avec make -p à partir d'un répertoire qui ne contient pas Makefile.

Ceci est documenté à: https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html

Habituellement, CC=cc par défaut. Ensuite, sur Ubuntu 14.04 pour, par exemple, cc est généralement un lien symbolique à gcc.

Pour désactiver toutes les variables à la fois, voir: Disable make builtin rules and variables from inside the make file Cela semble actuellement impossible.