134 votes

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

J'ai l'habitude de passer des définitions de macros à partir de "faire de la ligne de commande" à un "makefile" à l'aide de l'option : -Dname=valeur. La définition est accessible à l'intérieur du makefile.

Je passe également les définitions de macros à partir de la "makefile" pour le "code source" à l'aide de la même option de compilateur : -Dname=valeur (pris en charge dans 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 pour être en mesure de passer à l'arbitraire des définitions de macros à partir de l' "make.exe ligne de commande" à la "source code" tout de suite, sans avoir à changer quoi que ce soit dans le makefile.

de sorte que l'utilisateur peut taper : make-f mymakefile.mk -SOMEOPTION var=5

puis directement le code principal.c peut voir var :

int main()
{
  int i = var;
}

130voto

ouah Points 75311

Appelez make commande de cette façon:

make CFLAGS=-Dvar=42

Et assurez-vous d'utiliser $(CFLAGS) de votre commande compile dans le Makefile. Comme @jørgensen mentionné , en mettant l'affectation de variable après l' make commande va se substituer à l' CFLAGS de la valeur déjà définie, le fichier Makefile.

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

15voto

Mat Points 104488

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
 

10voto

jørgensen Points 5370

Appeler faire de cette 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).

1voto

pmg Points 52636
$ cat x.mak
tout:
    echo $ (OPTION)
$ make -f x.mak 'OPTION = -DPASSTOC = 42'
echo -DPASSTOC = 42
-DPASSTOC = 42

-3voto

mahendiran.b Points 922

Trouvez ci-dessous l'implémentation du fichier C et du Makefile pour répondre à vos exigences.

foo.c

  main ()
    {
        int a = MAKE_DEFINE;
        printf ("MAKE_DEFINE value:%d\n", a);
    }
 

Makefile

 all:
    gcc -DMAKE_DEFINE=11 foo.c
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X