我想使用相同的make文件生成几个构建。几个构建,我指的是windows-release、windows-debug、linux-release、linux-debug等等。我的想法是根据正在运行的构建设置变量,如下所示:
windows-release:
CC:=...
CFLAGS:=...
OUTDIR:=windows/release
OBJDIR:=$(OUTDIR)/obj
EXECUTABLE:=$(OUTDIR)/exe
# Would call $(EXECUTABLE) here, but it's not procedural然后有规则来制定实际的构建:
# This will generate a static library
$(EXECUTABLE): $(OBJECTS)
$(AR) $(ARFLAGS) $(ARLIB) $(OBJECTS)
$(OBJDIR)/%.o: src/%.cpp
$(CC) $(CFLAGS) $< -o $@对于这个不完整的例子我很抱歉,但是我还没有一个makefile,我现在只是在写它。
我能用makefile做这个吗?用剧本代替我更好吗?
发布于 2015-09-03 19:36:23
你绝对可以做到的。您需要的三件事情是目标 (所以make不认为windows-release等是真实的文件)、特定目标变量值 (因此您可以根据目标运行的不同来设置变量)和二次膨胀,因为否则对先决条件的评估是在特定目标上下文之外进行的,这样目标特定的变量就无法工作)。
这让你得到了这样的东西:
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)尽管如此,您也可以使用普通的全局变量和条件来代替:
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)https://stackoverflow.com/questions/32383848
复制相似问题