How to pass macro definition from “make” command line arguments (-D) to C source code?

前端 未结 6 1879
醉话见心
醉话见心 2020-12-04 07:40

I usually pass macro definitions from \"make command line\" to a \"makefile\" using the option : -Dname=value. The definition is accessible inside the makefile.

I al

相关标签:
6条回答
  • 2020-12-04 08:14
    $ cat x.mak
    all:
        echo $(OPTION)
    $ make -f x.mak 'OPTION=-DPASSTOC=42'
    echo -DPASSTOC=42
    -DPASSTOC=42
    
    0 讨论(0)
  • 2020-12-04 08:14

    Find the C file and Makefile implementation in below to meet your requirements

    foo.c

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

    Makefile

    all:
        gcc -DMAKE_DEFINE=11 foo.c
    
    0 讨论(0)
  • 2020-12-04 08:15

    Call make this way

    make CFLAGS=-Dvar=42
    

    because you do want to override your Makefile's CFLAGS, and not just the environment (which has a lower priority with regard to Makefile variables).

    0 讨论(0)
  • 2020-12-04 08:17

    Call make command this way:

    make CFLAGS=-Dvar=42
    

    And be sure to use $(CFLAGS) in your compile command in the Makefile. As @jørgensen mentioned , putting the variable assignment after the make command will override the CFLAGS value already defined the Makefile.

    Alternatively you could set -Dvar=42 in another variable than CFLAGS and then reuse this variable in CFLAGS to avoid completely overriding CFLAGS.

    0 讨论(0)
  • 2020-12-04 08:19

    Just use a specific variable for that.

    $ 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
    
    0 讨论(0)
  • 2020-12-04 08:29

    Because of low reputation, I cannot comment the accepted answer.

    I would like to mention the predefined variable CPPFLAGS. It might represent a better fit than CFLAGS or CXXFLAGS, since it is described by the GNU Make manual as:

    Extra flags to give to the C preprocessor and programs that use it (the C and Fortran compilers).

    Examples of built-in implicit rules that use CPPFLAGS

    • n.o is made automatically from n.c with a recipe of the form:
      • $(CC) $(CPPFLAGS) $(CFLAGS) -c
    • n.o is made automatically from n.cc, n.cpp, or n.C with a recipe of the form:
      • $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c

    One would use the command make CPPFLAGS=-Dvar=123 to define the desired macro.

    More info

    • Variables Used by Implicit Rules
    • Catalogue of Built-In Rules
    0 讨论(0)
提交回复
热议问题