Добавить в GNU make переменные через командную строку
Я использую GNU-make Makefile для сборки проекта C с несколькими целями (all
, clean
и несколько конкретных целей проекта). В процессе отладки я хотел бы добавить некоторые флаги в одну сборку без постоянного редактирования файла Makefile (например, добавить символы отладки или установить флаг препроцессора).
В прошлом я делал это следующим образом (на примере символов отладки):
make target CFLAGS+=-g
К сожалению, это не дополняет CFLAGS
переменная, но вместо этого, очистив его и остановив его от компиляции. Есть ли чистый способ сделать это без определения какой-то фиктивной переменной, добавленной в конец CFLAGS
а также LDFLAGS
?
4 ответа
Проверьте директиву переопределения. Вам, вероятно, нужно будет изменить 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
Для записи, ответ @Carl Norum добавляет переменную с точки зрения командной строки.
Мне нужен был способ действительно добавить и придумать:
override CFLAGS := -Wall $(CFLAGS)
Есть два способа передать переменные:
Используя аргументы командной строки:
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
,
Просто заметка, как я запутался - пусть это будет файл 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
совсем; пытаюсь добавить (как в+=
) из командной строки перезаписывает каждый экземпляр этой переменной.