web-dev-qa-db-fra.com

Comment passer la définition de macro de "make" arguments de ligne de commande (-D) au code source C?

Je passe généralement les définitions de macro de "make en ligne de commande" à un "makefile" en utilisant l'option: -Dname = value. La définition est accessible à l'intérieur du makefile.

Je passe également les définitions de macro du "makefile" au "code source" à l'aide de l'option de compilateur similaire: -Dname = value (prise en charge par de nombreux compilateurs). Cette définition est accessible dans le code source.

Ce dont j'ai besoin maintenant, c’est de permettre à l’utilisateur de mon makefile de pouvoir passer immédiatement des définitions de macro arbitraires de la "ligne de commande make.exe" au "code source", sans avoir à changer quoi que ce soit dans le makefile.

afin que l'utilisateur puisse taper: make -f mymakefile.mk -SOMEOPTION var = 5

alors directement le code main.c peut voir var:

int main()
{
  int i = var;
}
93
MohamedEzz

Appelez la commande make de cette façon:

make CFLAGS=-Dvar=42

Et assurez-vous d'utiliser $(CFLAGS) dans votre commande de compilation dans le Makefile. Comme @ jørgensen l'a mentionné, placer l'affectation de variable après la commande make écrasera la valeur CFLAGS déjà définie dans le Makefile.

Vous pouvez également définir -Dvar=42 Dans une autre variable que CFLAGS, puis réutiliser cette variable dans CFLAGS pour éviter de remplacer complètement CFLAGS.

88
ouah

Utilisez simplement une variable spécifique pour cela.

$ cat Makefile 
all:
    echo foo | gcc $(USER_DEFINES) -E -xc - 

$ make USER_DEFINES="-Dfoo=one"
echo foo | gcc -Dfoo=one -E -xc - 
...
one

$ make USER_DEFINES="-Dfoo=bar"
echo foo | gcc -Dfoo=bar -E -xc - 
...
bar

$ make 
echo foo | gcc  -E -xc - 
...
foo
9
Mat

Appelez make this façon

make CFLAGS=-Dvar=42

parce que vous voulez remplacer les CFLAGS de votre Makefile, et pas seulement l'environnement (qui a une priorité plus basse en ce qui concerne les variables Makefile).

9
jørgensen

En raison de la faible réputation, je ne peux pas commenter la réponse acceptée.

Je voudrais mentionner la variable prédéfinie CPPFLAGS. Cela pourrait représenter un meilleur ajustement que CFLAGS ou CXXFLAGS, car il est décrit par le manuel de GNU Make comme suit:

Drapeaux supplémentaires à donner au préprocesseur C et aux programmes qui l’utilisent (compilateurs C et Fortran).

Exemples de règles implicites intégrées utilisant CPPFLAGS

  • n.o Est créé automatiquement à partir de n.c Avec une recette de la forme suivante:
    • $(CC) $(CPPFLAGS) $(CFLAGS) -c
  • n.o Est créé automatiquement à partir de n.cc, n.cpp Ou n.C Avec une recette de la forme suivante:
    • $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c

On utiliserait la commande make CPPFLAGS=-Dvar=123 Pour définir la macro souhaitée.

Plus d'informations

3
psq
 $ cat x.mak 
 tous: 
 echo $ (OPTION) 
 $ make -f x.mak 'OPTION = -DPASSTOC = 42' 
 echo -DPASSTOC = 42 
 - DPASSTOC = 42 
1
pmg