首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >gnu make :如何制作有条件的cflag

gnu make :如何制作有条件的cflag
EN

Stack Overflow用户
提问于 2011-11-07 18:49:22
回答 2查看 3.5K关注 0票数 0

我用以下代码为我的项目(MS-windows目标,MinGW)创建了一个简单的makefile:

代码语言:javascript
运行
复制
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的变量定义和隐式规则:

代码语言:javascript
运行
复制
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“来向我展示正确的方法?或者是另一种方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-08 00:26:13

为了存档解决方案,而不是留下一个未回答的问题,这里是最后一句话:遵循Maxim's suggestion,我将我的Makefile修改为:

代码语言:javascript
运行
复制
#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
票数 3
EN

Stack Overflow用户

发布于 2011-11-07 18:57:19

最简单的方法是一个简单的注释/取消注释解决方案:

代码语言:javascript
运行
复制
CFLAGS = -std=c99
# Release
# CFLAGS += -O2 -Wall
# Debug
CFLAGS += -g -O0 -Wall

这就是automake如何进行这种类型的配置。您还可以在以下行周围使用make条件:

代码语言:javascript
运行
复制
ifeq ($(build),release)
    CFLAGS += -O2 -Wall
else
    CFLAGS += -g -O0 -Wall
endif

一般来说,要小心这类方案,因为在发布时,您绝对必须清除旧的目标文件。使用autoconf和automake (或简单的手动配置)构建的二叉树更可靠,尽管设置起来有点困难。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8035394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档