是的,靜態模式規則和隱式模式規則都可以具有多個先決條件,其中包含對模式主幹的引用%
。
隱式模式規則不同於靜態模式規則或普通的非模式規則,因爲它們只適用於沒有先決條件(「無條件地做這件事」)或其他先決條件存在的情況。
也就是說,如果需要構建的目標,如sip84fp.sas7bdat
需要更新,那麼模式規則%.sas7bdat: %.sas %.dat
的確是候選者。但會進行檢查:將sip84fp
閥杆插入前提條紋圖案中以生成sip84fp.sas sip84fp.dat
。這兩者都必須存在。如果它們不存在,則將該規則從考慮中移除,並且搜索繼續進行其他規則。
這就是爲什麼最後你會得到一條關於「無規則」的消息:它確實意味着在忽略所有不適用的隱式規則後沒有規則留下。
相比之下,在靜態模式規則或普通規則下,如果目標與規則匹配,並且先決條件不存在,則必須更新先決條件。例如,如果您有foo.o: foo.c
和foo.c
不存在,則該規則不能被丟棄,因爲它不是隱含的:該規則必須用於foo.o
。然後Make會尋找一個建立foo.c
的規則(並且可能找不到一個:這個錯誤將會是沒有規則製作foo.c
而不是foo.o
)。
請參閱GNU Make手冊中的主題Implicit Rule Search Algorithm。
如果這是.dat
文件可能不存在的預期行爲,則必須以其他方式表示該文件。例如,一種方法是使用一些外部依存產生使窗體的若干具體規則:
foo.sas7bdat: foo.dat
它放入一個foo.d
文件,並include
入Makefile
。如果你有一個名爲TARGETS
變量,它包含所有.sas7bdat
文件的名稱,可以包括所有的.d
相關文件是這樣的:
-include $(patsubst %.sas7bdat,%.d,$(TARGETS))
這是一樣的編譯C.我們不會寫這樣的模式規則的C程序:
%.o: %.c %.h
# ... build steps
這是因爲不是每個foo.c
有foo.h
,所以規則並不適用於這種情況。相反,我們有:
%.o: %.c
,然後任何額外的依賴,就像foo.o
取決於foo.h
在別處表示。隱式規則僅匹配主要可交付成果:目標文件和翻譯單元的「根」文件。
來源
2015-02-06 00:36:55
Kaz
聽起來像你沒有'sip84fp.dat'文件,它不能創建一個。你做? – 2015-02-05 23:18:32
啊,我錯過了依賴鏈的更深層次的東西(在這個東西里仍然很新)。謝謝! – 2015-02-05 23:20:03