Makefile两个编译器问题

时间:2011-05-09 14:45:15

标签: variables compiler-construction build makefile target

我被要求编写一个需要在两个编译器之间进行选择的Makefile,并且每个编译器都应该支持3个构建版本(调试,发布,测试)。

根据输入(编译器,编译器选项,输出目录,包含目录等),有很多变量会发生变化。我的第一个选择是通过目标特定的变量并根据目标配置变量。你认为这是个好主意吗?

我对这些变量并不十分熟悉。在我看来,如果我做这样的事情:

release: variable1=value1   #release is target
release: variable2=value2

release: 
      # some compilation rule

仅配置variable1。我是对的吗?


更新

感谢您的回复。我试图通过附加变量处理编译器选择问题,该变量将根据目标进行配置。但是,这是问题所在。我有以下几行:

release: CFLAGS = -DCORE_SW_VERSION='"$(CORE_SW_VERSION)"' -Wall 
release: CFLAGS += -fgnu89-inline -mno-volatile-cache $(INCLUDE)  
release: TARGET=release

在这一行之后,我做了一些ifeq序列,我决定使用哪个编译器(根据TARGET变量值)。 并且CFLAGS配置正确,但TARGET变量为空。这使我得出结论,您只能配置一个特定于目标的变量。我对吗?如果没有,我不知道我做错了什么。你能帮我吗?

1 个答案:

答案 0 :(得分:1)

仅在构建目标和该目标的任何先决条件时定义特定于目标的变量。您不能在整个makefile中任意使用特定于目标的变量(因为它听起来像是您尝试使用ifeq)。为此,您可能需要查看$(MAKECMDGOALS)。我不认为对特定目标变量的数量有任何限制,当然不是一个限制。

需要特定于目标的变量或$(MAKECMDGOALS)可能会警告您正在尝试强制做出不应该做的事情。

我不清楚您是否要构建三个版本(每个版本使用一个编译器进行调试/测试/发布)或六个版本。假设有三个,这里是一个unix-y Makefile,用不同的编译器和CFLAGS构建,具体取决于目标。但请注意,这可以很容易地使用RELEASE_CFLAGSRELEASE_CCDEBUG_CFLAGS等变量进行编码。

all: release debug test

release: CC=gcc
release: CFLAGS=
debug: CC=gcc
debug: CFLAGS=-g
test: CC=cc
test: CFLAGS=-Wall

.PHONY: release debug test
release: release/exe
debug: debug/exe
test: test/exe

OBJECTS := test.o

release/%.o: %.c
        $(CC) $(CLFAGS) -c -o $@ $<

debug/%.o: %.c
        $(CC) $(CLFAGS) -c -o $@ $<

test/%.o: %.c
        $(CC) $(CLFAGS) -c -o $@ $<

release/exe: $(OBJECTS:%=release/%)
        $(CC) $(CFLAGS) -o $@ $^

debug/exe: $(OBJECTS:%=debug/%)
        $(CC) $(CFLAGS) -o $@ $^

test/exe: $(OBJECTS:%=test/%)
        $(CC) $(CFLAGS) -o $@ $^