生成文件两个编译器问题



我被要求编写一个需要在两个编译器之间进行选择的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 变量为空。这使我得出结论,您只能配置一个特定于目标的变量。我说的对吗?如果没有,我不知道我做错了什么。你能帮帮我吗?

特定于目标的变量仅在构建该目标和该目标的任何先决条件时定义。您不能在整个生成文件中任意使用特定于目标的变量(因为听起来您正在尝试使用 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 $@ $^

相关内容

  • 没有找到相关文章

最新更新