Come passare la definizione della macro dagli argomenti della riga di comando "make" (-D) al codice sorgente C?


107

Di solito passo le definizioni delle macro da "make command line" a un "makefile" usando l'opzione: -Dname = value. La definizione è accessibile all'interno del makefile.

Passo anche le definizioni delle macro dal "makefile" al "codice sorgente" usando l'opzione simile del compilatore: -Dname = value (supportato in molti compilatori). Questa definizione è accessibile nel codice sorgente.

Ciò di cui ho bisogno ora è consentire all'utente del mio makefile di passare immediatamente definizioni di macro arbitrarie dalla riga di comando "make.exe" al "codice sorgente", senza dover modificare nulla nel makefile.

quindi l'utente può digitare: make -f mymakefile.mk -SOMEOPTION var = 5

quindi direttamente il codice main.c può vedere var:

int main()
{
  int i = var;
}

15
Perché il voto negativo? Mi sembra una domanda perfettamente legittima.
Thomas,

Risposte:


99

Chiama il makecomando in questo modo:

make CFLAGS=-Dvar=42

E assicurati di usare $(CFLAGS)nel tuo comando di compilazione nel Makefile. Come menzionato da @ jørgensen, inserire l'assegnazione della variabile dopo il makecomando sovrascriverà il CFLAGSvalore già definito nel Makefile.

In alternativa è possibile impostare -Dvar=42un'altra variabile di CFLAGSe quindi riutilizzare questa variabile CFLAGSper evitare di sovrascrivere completamente CFLAGS.


8
Non è possibile utilizzare "CFLAGS = $ (CFLAGS) -Wall"; questa sarebbe una definizione ricorsiva e make non lo consente. Potresti usare "CFLAGS: = $ (CFLAGS) -Wall" o "CFLAGS + = -Wall", ma neanche questi funzioneranno perché un'assegnazione sulla riga di comando ha una precedenza maggiore. Potresti usare "override CFLAGS + = -Wall", ma generalmente ti consigliamo di scegliere internamente variabili diverse. Gli standard di codifica GNU richiedono che CFLAGS ecc. Siano lasciate all'utente e i makefile scelgano un'altra variabile, come "local_CFLAGS = $ (CFLAGS) -Wall".
MadScientist

2
Solo per aggiungere alla nota @MadScientist, gli standard di codifica GNU affermano anche che $(CFLAGS)dovrebbe venire per ultimo, in modo che qualsiasi opzione specificata da un utente sovrascriverà qualsiasi cosa impostata internamente dal Makefile. Ciò significherebbe usare ad es local_CFLAGS = -Wall $(CFLAGS). Al contrario, se c'è qualcosa che vuoi davvero avere la precedenza, inseriscilo dopo $(CFLAGS), come nel commento di @MadScientist.
Sam

1
Come impostare più macro in questo modo?
Woody Huang

2
@ WoodyHuang per esempioCFLAGS="-Dvar1=42 -Dvar2=314"
ouah

1
CPPFLAGSpotrebbe rappresentare una misura migliore rispetto CFLAGSo CXXFLAGS: stackoverflow.com/a/53527858/2278206
PSQ

11

Usa solo una variabile specifica per questo.

$ 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

10

Chiama in questo modo

make CFLAGS=-Dvar=42

perché vuoi sovrascrivere le CFLAG del tuo Makefile, e non solo l'ambiente (che ha una priorità inferiore rispetto alle variabili Makefile).


6

A causa della scarsa reputazione, non posso commentare la risposta accettata.

Vorrei menzionare la variabile predefinita CPPFLAGS. Potrebbe rappresentare un adattamento migliore di CFLAGSo CXXFLAGS, poiché è descritto dal manuale GNU Make come:

Flag extra da dare al preprocessore C e ai programmi che lo usano (i compilatori C e Fortran).

Esempi di regole implicite incorporate che utilizzano CPPFLAGS

  • n.oviene realizzato automaticamente n.ccon una ricetta del modulo:
    • $(CC) $(CPPFLAGS) $(CFLAGS) -c
  • n.oviene realizzato automaticamente da n.cc, n.cppo n.Ccon una ricetta del modulo:
    • $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c

Si userebbe il comando make CPPFLAGS=-Dvar=123per definire la macro desiderata.

Ulteriori informazioni


1
$ cat x.mak
tutti:
    echo $ (OPZIONE)
$ make -f x.mak 'OPTION = -DPASSTOC = 42'
echo -DPASSTOC = 42
-DPASSTOC = 42

-4

Trova il file C e l'implementazione del Makefile di seguito per soddisfare le tue esigenze

foo.c

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

Makefile

all:
    gcc -DMAKE_DEFINE=11 foo.c

la domanda è passare definizioni arbitrarie dalla riga di comando make direttamente al codice sorgente C "senza modificare il makefile". Quindi ho voluto cambiare il mio makefile una volta, per consentire di fare quelle definizioni arbitrarie.
MohamedEzz

Non funziona per make. Questo è make -DMAKE_DEFINE = 11 dice opzione non valida.
Ramakrishnan Kannan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.