2016-11-10 80 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存在就没有什么可以重建它(它没有先决条件)。