首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在同一个makefile中配置不同的版本

在同一个makefile中配置不同的版本
EN

Stack Overflow用户
提问于 2015-09-03 19:22:20
回答 1查看 122关注 0票数 1

我想使用相同的make文件生成几个构建。几个构建,我指的是windows-releasewindows-debuglinux-releaselinux-debug等等。我的想法是根据正在运行的构建设置变量,如下所示:

代码语言:javascript
复制
windows-release:
    CC:=...
    CFLAGS:=...
    OUTDIR:=windows/release
    OBJDIR:=$(OUTDIR)/obj
    EXECUTABLE:=$(OUTDIR)/exe
    # Would call $(EXECUTABLE) here, but it's not procedural

然后有规则来制定实际的构建:

代码语言:javascript
复制
# This will generate a static library
$(EXECUTABLE): $(OBJECTS)
    $(AR) $(ARFLAGS) $(ARLIB) $(OBJECTS)

$(OBJDIR)/%.o: src/%.cpp
    $(CC) $(CFLAGS) $< -o $@

对于这个不完整的例子我很抱歉,但是我还没有一个makefile,我现在只是在写它。

我能用makefile做这个吗?用剧本代替我更好吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-03 19:36:23

你绝对可以做到的。您需要的三件事情是目标 (所以make不认为windows-release等是真实的文件)、特定目标变量值 (因此您可以根据目标运行的不同来设置变量)和二次膨胀,因为否则对先决条件的评估是在特定目标上下文之外进行的,这样目标特定的变量就无法工作)。

这让你得到了这样的东西:

代码语言:javascript
复制
windows-release: CC:=...
windows-release: CFLAGS:=...
windows-release: OUTDIR:=windows/release
windows-release: OBJDIR:=$(OUTDIR)/obj
windows-release: EXECUTABLE:=$(OUTDIR)/exe

windows-debug: CC:=...
windows-debug: CFLAGS:=...
windows-debug: OUTDIR:=windows/debug
windows-debug: OBJDIR:=$(OUTDIR)/obj
windows-debug: EXECUTABLE:=$(OUTDIR)/exe

linux-release: CC:=...
linux-release: CFLAGS:=...
linux-release: OUTDIR:=linux/release
linux-release: OBJDIR:=$(OUTDIR)/obj
linux-release: EXECUTABLE:=$(OUTDIR)/bin

linux-debug: CC:=...
linux-debug: CFLAGS:=...
linux-debug: OUTDIR:=linux/debug
linux-debug: OBJDIR:=$(OUTDIR)/obj
linux-debug: EXECUTABLE:=$(OUTDIR)/bin

.SECONDEXPANSION:
windows-release windows-debug linux-release linux-debug: $$(EXECUTABLE)

尽管如此,您也可以使用普通的全局变量和条件来代替:

代码语言:javascript
复制
ifeq (windows-release,$(filter windows-release,$(MAKECMDGOALS)))
    CC:=...
    CFLAGS:=...
    OUTDIR:=windows/release
    OBJDIR:=$(OUTDIR)/obj
    EXECUTABLE:=$(OUTDIR)/exe
else ifeq (windows-debug,$(filter windows-debug,$(MAKECMDGOALS)))
    CC:=...
    CFLAGS:=...
    OUTDIR:=windows/debug
    OBJDIR:=$(OUTDIR)/obj
    EXECUTABLE:=$(OUTDIR)/exe
else ifeq (linux-release,$(filter linux-release,$(MAKECMDGOALS)))
    CC:=...
    CFLAGS:=...
    OUTDIR:=linux/release
    OBJDIR:=$(OUTDIR)/obj
    EXECUTABLE:=$(OUTDIR)/bin
else ifeq (linux-debug,$(filter linux-debug,$(MAKECMDGOALS)))
    CC:=...
    CFLAGS:=...
    OUTDIR:=linux/debug
    OBJDIR:=$(OUTDIR)/obj
    EXECUTABLE:=$(OUTDIR)/bin
endif

windows-release windows-debug linux-release linux-debug: $(EXECUTABLE)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32383848

复制
相关文章

相似问题

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