6

automake で VPATH ビルドを行っています。私は現在、SWIG で生成されたソースも使用しています。Makefile.am次のようなルールがあります。

dist_noinst_DATA = whatever.swig

whatever.cpp: whatever.swig
    swig -c++ -php $^

その後、ファイルは後で使用されます。

myprogram_SOURCES = ... whatever.cpp

のときに正常に動作し$builddir == $srcdirます。しかし、VPATH ビルド (例: mkdir build; cd build; ../configure; make) を実行すると、見つからないというエラー メッセージが表示されますwhatever.cpp

生成されたソース ファイルは、またはどちらに移動します$builddir$srcdir? (おそらくだと思います$builddir。)

生成されたファイルを適切な場所に配置するには、依存関係とルールをどのように指定する必要がありますか?

4

2 に答える 2

3

簡単な答え

$srcdirこれは読み取り専用であると想定する必要があるため、そこには何も書き込まないでください。したがって、生成されたソースコードは$(builddir).

デフォルトでは、autotool によって生成された Makefile は 内のソース ファイルのみを検索するため、同様$srcdirにチェックするように指示する必要があります。$builddir以下を追加するMakefile.amと役立ちます:

VPATH = $(srcdir) $(builddir)

その後、no rule to make target ...エラーが発生する可能性があります。これは、次のようにソース生成ルールを更新することで修正できるはずです。

$(builddir)/whatever.cpp: whatever.swig
        # ...

より良い解決策

現在のセットアップでは、make distこのwhatever.cppファイルをmyprogram_SOURCES. これを望まない場合 (たとえば、ビルド プロセスがファイルを再生成するのではなく、事前に生成されたファイルを実際に取得することを意味する可能性があるため)、次のようなものを使用することをお勧めします。whatever_includer.cpp生成されたファイルを単純にインクルードするラッパー ソース ファイル ( ) を使用-I$(builddir)し、生成されたファイルを検索するために使用します。

Makefile.am:

dist_noinst_DATA = whatever.swig

whatever.cpp: whatever.swig
    swig -c++ -php $^

whatever_includer.cpp: whatever.cpp

myprogram_SOURCES = ... whatever_includer.cpp
myprogram_CPPFLAGS = ... -I$(builddir)

clean-local::
    rm -f $(builddir)/whatever.cpp

whatever_includer.cpp:

#include "whatever.cpp"
于 2013-08-22T14:34:38.223 に答える
1

通常、読み取り専用のままにしたい$srcdirので、たとえばソースが CDROM に解凍されて配布されている場合でも/.../configure、ファイル システムの他の部分から実行できます。

ただし、SWIG を使用してラッパー ライブラリのソース コードを生成する場合は、ユーザーがコードをコンパイルするために SWIG をインストールする必要がないように、その SWIG で生成されたコードも配布する必要があります。次に、実際に選択肢があります: SWIG で生成されたコードを で終了するか$builddir(問題ありません:make distそこに収集して tarball に含めます)、または SWIG で生成されたコードを で出力することを決定できます$srcdir。配布されたパッケージの観点からのソース。これを保持する利点は$srcdirmake distcheck読み取り専用のソース ディレクトリからパッケージをビルドしようとすると、SWIG を呼び出してラッパー ソースを再生成しようとすると失敗することです。ラッパーソースがある場合$builddir、ユーザーのホストで SWIG が実行される原因となる壊れたルールがあることに気付かないかもしれません。生成する$srcdirことで、ユーザーが SWIG を必要としないことを保証します。

したがって、私の好みは SWIG ラッパー ソースを で出力すること$srcdirです。 Python ラッパーのセットアップは次のようになります。

EXTRA_DIST = spot.i
python_PYTHON = $(srcdir)/spot.py    # _PYTHON is distributed by default
pyexec_LTLIBRARIES = _spot.la

MAINTAINERCLEANFILES = $(srcdir)/spot_wrap.cxx $(srcdir)/spot.py

_spot_la_SOURCES = $(srcdir)/spot_wrap.cxx $(srcdir)/spot_wrap.h
_spot_la_LDFLAGS = -avoid-version -module
_spot_la_LIBADD = $(top_builddir)/src/libspot.la

$(srcdir)/spot_wrap.cxx: $(srcdir)/spot.i
        $(SWIG) -c++ -python -I$(srcdir) -I$(top_srcdir)/src $(srcdir)/spot.i

# Handle the multi-file output of SWIG.
$(srcdir)/spot.py: $(srcdir)/spot.i
        $(MAKE) $(AM_MAKEFLAGS) spot_wrap.cxx

のさまざまなフレーバーでの機能の制限のため、$(srcdir)すべてのターゲットに使用することに注意してください。SWIG によって出力される複数のファイルを処理するための私のセットアップは改善される可能性がありますが、これらのルールはユーザーによって実行されるものではなく、問題が発生したことは一度もないため、気にしません。VPATHmake

于 2013-08-26T09:50:08.160 に答える