GNU Make:如何在单个 define..endef 块中设置两个或多个依赖目标?

GNU Make: how can I set up two or more dependency targets within a single define..endef block?

我试图在单个 GNU Make define..endef 块中设置多个依赖项,但我一点运气都没有。如果我将问题简化为基本形式,我的目标是最终的 makefile 如下所示:

all:    CPU1    CPU2

CPU1: Build_CPU1

CPU2: Build_CPU2

Build_CPU1:
    @echo Building CPU #1

Build_CPU2:
    @echo Building CPU #2

如果我尝试将两个中间依赖项放在 define..endef 块中,问题就来了:

all:    CPU1    CPU2

define DoBuild =
CPU1:   Build_CPU1



CPU2:   Build_CPU2



endef

$(call DoBuild)

Build_CPU1:
    @echo Building CPU #1

Build_CPU2:
    @echo Building CPU #2

如果我在 define..endef 块中的两个 :-dependency 行(即 "CPU1: Build_CPU1" 和 "CPU2: Build_CPU2")中的每一个之后放置一个新行,GNU Make 会抱怨“***目标模式不包含“%””。但是,如果我在两个依赖项之后添加 space-then-newline,该错误消息就会消失。

但是,在使用 space-then-newline 跟随两个依赖行之后,GNU Make 抱怨“*** 多目标模式”。

我很确定这里发生的是 GNU Make 将 define..endef 块的所有行折叠成一行:而且,当然,你不能在单个行上有多个冒号线.

根据 GNU Make 手册 6.8 ("Defining Multi-Line Variables"),您应该能够通过使用两个换行符在 define..endef 块中强制换行。然而,这个问题似乎是这最终定义了一个变量,因此被解析为好像它是一行,即使它包含换行符。这就是(我认为)为什么它将两个依赖项折叠成一行(将两个冒号放在一行中),所以我基本上没有想法。 :-(

是否有任何方法可以说服 GNU Make 在单个 define..endef 块中定义两个或多个依赖目标?

PS: 我正在使用 GNU Make 4.2.1

以下是一个工作示例:

all: CPU1 CPU2

define DoBuild # No equal sign is needed.
CPU1: Build_CPU1
    @echo $$@
CPU2: Build_CPU2
    @echo $$@
endef

$(eval $(call DoBuild)) # Use eval.

Build_CPU1:
    @echo $@

Build_CPU2:
    @echo $@

注意callreturns一个字符串。要使该字符串成为 makefile 的一部分,需要 eval