次: renamed objects, 前: wildcards, 上: FAQ
これは(Files left in build directory after distclean),make
distcheck時に遭遇する可能性がある診断結果です.
Distで説明したように,make distcheckでは,このようなエラー
に対し,パッケージのビルドと調査を試みます.
make distcheckは,パッケージのVPATHのビルドを実行し,
make distcleanを呼び出します.make distcleanが実行された
後で,ビルドディレクトリに残っているファイルは,このエラーの後でリスト
アップされます.
この診断結果は,実際には二種類のエラーをカバーしています.
残っている前者のファイルは配布されないので,クリーンするよう (see Clean)印が付いているものを修正します.これは明白で,文句を言 われても仕方がありません.
後者のバグは,理解し修正するのが常に容易だというわけではないので,例を
用いて説明します.パッケージにhelp2manを使用してmanページを
ビルドしたいプログラムが含まれていると仮定します.GNU
help2manは,コマンドの--helpと--versionの出力
から簡単なマニュアルページを生成します(see Overview).help2manのインストールをユー
ザに強制したくないので,以下のような設定を使用して生成されたmanページ
を配布するように決めました.
# This Makefile.am is bogus.
bin_PROGRAMS = foo
foo_SOURCES = foo.c
dist_man_MANS = foo.1
foo.1: foo$(EXEEXT)
help2man --output=foo.1 ./foo$(EXEEXT)
これで,manページを効果的に配布します.しかし,make distcheckは
以下のように異常終了するでしょう.
ERROR: files left in build directory after distclean:
./foo.1
なぜfoo.1がリビルドされたのでしょうか?その理由は,配布はされな いものの,foo.1は配布されないファイルfoo$(EXEEXT)に依存 しているためです.foo$(EXEEXT)はユーザがビルドするので,それは 配布されているfoo.1より常に新しいものになります.
make distcheckはパッケージ内の矛盾をとらえます.ユーザが
help2manをインストールする必要が無いように,foo.1を配
布するのが目的でしたが,このルールで今ではファイルが常にリビルドされ,
ユーザはどうしてもhelp2manが必要になります.
foo.1がユーザにリビルドされないことを確実にする,または
foo.1の配布を諦めるかのいずれかにすべきです.
より一般的には,配布されるファイルのルールには,配布されないビルドされ るファイルに決して依存しないようにすべきです.生成されたものを配布する 場合,そのソースを配布してください.
上記の例を修正する一つの方法として,配布されるfoo.1が foo$(EXEEXT)に依存しないようにします.例えば,foo --versionとfoo --helpが,foo.cやconfigure.ac が変更されない限り変更されない状況では,以下のようなMakefile.am を書くことが可能です.
bin_PROGRAMS = foo
foo_SOURCES = foo.c
dist_man_MANS = foo.1
foo.1: foo.c $(top_srcdir)/configure.ac
$(MAKE) $(AM_MAKEFLAGS) foo$(EXEEXT)
help2man --output=foo.1 ./foo$(EXEEXT)
この方法では,foo.1はfoo$(EXEEXT)が変更されるたびにリビ
ルドされません.makeはhelp2manの前に
foo$(EXEEXT)を確実に更新します.これを確実にするもう一つの方法
は,バイナリとmanページに対して別のディレクトリを使用し,
SUBDIRSをmanページがビルドされる前にバイナリがビルドされるよう
に設定することです.
foo.1を配布しないように決定することも可能です.この状況では, foo.1がfoo$(EXEEXT)に依存するようにすると両方ともリビル ドされるので優れています.しかし,foo.1のビルドで foo$(EXEEXT)を実行するので,クロスコンパイルでパッケージ をリビルドすることは不可能です.
そのようなエラーがあるもう一つの状況は,配布されるファイルがパッケージ でビルドされるツールを用いてビルドされるときです.パターンは似ています.
distributed-file: built-tools distributed-sources
build-command
以下のように変更すべきです.
distributed-file: distributed-sources
$(MAKE) $(AM_MAKEFLAGS) built-tools
build-command
または,クロスコンパイルで問題になる場合はdistributed-fileを配 布しないように選択することも可能です.
これらの例に意味がある状況をまとめます.
|
絶望的な状況では,Distで説明したように,
distcleancheck_listfilesを設定することで,この調査を利用不可能
にすることが可能です.こうする前に,make distcheckが文句を言う
理由を必ず理解して下さい.distcleancheck_listfilesはエラー
を隠す方法で,それを修正するものではありません.良いようにして下さい.