2016-11-10 2 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) 

は、私が何を欠場か間違ってしましたか? .SUFFIXES特別なターゲットを経由して知られているサフィックスのリストにadd any new suffixes

答えて

2

あなたはサフィックスルールを使用するつもりなら、あなたがしている:

.SUFFIXES: .i .scm 

それはちょうどパターンを使用するように簡単ですが代わりにルール:

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

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

しかし、ここで本当の問題は次のように、あなたはあなたのワイルドカードについて明示しなければならないことである。

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

これはなぜですか?変数の割り当て時にはグロビングは展開されないため、ルールの実行時にのみ展開されます。これは、この行を意味しますBINDSRCSが展開されていないため、文字列*.scm

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

セットBINDSCMS、それはまだ単なる文字列リテラル*.iです。

なぜそれが悪いですか? makeはこれを見ているときにするので:そう

bindings: *.scm 

それはワイルドカード*.scmを拡大しようとします...しかし、これらのファイルのどれもまだ作成されていないので、彼らは存在しない、これはありませんファイルに展開し、ターゲットbindingsが存在する限り、それを再構築するための何もありません(前提条件はありません)。

関連する問題