2016-09-20 76 views
0

我想在一个更紧凑的方式来应用下面的代码的Makefile基于目标的相关性:用通配符(紧凑型)

hello1: 
    @echo "Hello1" 

hello2: 
    @echo "Hello2" 

hello3: 
    @echo "Hello3" 

hello_all: hello1 hello2 hello3 

有编码hello_all依赖使用通配符,例如的一种方式你好*什么的?

1

+0

请发表一个真实世界的例子,答案可能会是“不”,但不可能肯定地说,除非你解释你真正想要完成的事情。 – user657267

+0

嗨,我的目标是创建一个运行回归的单个目标,其中包含许多具有相似名称的测试。目前,每个测试都有自己的目标,我想从新的回归目标中调用所有这些目标(使用类似的名称) –

+0

@ShaharGino您能给我们一个测试配方的例子吗?我想知道他们是否彼此不同。 –

回答

0

如果您的目标非常相似,请使用@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: 
    ... 

但是避免了必须两次写入目标名称。

+0

谢谢安德烈,它确实看起来很干净,但它不起作用,因为我尝试使用make hello_all时遇到以下错误:Makefile:4:*** missing separator。停止。 –

+0

@ShaharGino您是否在不使用标签替换4空格缩进的情况下复制粘贴物? –

+0

谢谢!它的工作原理与我的需求完全吻合! –

0

我不认为有这样做原生方式。在下面查找特定于您的用例的解决方案。然而,我认为它不容易以通用的方式使用。

# 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 

它还将增加helloXHELLO_TARGETS这是所有现有helloX目标列表。此列表在all目标先决条件中展开。