gnu make:如何制作条件cflags

时间:2011-11-07 10:49:22

标签: mingw gnu-make

我为我的项目(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”来向我展示正确的方法?或者也许是另一种方法。

2 个答案:

答案 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(或简单的手动配置)的双树构建更可靠,即使设置有点困难。