Подтвердить что ты не робот

Добавить в GNU make переменные через командную строку

Я использую GNU-make Makefile для создания проекта C с несколькими целями (all, clean и несколькими целевыми проектами). В процессе отладки я хотел бы добавить несколько флагов в одну сборку без постоянного редактирования Makefile (например, добавлять отладочные символы или устанавливать флаг препроцессора).

В прошлом я сделал это следующим образом (используя пример отладочных символов):

make target CFLAGS+=-g

К сожалению, это не добавление к переменной CFLAGS, но вместо этого очистка и прекращение ее компиляции. Есть ли чистый способ сделать это, не указав какую-то фиктивную переменную, добавленную в конец CFLAGS и LDFLAGS?

4b9b3361

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