У меня есть следующий make-файл для моего проекта, и я хотел бы настроить его для выпуска и отладки. В моем коде у меня много #ifdef DEBUG
макросов, так что просто нужно установить этот макрос и добавить -g3 -gdwarf2
флаги в компиляторы. Как я могу это сделать?
$(CC) = g++ -g3 -gdwarf2
$(cc) = gcc -g3 -gdwarf2
all: executable
executable: CommandParser.tab.o CommandParser.yy.o Command.o
g++ -g -o output CommandParser.yy.o CommandParser.tab.o Command.o -lfl
CommandParser.yy.o: CommandParser.l
flex -o CommandParser.yy.c CommandParser.l
gcc -g -c CommandParser.yy.c
CommandParser.tab.o: CommandParser.y
bison -d CommandParser.y
g++ -g -c CommandParser.tab.c
Command.o: Command.cpp
g++ -g -c Command.cpp
clean:
rm -f CommandParser.tab.* CommandParser.yy.* output *.o
Просто чтобы уточнить, когда я говорю о выпуске / отладке, я хочу иметь возможность просто набрать make
и получить сборку релиза или make debug
получить отладочную сборку, не комментируя вручную вещи в make-файле.
.PHONY
Ответы:
Вы можете использовать целевые значения переменных . Пример:
Не забудьте использовать $ (CXX) или $ (CC) во всех ваших командах компиляции.
Тогда у 'make debug' будут дополнительные флаги, такие как -DDEBUG и -g, где как у 'make' не будет.
Кстати, вы можете сделать ваш Makefile более кратким, как предлагали другие посты.
источник
Этот вопрос часто возникал при поиске аналогичной проблемы, поэтому я считаю, что полностью реализованное решение является оправданным. Тем более, что я (и я предполагаю, что другие) изо всех сил пытались соединить все различные ответы вместе.
Ниже приведен пример Makefile, который поддерживает несколько типов сборки в отдельных каталогах. В приведенном примере показаны сборки отладки и выпуска.
Поддерживает ...
источник
src
, измените строкуSRCS = file1.c file2.c file3.c file4.c
для чтенияSRCS = src/file1.c src/file2.c src/file3.c src/file4.c
.Если при конфигурировании релиза / сборки вы имеете в виду, что вам нужен только один конфиг для каждого make-файла, то это просто вопрос, отделяющий CC и CFLAGS:
В зависимости от того, можете ли вы использовать gnu makefile, вы можете использовать условные выражения, чтобы сделать это немного интереснее, и управлять им из командной строки:
а затем используйте:
Если вам нужно управлять обеими конфигурациями одновременно, я думаю, что лучше иметь каталоги сборки и один каталог / config сборки.
источник
ifeq (DEBUG, 1)
) для меня,DEBUG
переменная нуждался , завернутые в скобках следующим образом:ifeq ($(DEBUG), 1)
.Обратите внимание, что вы также можете сделать ваш Makefile более простым, в то же время:
Теперь вам не нужно повторять имена файлов повсюду. Любые файлы .l будут передаваться через flex и gcc, любые файлы .y будут передаваться через bison и g ++, а любые файлы .cpp - только через g ++.
Просто перечислите .o файлы, которые вы ожидаете получить, и Make выполнит работу, чтобы выяснить, какие правила могут удовлетворить потребности ...
Для записи:
$@
Имя целевого файла (перед двоеточием)$<
Имя первого (или единственного) файла предварительных требований (первого после двоеточия)$^
Имена всех необходимых файлов (через пробел)$*
Ствол (бит, который соответствует%
шаблону в определении правила.источник
$^
это для всех необходимых файлов.вы можете иметь переменную
тогда вы можете использовать условное утверждение
источник
Завершение ответов ранее ... Вам нужно ссылаться на переменные, которые вы определяете информацию в ваших командах ...
источник
ifeq (DEBUG, 1)
должен быть отмеченifeq ($(DEBUG), 1)
. Я предполагаю, что это могло относиться к вашему ответу здесь.Вы также можете добавить что-то простое в ваш Makefile, например:
Затем скомпилируйте его для отладки
make DEBUG=1
источник