根据目标和导出目标特定变量更改变量名称

时间:2018-03-15 23:32:49

标签: makefile gnu-make

我正在尝试构建二进制文件的发布和调试版本。 all正在构建发布版本,该版本正常运行。我想添加一个make debug来更改我的二进制名称,并使用一组不同的标志进行编译。为此,我在我的顶级Makefile中使用目标特定变量。

BINARY=hello

debug: DBG:=1
debug: $(BINARY)+=_debug
export DBG

debug: bin/$(BINARY).bin
all: bin/$(BINARY).bin

$(BINARY).bin有自己的一套规则,适用于发布部分,因为它是我之前唯一的目标。添加调试目标后,我希望,

  • DBG变量被导出,因此我的递归Makefile可以选择它来更改编译标志,我认为它正在工作

  • 二进制名称会更改,附加_debug不是。不确定我做错了什么。

编辑:

添加有关如何构建bin目标的更多信息。我的bin/$(BINARY).bin目标取决于一些.img和其他.bin文件,其目标名称我也想根据我是构建版本还是调试来更改。

bin/$(BINARY).bin: bin/$(SOME_IMAGE).img bin/$(BINARY_1).bin 
                  .....

bin/$(SOME_IMAGE).img: bin/$(BINARY_2).bin
                     ......

bin/$(BINARY_1).bin: bin/$(BINARY_1).hex
                   ......

bin/$(BINARY_1).hex:
                   $(MAKE) -C some-dir

bin/$(BINARY_2).bin: bin/$(BINARY_2).hex
                   ......

bin/$(BINARY_2).hex:
                   $(MAKE) -C some-other-dir

构建调试,我正在尝试:

debug: export DBG:=1
debug: $(BINARY)+=_debug
debug: $(SOME_IMG)+=_debug
debug: $(BINARY_1)+=_debug
debug: $(BINARY_2)+=_debug

但是这并没有做到这一点

2 个答案:

答案 0 :(得分:1)

这大致是我如何处理这个问题:

BINARY=hello

all: bin/$(BINARY).bin

debug: DBG:=1
debug: bin/$(BINARY)_debug.bin

bin/$(BINARY).bin bin/$(BINARY)_debug.bin:
    @echo building $@, flag is $(DBG)

我不确定这会解决你的整个问题 - 我无法解析你的第一个要点。如果没有,也许你可以编辑你的问题来添加一个完整的例子。

答案 1 :(得分:1)

特定于目标的变量的值仅在目标的配方中可用,而不是在目标的先决条件中可用。当您通过递增全局变量来创建特定于目标的变量时,您现在有两个变量,一个是全局变量,一个是特定于目标的变量。是的,您可以使用export属性将特定于目标的变量导出到子制动中的先决条件。 (所有这些都来自手册,关于目标特定变量的部分。)。

先决条件在分析时从全局变量的当前值(而不是从特定于目标的变量)开始计算。

所以,这是你可能想要的。您似乎更喜欢试错,实际上是RTFM。恕我直言,你应该更多的RTFM,而不是猜测功能。

BINARY:=hello

all: bin/$(BINARY).bin

BINARY := $(BINARY)_debug

debug: export DBG:=1

debug: bin/$(BINARY).bin

如果这"不起作用",以下是您在Stack Overflow上发布问题的方法。

  1. 您有一个编程目标,并且您编写了一些代码,但它并不像您期望的那样工作。

  2. 您可以使代码越来越小,以搜索问题的原因。

  3. 如果您有最少量的代码可以重现问题,而您仍然不明白为什么代码不起作用,那么您在问题中发布完整的最小代码,以及你的期望,你的结果不同于期望。