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

CMacrosMakefile

C Problem Overview


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 also pass macro definitions from the "makefile" to the "source code" using the similar compiler option : -Dname=value (supported in many compilers). This definition is accessible in the source code.

What I need now, is to allow the user of my makefile to be able to pass arbitrary macro definitions from the "make.exe commandline" to "source code" right away, without having to change anything in the makefile.

so the user can type : make -f mymakefile.mk -SOMEOPTION var=5

then directly the code main.c can see var :

int main()
{
  int i = var;
}

C Solutions


Solution 1 - C

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.

Solution 2 - C

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

Solution 3 - C

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

Solution 4 - C

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).

Solution 5 - C

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

Solution 6 - C

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMohamedEzzView Question on Stackoverflow
Solution 1 - CouahView Answer on Stackoverflow
Solution 2 - CMatView Answer on Stackoverflow
Solution 3 - CpsqView Answer on Stackoverflow
Solution 4 - CjørgensenView Answer on Stackoverflow
Solution 5 - CpmgView Answer on Stackoverflow
Solution 6 - Cmahendiran.bView Answer on Stackoverflow