2016-11-10 78 views
0

我想使用SWIG和一個自動輸入文件列表來生成綁定。但顯然它不起作用(make只是說目標'綁定'沒有任何作用)。手動調用make作爲make whatever.i按預期工作。使用自動文件列表生成綁定?

我有以下Makefile.am現在:

bin_PROGRAMS = ptpcapture2 
ptpcapture2_SOURCES = *.scm 
BINDSRCS = *.i 
BINDSCMS = $(BINDSRCS:.i=.scm) 

.i.scm: 
    $(SWIG) -chicken -addextern $< 

.scm.c: bindings 
    $(CSC) -t -c $< 

bindings: $(BINDSCMS) 

我錯過了什麼或做錯了什麼?

回答

2

如果你打算使用後綴規則,你通過.SUFFIXES特殊目標必須add any new suffixes已知後綴的列表:

.SUFFIXES: .i .scm 

所以,很簡單,只需使用模式規則來代替:

%.scm : %.i 
     $(SWIG) -chicken -addextern $< 

%.c : %.scm bindings 
     $(CSC) -t -c $< 

但真正的問題是,你必須明確你的通配符,如:

ptpcapture2_SOURCES := $(wildcard *.scm) 
BINDSRCS := $(wildcard *.i) 

這是爲什麼?因爲變量分配時不擴展通配符,所以只有在規則運行時才展開。這意味着,這條線:

BINDSCMS = $(BINDSRCS:.i=.scm) 

BINDSCMS字符串*.scm因爲BINDSRCS不擴大,它仍然只是文本字符串*.i

爲什麼那麼糟糕?因爲那時時許看到這一點:

bindings: *.scm 

它試圖擴大通配符*.scm ......但沒有這些文件尚未創建,所以他們不存在,而這種擴展到任何文件,等等只要目標bindings存在就沒有什麼可以重建它(它沒有先決條件)。