GNU Make: как сделать условные флаги - PullRequest
0 голосов
/ 07 ноября 2011

Я запустил простой make-файл для моего проекта (цель MS-windows, MinGW) со следующим:

CFLAGS = -g -O0 -Wall -std=c99

CC =    gcc
CPP =   g++
LIBS =

PBDUMPER = pbdumper.exe

all: $(PBDUMPER)

$(PBDUMPER): pbdumper.c
    $(CC) $(CFLAGS) -o $@ $< $(LIBS)

clean:
    rm -f $(PBDUMPER)

.PHONY: clean

Теперь я хотел бы выбрать между выпуском и отладочной компиляцией. Я изменил определения переменных и неявное правило для отладки:

CFLAGS_COMMON = -std=c99
CFLAGS_DEBUG = -g -O0 -Wall
CFLAGS_RELEASE = -O2 -Wall
...
$(PBDUMPER): pbdumper.c
    $(CC) $(CFLAGS_COMMON) $(CFLAGS_DEBUG) -o $@ $< $(LIBS)

Но для выпуска мне пришлось бы изменить неявное правило, чтобы использовать CFLAGS_RELEASE, что, я полагаю, неправильный способ сделать. Я посмотрел руководство Gnu Make в разделах «неявные правила» и «автоматические переменные», но лучшего способа не нашел.

Не могли бы вы показать мне правильный путь, либо условно определив CFLAGS, либо, возможно, используя "if" в неявных правилах, основанных на аромате, выбранном для компиляции? Или, может быть, другой метод.

Ответы [ 2 ]

2 голосов
/ 07 ноября 2011

Для архивации решения и для того, чтобы не оставлять вопрос без ответа, вот последнее слово: следуя предложению Максима , я переработал свой Makefile как:


#debug is default, for another flavor : make BUILD=release
BUILD := debug

cflags.common := -std=c99
cflags.debug := -g -O0 -Wall
cflags.release := -O2 -Wall
CFLAGS := ${cflags.${BUILD}} ${cflags.common}
LIBS =

CC =    gcc
CPP =   g++

#executable
PBDUMPER = pbdumper.exe

all: $(PBDUMPER)

$(PBDUMPER): pbdumper.c
    $(CC) $(CFLAGS) -o $@ $< $(LIBS)

clean:
    rm -f $(PBDUMPER)

.PHONY: clean all
0 голосов
/ 07 ноября 2011

Самым простым способом было бы простое решение для комментариев / раскомментирования:

CFLAGS = -std=c99
# Release
# CFLAGS += -O2 -Wall
# Debug
CFLAGS += -g -O0 -Wall

Вот как automake выполняет этот тип конфигурации.Вы также можете использовать условное выражение make в следующих строках:

ifeq ($(build),release)
    CFLAGS += -O2 -Wall
else
    CFLAGS += -g -O0 -Wall
endif

В общем, будьте осторожны с такими схемами, потому что при выпуске вам абсолютно необходимо очистить старые объектные файлы.Сборки с двумя деревьями с помощью autoconf и automake (или простой ручной настройки) более надежны, хотя и немного сложнее в настройке.

...