次: 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
はエラー
を隠す方法で,それを修正するものではありません.良いようにして下さい.