2016-09-20 150 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目標先決條件中展開。