Добавить в GNU make переменные через командную строку
Я использую GNU-make Makefile для создания проекта C с несколькими целями (all
, clean
и несколькими целевыми проектами). В процессе отладки я хотел бы добавить несколько флагов в одну сборку без постоянного редактирования Makefile (например, добавлять отладочные символы или устанавливать флаг препроцессора).
В прошлом я сделал это следующим образом (используя пример отладочных символов):
make target CFLAGS+=-g
К сожалению, это не добавление к переменной CFLAGS
, но вместо этого очистка и прекращение ее компиляции. Есть ли чистый способ сделать это, не указав какую-то фиктивную переменную, добавленную в конец CFLAGS
и LDFLAGS
?
Ответы
Ответ 1
Проверьте переопределить директиву. Вам, вероятно, придется модифицировать make файл один раз, но он должен делать то, что вы хотите.
Пример файла makefile:
override CFLAGS += -Wall
app: main.c
gcc $(CFLAGS) -o app main.c
Пример командной строки:
$ make
gcc -Wall -o app main.c
$ make CFLAGS=-g
gcc -g -Wall -o app main.c
Ответ 2
Для записи ответ @Carl Norum добавляет переменную из перспективы командной строки.
Мне нужен был способ добавить и придумать:
override CFLAGS := -Wall $(CFLAGS)
Ответ 3
Есть два способа передать переменные:
-
Используя аргументы командной строки:
make VAR=value
-
Использование среды:
export VAR=var; make
или (лучше, потому что это меняет среду только для текущей команды)
VAR=var make
Они немного разные. Первый сильнее. Это значит, что ты знаешь, чего хочешь. Второе можно считать намеком. Разница между ними заключается в операторах =
и +=
(без override
). Эти операторы игнорируются, когда переменная определяется в командной строке, но не игнорируются, когда переменная определяется в среде. Таким образом, я предлагаю вам иметь Makefile с:
CC ?= gcc
CFLAGS += -Wall
INTERNAL_VARS = value
и назовите это с:
CFLAGS=-g make
Обратите внимание, что если вы хотите снять -Wall
, вы можете использовать:
make CFLAGS=
Пожалуйста, не используйте ключевое слово override
, иначе у вас не будет никакого способа изменить переменную, затронутую override
.
Ответ 4
Просто заметьте, как я запутался - пусть это будет файл testmake
:
$(eval $(info A: CFLAGS here is $(CFLAGS)))
override CFLAGS += -B
$(eval $(info B: CFLAGS here is $(CFLAGS)))
CFLAGS += -C
$(eval $(info C: CFLAGS here is $(CFLAGS)))
override CFLAGS += -D
$(eval $(info D: CFLAGS here is $(CFLAGS)))
CFLAGS += -E
$(eval $(info E: CFLAGS here is $(CFLAGS)))
Тогда:
$ make -f testmake
A: CFLAGS here is
B: CFLAGS here is -B
C: CFLAGS here is -B
D: CFLAGS here is -B -D
E: CFLAGS here is -B -D
make: *** No targets. Stop.
$ make -f testmake CFLAGS+=-g
A: CFLAGS here is -g
B: CFLAGS here is -g -B
C: CFLAGS here is -g -B
D: CFLAGS here is -g -B -D
E: CFLAGS here is -g -B -D
make: *** No targets. Stop.
С директивами override
, удаленными из файла testmake
:
$ make -f testmake
A: CFLAGS here is
B: CFLAGS here is -B
C: CFLAGS here is -B -C
D: CFLAGS here is -B -C -D
E: CFLAGS here is -B -C -D -E
make: *** No targets. Stop.
$ make -f testmake CFLAGS+=-g
A: CFLAGS here is -g
B: CFLAGS here is -g
C: CFLAGS here is -g
D: CFLAGS here is -g
E: CFLAGS here is -g
make: *** No targets. Stop.
Итак,
- Если переменная используется
override
один раз, ее можно добавить только с помощью другого оператора с помощью override
(нормальные присваивания будут проигнорированы);
- когда не было
override
; пытаясь добавить (как в +=
) из командной строки, перезаписывает каждый экземпляр этой переменной.