使用自动文件列表生成绑定?

时间:2016-11-10 15:31:57

标签: makefile automake

我正在尝试使用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)

我错过了什么或做错了什么?

1 个答案:

答案 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存在重建它无关(它没有先决条件)。