2015-02-05 83 views
1

我似乎無法找到此在線的任何示例,並且它似乎對我無效。你可以在make文件中有一個模式規則,它有兩個匹配的依賴關係嗎?具有兩個或更多依賴關係的Makefile模式規則%.sas7bdat:%.sas%.dat

例如

%.sas7bdat: %.sas %.dat 
    # build %.sas7bdat using %.sas and %.dat 

特別是,如果我運行make,它指出...

make: *** No rule to make target `sip84fp.sas7bdat', needed by `sipp84'. Stop. 

即使該規定顯然與上述相同。

然而,減少規則,這...

%.sas7bdat: %.sas 

似乎工作?

+1

聽起來像你沒有'sip84fp.dat'文件,它不能創建一個。你做? – 2015-02-05 23:18:32

+0

啊,我錯過了依賴鏈的更深層次的東西(在這個東西里仍然很新)。謝謝! – 2015-02-05 23:20:03

回答

2

是的,靜態模式規則和隱式模式規則都可以具有多個先決條件,其中包含對模式主幹的引用%

隱式模式規則不同於靜態模式規則或普通的非模式規則,因爲它們只適用於沒有先決條件(「無條件地做這件事」)或其他先決條件存在的情況。

也就是說,如果需要構建的目標,如sip84fp.sas7bdat需要更新,那麼模式規則%.sas7bdat: %.sas %.dat的確是候選者。但會進行檢查:將sip84fp閥杆插入前提條紋圖案中以生成sip84fp.sas sip84fp.dat。這兩者都必須存在。如果它們不存在,則將該規則從考慮中移除,並且搜索繼續進行其他規則。

這就是爲什麼最後你會得到一條關於「無規則」的消息:它確實意味着在忽略所有不適用的隱式規則後沒有規則留下。

相比之下,在靜態模式規則或普通規則下,如果目標與規則匹配,並且先決條件不存在,則必須更新先決條件。例如,如果您有foo.o: foo.cfoo.c不存在,則該規則不能被丟棄,因爲它不是隱含的:該規則必須用於foo.o。然後Make會尋找一個建立foo.c的規則(並且可能找不到一個:這個錯誤將會是沒有規則製作foo.c而不是foo.o)。

請參閱GNU Make手冊中的主題Implicit Rule Search Algorithm

如果這是.dat文件可能不存在的預期行爲,則必須以其他方式表示該文件。例如,一種方法是使用一些外部依存產生使窗體的若干具體規則:

foo.sas7bdat: foo.dat 

它放入一個foo.d文件,並includeMakefile。如果你有一個名爲TARGETS變量,它包含所有.sas7bdat文件的名稱,可以包括所有的.d相關文件是這樣的:

-include $(patsubst %.sas7bdat,%.d,$(TARGETS)) 

這是一樣的編譯C.我們不會寫這樣的模式規則的C程序:

%.o: %.c %.h 
     # ... build steps 

這是因爲不是每個foo.cfoo.h,所以規則並不適用於這種情況。相反,我們有:

%.o: %.c 

,然後任何額外的依賴,就像foo.o取決於foo.h在別處表示。隱式規則僅匹配主要可交付成果:目標文件和翻譯單元的「根」文件。

+0

感謝您的這種深思熟慮的迴應! – 2015-02-06 01:33:12

相關問題