Substituant " CC " et " CXX` des variables dans les fichiers makefile
J'ai un master makefile, qui contient les réglages générique, et un enfant makefile qui a des paramètres spécifiques d'un projet.
À partir de mon autre question à propos de la redéfinition de variables dans un fichier makefile, j'ai appris que je peux utiliser le code suivant dans mon maître makefile:
CC ?= avr-gcc
CXX ?= avr-g++
De l'enfant makefile, j'utilise colorgcc et remplacer ces variables:
CC ?= color-avr-gcc
CXX ?= color-avr-g++
Tout fonctionne.
Mais, si je supprime les lignes ci-dessus à partir de mon enfant makefile, faire commence à utiliser gcc
et g++
au lieu de avr-gcc
et avr-g++
.
Je suppose que les deux CC
et CXX
sont traités différemment, et ils sont fournis avec des valeurs par défaut à faire et je ne suis pas en mesure d'attribuer des valeurs par défaut à l'aide des instructions suivantes:
CC ?= avr-gcc
CXX ?= avr-g++
Mes questions:
- Est mon hypothèse est correcte?
- Si oui, est-il un autre moyen de fournir des valeurs par défaut pour
CC
etCXX
dans le maître makefile et le laisser faire de l'utiliser, si je n'ai pas les substituer à l'enfant makefile?
Modifier:
Comme par Chrono Kitsunela suggestion, je n'ai la suite
maître makefile
CC = avr-gcc
CXX = avr-g++
# Add other master macros here.
# Add other master targets here.
enfant makefile
CC ?= color-avr-gcc
CXX ?= color-avr-g++
# There are no child macros or targets
include master.mk
Malheureusement, cela n'a pas fonctionné. Quand je lance make child.mk
il est de ramasser le CC
et CXX
défini dans le maître.
PS: BTW, mon maître makefile est un makefile pour Arduino et le code source complet est disponible dans github.
?=
définit la variable SSI il n'est pas déjà défini. Donc, c'est l'opposé de "substitution" d'une variable; il est explicitement ne PAS remplacer la valeur d'une variable si elle est déjà définie. Si vous souhaitez remplacer vous devez utiliser seulement=
, pas?=
.
Vous devez vous connecter pour publier un commentaire.
Diviser votre maître makefile en deux fichiers: master.les macros et le maître.les cibles. L' .les macros du fichier contiendra toutes les macros comme CC et CXX, et la .objectifs fichier contiendra les objectifs réels de faire.
Enfant makefile:
maître.macros:
maître.objectifs:
Si vous définissez des CC sur la ligne de commande, l'ensemble du projet sera de l'utiliser. Sinon, si le CC est définie dans l'enfant makefile, l'ensemble du projet que CC. Si ni est utilisé, l'ensemble du projet s'appuiera sur les CC macro en maître.les macros.
Si vous avez besoin de quelque chose de plus compliqué, comme un autre CC étant utilisé dans la construction maître d'objectifs seulement, vous souhaitez utiliser un autre CC variable comme MASTER_CC que la valeur par défaut est $(CC), mais vous pouvez la remplacer si nécessaire au moyen d'une ligne de commande comme
make MASTER_CC=avr-gcc
si vous ne souhaitez pas utiliser quoi que CC est dans l'enfant makefile. Vous souhaitez utiliser le ?= cession, et toutes les règles doivent être explicites et vous remplacer $(CC) dans une règle de $(MASTER_CC) de cours:maître.macros:
Il va utiliser la couleur-avr-gcc par exemple si c'est la valeur de CC. Sinon, vous auriez besoin d'utiliser
make MASTER_CC=avr-gcc
à utiliser avr-gcc au lieu. Je n'ai pas testé ce dernier, ce sont probablement des bugs, mais j'imagine que la première solution est ce qu'il vous faut: diviser le maître makefile en deux fichiers, et utiliserCC ?= ...
dans la partie contenant les maîtres de macros et de l'enfant makefile.Après le débogage à l'aide de la origine fonction, j'ai enfin fait de travailler avec la combinaison suivante.
Maître makefile
Enfant makefile
Maintenant, quand je ne
make child.mk
il ramassecolor-avr-gcc
. Et si je l'observation de l'enfant dans le makefile, puis il utiliseavr-gcc
de maître makefile.