Makefile 根据目标更改变量名并导出特定于目标的变量

Makefile 根据目标更改变量名并导出特定于目标的变量,makefile,gnu-make,Makefile,Gnu Make,我正在尝试构建二进制文件的发布和调试版本全部正在构建版本,该版本运行正常。我想添加一个makedebug来更改我的二进制名称,并使用一组不同的标志进行编译。为了做到这一点,我在我的顶级Makefile中使用了特定于目标的变量 BINARY=hello debug: DBG:=1 debug: $(BINARY)+=_debug export DBG debug: bin/$(BINARY).bin all: bin/$(BINARY).bin $(BINARY.bin有自己的一套规则,可以

我正在尝试构建二进制文件的发布和调试版本<代码>全部正在构建版本,该版本运行正常。我想添加一个
makedebug
来更改我的二进制名称,并使用一组不同的标志进行编译。为了做到这一点,我在我的顶级Makefile中使用了特定于目标的变量

BINARY=hello

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

debug: bin/$(BINARY).bin
all: bin/$(BINARY).bin
$(BINARY.bin
有自己的一套规则,可以很好地用于发布部分,因为它是我以前唯一的目标。添加调试目标后,我希望

  • 导出
    DBG
    变量,这样我的递归Makefile就可以选择它来更改编译标志,我认为这是可行的

  • 二进制名称会更改,并追加它未添加的
    \u debug
    。我不知道我做错了什么

编辑:

添加有关如何构建my
bin
目标的更多信息。我的
bin/$(二进制).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

但这并不是解决问题的办法

这大概就是我解决问题的方法:

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)

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

这大致就是我解决问题的方法:

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)

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

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

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

这就是你可能想要的。与RTFM相比,您似乎更喜欢尝试和错误。嗯,你真的应该多做RTFM,而不是猜测功能

BINARY:=hello

all: bin/$(BINARY).bin

BINARY := $(BINARY)_debug

debug: export DBG:=1

debug: bin/$(BINARY).bin
如果这个“不起作用”,下面是关于堆栈溢出的问题

  • 你脑子里有一个编程目标,你写了一些代码,但它并没有按照你期望的方式工作

  • 您将代码变得越来越小,以查找问题的原因

  • 如果你有最小数量的代码来重现问题,但你仍然不明白为什么你的代码不起作用,那么你可以在你的问题中发布完整的最小代码,以及你期望的所有细节,以及与期望不同的结果


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

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

    这就是你可能想要的。与RTFM相比,您似乎更喜欢尝试和错误。嗯,你真的应该多做RTFM,而不是猜测功能

    BINARY:=hello
    
    all: bin/$(BINARY).bin
    
    BINARY := $(BINARY)_debug
    
    debug: export DBG:=1
    
    debug: bin/$(BINARY).bin
    
    如果这个“不起作用”,下面是关于堆栈溢出的问题

  • 你脑子里有一个编程目标,你写了一些代码,但它并没有按照你期望的方式工作

  • 您将代码变得越来越小,以查找问题的原因

  • 如果你有最小数量的代码来重现问题,但你仍然不明白为什么你的代码不起作用,那么你可以在你的问题中发布完整的最小代码,以及你期望的所有细节,以及与期望不同的结果


  • 您是否知道编写递归makefile是一个非常糟糕的主意,只在某些特殊情况下正确使用?我已经读过这方面的内容。我将尝试修改我的构建系统,但在这种情况下,我的目标特定变量没有更改变量名,这可能不是与递归生成相关的问题。您是否知道编写递归生成文件是一个非常糟糕的主意,仅在某些特殊情况下正确使用?我已经阅读了相关内容。我将尝试修改我的构建系统,但在这种情况下,我的目标特定变量没有更改变量名称,这可能不是与递归生成相关的问题,因此,这样做的想法是,当调用debug时,第一个目标将不存在,并且将生成hello_debug.bin?这种方法会让我添加一个额外的调试目标,我希望通过更改变量BINARY的名称来避免这种情况,以便它反映出在Makefile@rookie:我不认为更改
    BINARY
    的值比使用显式不同的目标名称有什么好处。我添加了一些关于如何构建二进制目标的更多信息。简而言之,它依赖于一堆其他二进制文件,在调试模式下构建时,我也想更改这些二进制文件的名称。当有多个依赖项的名称我想更改时(如编辑的第一行),如何使用您建议的方法。这不也会在我的Makefile中添加发布和调试目标吗?我认为使用特定于目标的变量方法可以更干净地替换所有相关的目标名称