【问题标题】:change variable name based on target and export target specific variable根据目标更改变量名称并导出目标特定变量
【发布时间】:2018-03-15 23:32:48
【问题描述】:

我正在尝试构建我的二进制文件的发布和调试版本。 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

但这不是诀窍

【问题讨论】:

  • 您是否知道编写递归 Makefile 是一个非常糟糕的主意,只能在某些特殊情况下正确使用?
  • 我已经读到了。我将尝试修改我的构建系统,但在这种情况下,我的目标特定变量没有更改变量名,这可能不是与递归 make 相关的问题

标签: makefile gnu-make


【解决方案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)

我不确定这是否能解决您的全部问题——我无法解析您的第一个要点。如果没有,也许您可​​以编辑您的问题以添加一个完整的示例。

【讨论】:

  • 所以这个想法是当调试被调用时,第一个目标将不存在并且 hello_debug.bin 将被创建?这种方法将使我添加一个额外的调试目标,我希望通过更改变量 BINARY 的名称来避免这种情况,以便它反映它在 Makefile 中的使用位置
  • @rookie:我看不出更改BINARY 的值比使用明确不同的目标名称有什么好处。
  • 我添加了更多关于如何构建二进制目标的信息。简而言之,它取决于一堆其他二进制文件,在调试模式下构建时我也想更改它们的名称。当我想更改多个依赖项的名称时,我如何使用您建议的方法,例如我的 EDIT 的第一行。那不是也会在我的 Makefile 中乱扔发布和调试目标吗?我认为使用特定于目标的变量方法将是替换所有相关目标名称的一种更简洁的方法。
【解决方案2】:

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

先决条件在解析时根据全局变量的当前值(而不是特定于目标的值)进行评估。

所以,这可能是您想要的。您似乎更喜欢反复试验,而不是实际的 RTFM。恕我直言,您真的应该更多地使用 RTFM,而不是猜测功能。

BINARY:=hello

all: bin/$(BINARY).bin

BINARY := $(BINARY)_debug

debug: export DBG:=1

debug: bin/$(BINARY).bin

如果这“不起作用”,您可以在 Stack Overflow 上发布问题。

  1. 您心中有一个编程目标,并且您编写了一些代码,但它并没有按您期望的方式工作。

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

  3. 如果您有最少量的代码来重现问题,但您仍然不明白为什么您的代码不起作用,那么您在您的问题中发布完整的最小代码,以及您期望的所有细节,并且您的结果与预期不同。

【讨论】:

  • 如果我这样做,我需要复制 alldebug 的食谱。我确实编辑了我的问题,以便为我想要实现的目标添加更多背景信息。因为我有我也想更改名称的依赖项,所以这变得更加复杂,我猜。有没有更好的方法来实现它?
  • @rookie 然后按照我为您列出的步骤 2 和 3 进行操作。准确陈述您的期望并发布不符合您期望的最小完整示例。
  • 我在这里发布了一个明确的问题:stackoverflow.com/questions/49346580/…
  • @rookie 不,我不能回答另一个问题...,我回答的问题数量与提问的数量相同,我没有时间回答更多
  • @rookie 好吧好吧,以后再给我一个答案,尤其是你不接受已经存在的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多