我用以下代码为我的项目(MS-windows目标,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现在我想在发布和调试编译之间进行选择。我已经更改了debug的变量定义和隐式规则:
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“来向我展示正确的方法?或者是另一种方法。
发布于 2011-11-08 00:26:13
为了存档解决方案,而不是留下一个未回答的问题,这里是最后一句话:遵循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发布于 2011-11-07 18:57:19
最简单的方法是一个简单的注释/取消注释解决方案:
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 (或简单的手动配置)构建的二叉树更可靠,尽管设置起来有点困难。
https://stackoverflow.com/questions/8035394
复制相似问题