Как передать определение макроса из аргументов командной строки «make» (-D) в исходный код C? - PullRequest
92 голосов
/ 29 января 2012

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

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

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

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

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

int main()
{
  int i = var;
}

Ответы [ 6 ]

87 голосов
/ 29 января 2012

Вызовите make команду таким образом:

make CFLAGS=-Dvar=42

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

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

9 голосов
/ 29 января 2012

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

make CFLAGS=-Dvar=42

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

9 голосов
/ 29 января 2012

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

$ 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 голосов
/ 28 ноября 2018

Из-за низкой репутации я не могу прокомментировать принятый ответ.

Я хотел бы упомянуть предопределенную переменную CPPFLAGS.Это может быть лучше, чем CFLAGS или CXXFLAGS, поскольку оно описывается в руководстве GNU Make как:

Дополнительные флаги для препроцессора C ипрограммы, которые его используют (компиляторы C и Fortran).

Примеры встроенных неявных правил, использующих CPPFLAGS

  • n.o, производится автоматически из n.c с рецептом вида:
    • $(CC) $(CPPFLAGS) $(CFLAGS) -c
  • n.o производится автоматически из n.cc, n.cpp или n.C срецепт вида:
    • $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c

Можно использовать команду make CPPFLAGS=-Dvar=123, чтобы определить нужный макрос.

Подробнее

1 голос
/ 29 января 2012
$ cat x.mak
all:
    echo $(OPTION)
$ make -f x.mak 'OPTION=-DPASSTOC=42'
echo -DPASSTOC=42
-DPASSTOC=42
0 голосов
/ 11 августа 2014

Найдите файл C и реализацию Makefile ниже, чтобы удовлетворить ваши требования

foo.c

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

Makefile

all:
    gcc -DMAKE_DEFINE=11 foo.c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...