我正在尝试使用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)
我错过了什么或做错了什么?
答案 0 :(得分: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)
这是为什么?由于在分配变量时未展开globbing,因此只有在运行规则时才会展开它。这意味着这一行:
BINDSCMS = $(BINDSRCS:.i=.scm)
将BINDSCMS
设置为字符串*.scm
,因为BINDSRCS
未展开,它仍然只是文字字符串*.i
。
为什么那么糟糕?因为那时make看到了这个:
bindings: *.scm
它尝试展开通配符*.scm
...但是这些文件都没有创建,因此它们不存在,并且这扩展到没有文件,因此只要目标bindings
存在重建它无关(它没有先决条件)。