鑑於Makefile中的該位:如何在僅限訂單的先決條件內調用功能?
# for pattern matching
$(OBJDIR) := build
# just to see if a level of indirection will work
my_dir = $(dir $(1))
$(OBJECTS) : $(OBJDIR)/% : $(HEADERS) $(SRCDIR)/% | % $(dir %) $(call my_dir,%)
@echo output-only = $|
這是一個static pattern rule與order-only prerequisites。
考慮目標「build/utility/debug.js」。上述規則的輸出將是這樣的:
output-only = utility/debug.js ./
- 第一組分,「實用程序/ debug.js」,被適當地從杆(%)複製。
- 第二個組件「./」是在先決條件列表中調用
dir
函數的輸出。 - 第三個組件是一個空字符串,是在先決條件列表中調用我的
my_dir
函數的輸出。
如果我改變my_dir
這樣:
my_dir = $(1)
輸出保持不變。如果我改變它:
my_dir = "foo"
然後抱怨沒有規則,使「foo」(這是預期的)。那麼,看起來$(1)
在my_dir
的調用中沒有受到約束。
發生了什麼事?爲什麼我不能將stem傳遞給函數?我有一個解決方法,使用二次擴展,但我想知道爲什麼我不能這樣寫我的規則。
編輯:我是新來的stackoverflow,原諒我,如果這不是事情在這裏完成的方式。正如Alex指出的那樣,我想把$(1)作爲參數傳遞給my_dir
。
我不知道爲什麼有人建議我要「$」。我不相信$在任何情況下都會擴展到任何事物。
我知道自動變量只在配方中可用。我在前提條件中沒有使用自動變量 - 我正在使用幹線:
每個目標都與目標模式相匹配,以提取名爲stem的目標名稱的一部分。將該詞幹代入每個prereq-patterns中以製作先決條件名稱(每個prereq-pattern中有一個)。 - the manual
的幹可通過例子證明的事實:單獨使用時,而不是在傳遞給函數的莖擴展到正確的值。
感嘆,okay.jpg。 :/ – 2012-03-02 15:36:54