Добавить в GNU make переменные через командную строку - PullRequest
55 голосов
/ 25 января 2010

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

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

make target CFLAGS+=-g

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

Ответы [ 4 ]

77 голосов
/ 25 января 2010

Ознакомьтесь с директивой переопределения .Вам, вероятно, потребуется изменить make-файл один раз, но он должен делать то, что вам нужно.

Пример make-файла:

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 
26 голосов
/ 27 февраля 2012

Для записи, ответ @Carl Norum добавляет переменную с точки зрения командной строки.

Мне нужен был способ действительно добавить и придумать:

override CFLAGS := -Wall $(CFLAGS)
16 голосов
/ 21 сентября 2015

Существует два способа передачи переменных для создания:

  • Использование аргументов командной строки:

    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.

6 голосов
/ 17 апреля 2013

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