次: , 前: Directory Variables, 上: Makefile Conventions


7.2.5 ユーザ用の標準的なターゲット

全てのGNUプログラムはそれらのMakefileに以下のターゲットを持つべきだ。

`all'
プログラム全体をコンパイルする。これはデフォルトのターゲットであるべきだ。 このターゲットはどの解説ファイルも再構築しなくて良い。Infoファイルは通常 配布物の中に含まれるべきで、DVIファイルは明示的に要求されたときにのみ作 られるべきだ。

デフォルトでは、Makeの規則は`-g'付きでコンパイルしリンクするべきだ。 こうして実行プログラムはデバッグのシンボルを持つ。無力なことを気にしない ユーザは、彼らが望むなら、その実行ファイルを後でstripすることができる。

`install'
プログラムをコンパイルし、実行ファイル、ライブラリなどを、それらが実際に 使われるべきファイル名に複製する。もしプログラムが適切にインストールされ たことを確かめるための簡単な試験があるなら、このターゲットはその試験を走 らせるべきだ。

実行ファイルをインストールするときにstripしてはいけない。向こう見ずなユー ザはそうするためにinstall-stripターゲットを使うことができる。

もし可能なら、`make all'が終わっていたら、そのプログラムが構築され たディレクトリのどんなものも変更しないようにinstallターゲットの規 則を書きなさい。これはあるユーザ名でプログラムを構築し、他のユーザ名でそ れをインストールするのに便利である。

そのコマンドはファイルがインストールされるディレクトリを、もしまだなかっ たら、全て作成するべきである。これは必要とされるサブディレクトリ全てだけ でなく、変数prefixexec_prefixの値で指定されるディレクト リも含む。これを行う一つの方法は以下で述べるようなinstalldirsター ゲットを使うことによる。

manページをインストールためのどんなコマンドの前にも、makeがどんな エラーも無視するように、`-'を使いなさい。これはUnixのmanページ解説 システムがインストールされてないシステムの場合である。

Infoファイルをインストールする方法は、それらを$(INSTALL_DATA) (see Command Variables)で$(infodir)に複製することで、もしあれ ば、install-infoプログラムを走らせる。install-infoは与えら れたInfoファイルのメニュー項目を加えたり更新したりするためにInfoの dirファイルを編集するプログラムである。それはTexinfoパッケージの 一部だ。ここでInfoファイルをインストールする見本の規則を挙げる。

          $(infodir)/foo.info: foo.info
                  $(POST_INSTALL)
          # There may be a newer info file in . than in srcdir.
                  -if test -f foo.info; then d=.; \
                   else d=$(srcdir); fi; \
                  $(INSTALL_DATA) $$d/foo.info $@; \
          # Run install-info only if it exists.
          # Use `if' instead of just prepending `-' to the
          # line so we notice real errors from install-info.
          # We use `$(SHELL) -c' because some shells do not
          # fail gracefully when there is an unknown command.
                  if $(SHELL) -c 'install-info --version' \
                     >/dev/null 2>&1; then \
                    install-info --dir-file=$(infodir)/dir \
                                 $(infodir)/foo.info; \
                  else true; fi
     

installターゲットを書くとき、三つの部類に全てのコマンドを分類しな ければならない。普通のものと、pre-installationコマンドと post-installationコマンドだ。See Install Command Categories

`uninstall'
インストールされたファイル—`install'ターゲットが作る複製—を全て 削除する。

この規則はコンパイルが行われたディレクトリを変更せず、ファイルがインストー ルされるディレクトリだけを変更するべきだ。

アンインストールのコマンドはインストールのコマンドと同様、三つの部類に分 けられる。See Install Command Categories

`install-strip'
installに似ているが、実行ファイルをインストールする間にそれらを stripする。多くの場合、このターゲットの定義は非常に単純で良い。
          install-strip:
                  $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' \
                          install
     

通常我々は、あなたがそのプログラムにバグがないと確信しているのでないなら、 実行ファイルをstripすることを推奨しない。しかしながら、バグがある場合用 にstripしていない実行ファイルを別のところに保存して、実際の実行用にstrip された実行ファイルをインストールすることは理に適っていることもあり得る。

`clean'
現在のディレクトリから、普通プログラムを構築することによって作られた全て のファイルを削除する。設定を記録するファイルは削除してはいけない。また、 構築によって作ることができても、配布物から手に入るので普通は作らないファ イルは残しておきなさい。

もし配布物の一部でないなら、.dviファイルは削除しなさい。

`distclean'
現在のディレクトリから、プログラムを設定したり、構築することによって作ら れた全てのファイルを削除する。もしソースを展開し、他のファイルを作らずに プログラムを構築しているなら、`make distclean'は配布物にあったファ イルだけを残すべきである。
`mostlyclean'
`clean'に似ているが、人々が通常再びコンパイルしたいとは思わない、少 数のファイルは削除してなくて良い。例えば、GCCの`mostlyclean'ターゲッ トはlibgcc.aを削除しない。なぜなら、それを再びコンパイルすること は滅多に必要でなく、長い時間がかかるからだ。
`maintainer-clean'
現在のディレクトリから、このMakefileで復元され得る、ほとんど全てを削除す る。これは典型的にはdistcleanによって削除される全てのものと、さら に、Bisonによって生み出されたCのソース・ファイル、タグの表、Infoファイル などなどを含む。

“ほとんど全て”と言う理由は、コマンド`make maintainer-clean'を走ら せることで、例えconfigureはMakefileの規則を使って再生できたとして も、configureを削除するべきでないということだ。もっと一般的に、 `make maintainer-clean'はconfigureを走らせるために、そしてプ ログラムを構築し始めるために存在する必要があるどんなものも削除するべきで はない。これが唯一の例外だ。maintainer-cleanは再構築される得る他 のものは全て削除するべきだ。

`maintainer-clean'ターゲットは、普通のユーザではなく、そのパッケー ジの管理者によって使われることが意図されている。`make maintainer-clean'が削除するファイルの一部を復元するために、特別なツール を必要とするかもしれない。これらのファイルは普通配布物に含められるので、 それらが簡単に復元することは気にしない。もし全配布物を再び展開する必要が あることを見出しても、我々を非難してはいけない。

ユーザがこれに気付くのを助けるために、特別なmaintainer-cleanター ゲットのためのコマンドはこれら二つで始まるべきだ。

          @echo 'This command is intended for maintainers to use; it'
          @echo 'deletes files that may need special tools to rebuild.'
     

`TAGS'
このプログラムのタグ表を更新する。
`info'
必要とされるどのInfoファイルでも生成する。規則を書く最善の方法は次のよう だ。
          info: foo.info
          
          foo.info: foo.texi chap1.texi chap2.texi
                  $(MAKEINFO) $(srcdir)/foo.texi
     

MakefileにMAKEINFOという変数を定義してなければならない。それは makeinfoプログラムを走らせるべきで、それはTexinfo配布物の一部であ る。

普通、GNU配布物はInfoファイルと一緒に手に入り、このことはInfoファイルが ソース・ディレクトリにあることを意味する。それゆえ、infoファイルのための Makeの規則はソース・ディレクトリでそれを更新するべきだ。ユーザがそのパッ ケージを構築するとき、普通のMakeはInfoファイルを更新しないだろう。なぜな ら、それらはすでに最新だろうから。

`dvi'
Texinfo解説書全てのDVIファイルを生成する。 例えば、
          dvi: foo.dvi
          
          foo.dvi: foo.texi chap1.texi chap2.texi
                  $(TEXI2DVI) $(srcdir)/foo.texi
     

MakefileにTEXI2DVIという変数を定義してなければならない。それは texi2dviというプログラムを走らせるべきで、それはTexinfo配布物の一 部である。1 あるいは、単に依存 関係だけを書き、GNU makeがそのコマンドを提供できるようにしなさい。

`dist'
このプログラムの配布用tarファイルを作成する。tarファイルは、そのtarファ イルの中のファイル名が配布されるパッケージの名前のサブディレクトリ名で始 まるように作り上げられるべきだ。この名前はバージョン・ナンバーを含んで良 い。

例えば、GCCのバージョン1.40の配布用tarファイルはgcc-1.40と名付け られたサブディレクトリに展開する。

これを行う一番簡単な方法は適切に名付けられたサブディレクトリを作り、 lncpでそれに適当なファイルをインストールし、そのサブディ レクトリにtarすることである。

そのtarファイルをgzipで圧縮しなさい。例えば、GCCのバージョン1.40 の実際の配布ファイルはgcc-1.40.tar.gzと名付けられている。

配布物にあるソースではないファイル全てを配布物中で最新にしておくために、 distターゲットは明示的にそれらに依存すべきだ。 See Making Releases.

`check'
(もしあれば)自己診断を行う。ユーザはその試験を走らせる前にプログラムを構 築しなければならないが、そのプログラムをインストールする必要はない。その プログラムが構築されているがインストールされていないときに働くように自己 診断を書くべきである。

以下のターゲットは、それらが有用であるプログラムに対して、慣習的な名前を 提案している。

installcheck
(もしあれば)インストールの診断を行う。ユーザはその試験を走らせる前にその プログラムを構築しインストールしなければならない。$(bindir)が検索 パスにあると仮定するべきではない。
installdirs
ファイルがインストールされるディレクトリとそれらの親ディレクトリを作成す るために、`installdirs'という名前のターゲットを加えると役に立つ。こ のために便利であるmkinstalldirsと名付けられたスクリプトがある。そ れはTexinfoパッケージの中で見付けることができる。 このような規則を使うことができる。
          # Make sure all installation directories (e.g. $(bindir))
          # actually exist by making them if necessary.
          installdirs: mkinstalldirs
                  $(srcdir)/mkinstalldirs $(bindir) $(datadir) \
                                          $(libdir) $(infodir) \
                                          $(mandir)
     

この規則はコンパイルがなされるディレクトリを変更するべきではない。インス トール用のディレクトリを作成する以外に何もするべきではない。


脚注

[1] texi2dviは整形の実際の作業を行うためにTeX を使用する。TeXはTexinfoと一緒配布されていない。