Добавить в 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 совсем; пытаюсь добавить (как в +=) из командной строки перезаписывает каждый экземпляр этой переменной.
Другие вопросы по тегам