我为我的项目(MS-windows target,MinGW)启动了一个简单的makefile,其中包含以下内容:
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”来向我展示正确的方法?或者也许是另一种方法。
答案 0 :(得分:2)
为了存档解决方案并且没有回答问题,这里是最后一句话: 在Maxim's suggestion之后,我将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
答案 1 :(得分:0)
最简单的方法是简单的评论/取消注释解决方案:
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(或简单的手动配置)的双树构建更可靠,即使设置有点困难。