我想在一個更緊湊的方式來應用下面的代碼的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您能給我們一個測試配方的例子嗎?我想知道他們是否彼此不同。 –