我想在一个更紧凑的方式来应用下面的代码的Makefile基于目标的相关性:用通配符(紧凑型)
hello1:
@echo "Hello1"
hello2:
@echo "Hello2"
hello3:
@echo "Hello3"
hello_all: hello1 hello2 hello3
有编码hello_all
依赖使用通配符,例如的一种方式你好*什么的?
我想在一个更紧凑的方式来应用下面的代码的Makefile基于目标的相关性:用通配符(紧凑型)
hello1:
@echo "Hello1"
hello2:
@echo "Hello2"
hello3:
@echo "Hello3"
hello_all: hello1 hello2 hello3
有编码hello_all
依赖使用通配符,例如的一种方式你好*什么的?
如果您的目标非常相似,请使用@TimF的解决方案,避免重复。如果它们是不同的,不能一概而论,你可以用一个小帮手做到这一点:
hello-add = $(eval HELLO_TARGETS += $1)$1
$(call hello-add,hello1):
@echo "Hello1"
$(call hello-add,hello2):
@echo "Hello2"
$(call hello-add,hello3):
@echo "Hello3"
hello_all: $(HELLO_TARGETS)
hello-add
接受一个参数,把它添加到HELLO_TARGETS
变量,并扩展到正是这样的说法(因为eval
扩展到空)。它的行为如下:
HELLO_TARGETS += hello1
hello1:
...
但是避免了必须两次写入目标名称。
谢谢安德烈,它确实看起来很干净,但它不起作用,因为我尝试使用make hello_all时遇到以下错误:Makefile:4:*** missing separator。停止。 –
@ShaharGino您是否在不使用标签替换4空格缩进的情况下复制粘贴物? –
谢谢!它的工作原理与我的需求完全吻合! –
我不认为有这样做原生方式。在下面查找特定于您的用例的解决方案。然而,我认为它不容易以通用的方式使用。
# The number list that will be used to generate the targets
NUMBERS = 1 2 3 4
# Function that will expand to a custom helloX target, with X the number given as parameter
# Note the strip that removes the spaces in the parameter
define createHelloTargets
HELLO_TARGETS += hello$(strip $(1))
hello$(strip $(1)):
@echo Hello$(strip $(1))
endef
# Generate one Hello target for each number in NUMBERS
$(foreach nb, $(NUMBERS), $(eval $(call createHelloTargets, $(nb))))
all: $(HELLO_TARGETS)
这将输出:
Hello1
Hello2
Hello3
Hello4
的ADVA ntage是你不必写每个目标,只需填写NUMBERS变量就可以了。
基本上,这个Makefile将为在数量上的每个数字X的目标,看起来像这样:
helloX:
@echo HelloX
它还将增加helloX
到HELLO_TARGETS
这是所有现有helloX目标列表。此列表在all
目标先决条件中展开。
请发表一个真实世界的例子,答案可能会是“不”,但不可能肯定地说,除非你解释你真正想要完成的事情。 – user657267
嗨,我的目标是创建一个运行回归的单个目标,其中包含许多具有相似名称的测试。目前,每个测试都有自己的目标,我想从新的回归目标中调用所有这些目标(使用类似的名称) –
@ShaharGino您能给我们一个测试配方的例子吗?我想知道他们是否彼此不同。 –