Як передати визначення макросу з аргументів командного рядка «make» (-D) до вихідного коду C?


107

Зазвичай я передаю визначення макросу з "make command line" в "makefile", використовуючи параметр: -Dname = значення. Визначення доступне всередині makefile.

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

Що мені зараз потрібно - це дозволити користувачеві мого makefile мати можливість передавати довільні макроозначення з командної лінії "make.exe" до "вихідного коду", не змінюючи нічого в makefile.

тож користувач може набрати: make -f mymakefile.mk -SOMEOPTION var = 5

то безпосередньо код main.c може побачити var:

int main()
{
  int i = var;
}

15
Чому потік? Мені це здається цілком законним питанням.
Томас

Відповіді:


99

Виклик makeкоманди таким чином:

make CFLAGS=-Dvar=42

І обов’язково використовуйте $(CFLAGS)в команді компіляції в Makefile. Як зазначав @ jørgensen, призначення присвоєння змінної після makeкоманди замінить CFLAGSзначення, вже визначене Makefile.

Крім того, ви можете встановити -Dvar=42іншу змінну, CFLAGSа потім повторно використовувати цю змінну, CFLAGSщоб уникнути повного переосмислення CFLAGS.


8
Ви не можете використовувати "CFLAGS = $ (CFLAGS) -Wall"; це було б рекурсивним визначенням і робити це не дозволяє. Ви можете використовувати "CFLAGS: = $ (CFLAGS) -Wall", або "CFLAGS + = -Wall", але вони також не працюватимуть, оскільки призначення в командному рядку має перевагу. Ви можете використовувати "переосмислити CFLAGS + = -Wall", але загалом ми радимо просто обирати різні змінні внутрішньо. Стандарти кодування GNU вимагають, щоб користувач залишав CFLAGS тощо, а файли вибирають іншу змінну, наприклад "local_CFLAGS = $ (CFLAGS) -Wall".
MadScientist

2
Для додання до @MadScientist примітки, у стандартах кодування GNU також зазначено, що $(CFLAGS)останніми повинні бути останні, так що будь-які параметри, визначені користувачем, перевершать все, що встановлено Makefile внутрішньо. Це означатиме використання напр local_CFLAGS = -Wall $(CFLAGS). І навпаки, якщо є щось, що ви дійсно хочете мати перевагу, поставте це після $(CFLAGS), як у коментарі @MadScientist.
Сем

1
Як за допомогою цього встановити кілька макросів?
Вуді Хуан

2
@WoodyHuang наприкладCFLAGS="-Dvar1=42 -Dvar2=314"
оуа

1
CPPFLAGSможе являти собою кращу підгонку ніж CFLAGSабо CXXFLAGS: stackoverflow.com/a/53527858/2278206
PSQ

11

Просто використовуйте для цього певну змінну.

$ 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

10

Телефонуйте таким чином

make CFLAGS=-Dvar=42

тому що ви хочете замінити CFLAGS вашого Makefile, а не лише середовище (яке має нижчий пріоритет щодо змінних Makefile).


6

Через низьку репутацію я не можу коментувати прийняту відповідь.

Хотілося б згадати попередньо визначену змінну 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
$ cat x.mak
всі:
    echo $ (ВАРІАНТ)
$ make -f x.mak 'OPTION = -DPASSTOC = 42'
ехо -DPASSTOC = 42
-DPASSTOC = 42

-4

Знайдіть файл C та реалізацію Makefile нижче, щоб відповідати вашим вимогам

foo.c

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

Makefilefile

all:
    gcc -DMAKE_DEFINE=11 foo.c

питання полягає в тому, щоб передати довільні визначення з командного рядка make безпосередньо до вихідного коду C "без зміни makefile". Тому я хотів один раз змінити свій makefile, щоб дозволити робити ці довільні визначення.
MohamedEzz

Не працює для виготовлення. Тобто make -DMAKE_DEFINE = 11 каже недійсний варіант.
Рамакришнан Каннан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.