Как передать определение макроса из аргументов командной строки "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