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 $@
注意call
returns一个字符串。要使该字符串成为 makefile 的一部分,需要 eval
。
我试图在单个 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 $@
注意call
returns一个字符串。要使该字符串成为 makefile 的一部分,需要 eval
。