Next: , Previous: wildcards, Up: FAQ


26.4 distclean後にビルドディレクトリに残っているファイル

これは(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.1foo$(EXEEXT)に依存しないようにします.例えば,foo --versionfoo --helpが,foo.cconfigure.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.1foo$(EXEEXT)が変更されるたびにリビ ルドされません.makehelp2manの前に foo$(EXEEXT)を確実に更新します.これを確実にするもう一つの方法 は,バイナリとmanページに対して別のディレクトリを使用し, SUBDIRSをmanページがビルドされる前にバイナリがビルドされるよう に設定することです.

foo.1を配布しないように決定することも可能です.この状況では, foo.1foo$(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エラー を隠す方法で,それを修正するものではありません.良いようにして下さい.