Как передать определение макроса из аргументов командной строки "make" (-D) в исходный код C?

Я обычно передаю определения макросов из "make command line" в "makefile" с помощью опции: -Dимя = значение. Определение доступно внутри make файла.

Я также передаю макроопределения из "makefile" в "исходный код", используя аналогичную опцию компилятора: -Dname = значение (поддерживается во многих компиляторах). Это определение доступно в исходном коде.

Теперь мне нужно, чтобы пользователь моего файла make смог передать произвольные макроопределения из "make.exe commandline" в "исходный код" сразу, не изменяя ничего в make файле.

чтобы пользователь мог ввести: make -f mymakefile.mk -SOMEOPTION var = 5

то непосредственно код main.c может видеть var:

int main()
{
  int i = var;
}

Ответ 1

Вызвать make следующим образом:

make CFLAGS=-Dvar=42

И не забудьте использовать $(CFLAGS) в вашей команде компиляции в Makefile. Как отметил @jørgensen, назначение переменной после того, как команда make переопределит значение CFLAGS, уже определенное Makefile.

В качестве альтернативы вы можете установить -Dvar=42 в другую переменную, чем CFLAGS, а затем повторно использовать эту переменную в CFLAGS, чтобы избежать полного переопределения CFLAGS.

Ответ 2

Просто используйте для этого определенную переменную.

$ 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

Ответ 3

Вызвать этот способ

make CFLAGS=-Dvar=42

потому что вы хотите переопределить CFLAGS Makefile, а не только среду (которая имеет более низкий приоритет в отношении переменных Makefile).

Ответ 4

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

Ответ 5

Найти реализацию C файла и Makefile ниже в соответствии с вашими требованиями

foo.c

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

Makefile

all:
    gcc -DMAKE_DEFINE=11 foo.c