全てのGNUプログラムはそれらのMakefileに以下のターゲットを持つべきだ。
デフォルトでは、Makeの規則は`-g'付きでコンパイルしリンクするべきだ。
こうして実行プログラムはデバッグのシンボルを持つ。無力なことを気にしない
ユーザは、彼らが望むなら、その実行ファイルを後でstripすることができる。
実行ファイルをインストールするときにstripしてはいけない。向こう見ずなユー
ザはそうするためにinstall-strip
ターゲットを使うことができる。
もし可能なら、`make all'が終わっていたら、そのプログラムが構築され
たディレクトリのどんなものも変更しないようにinstall
ターゲットの規
則を書きなさい。これはあるユーザ名でプログラムを構築し、他のユーザ名でそ
れをインストールするのに便利である。
そのコマンドはファイルがインストールされるディレクトリを、もしまだなかっ
たら、全て作成するべきである。これは必要とされるサブディレクトリ全てだけ
でなく、変数prefix
やexec_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。
この規則はコンパイルが行われたディレクトリを変更せず、ファイルがインストー ルされるディレクトリだけを変更するべきだ。
アンインストールのコマンドはインストールのコマンドと同様、三つの部類に分
けられる。See Install Command Categories。
install
に似ているが、実行ファイルをインストールする間にそれらを
stripする。多くの場合、このターゲットの定義は非常に単純で良い。
install-strip: $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' \ install
通常我々は、あなたがそのプログラムにバグがないと確信しているのでないなら、
実行ファイルをstripすることを推奨しない。しかしながら、バグがある場合用
にstripしていない実行ファイルを別のところに保存して、実際の実行用にstrip
された実行ファイルをインストールすることは理に適っていることもあり得る。
もし配布物の一部でないなら、.dviファイルは削除しなさい。
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.'
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: foo.dvi foo.dvi: foo.texi chap1.texi chap2.texi $(TEXI2DVI) $(srcdir)/foo.texi
MakefileにTEXI2DVI
という変数を定義してなければならない。それは
texi2dvi
というプログラムを走らせるべきで、それはTexinfo配布物の一
部である。1 あるいは、単に依存
関係だけを書き、GNU make
がそのコマンドを提供できるようにしなさい。
例えば、GCCのバージョン1.40の配布用tarファイルはgcc-1.40と名付け られたサブディレクトリに展開する。
これを行う一番簡単な方法は適切に名付けられたサブディレクトリを作り、
ln
かcp
でそれに適当なファイルをインストールし、そのサブディ
レクトリにtar
することである。
そのtarファイルをgzip
で圧縮しなさい。例えば、GCCのバージョン1.40
の実際の配布ファイルはgcc-1.40.tar.gzと名付けられている。
配布物にあるソースではないファイル全てを配布物中で最新にしておくために、
dist
ターゲットは明示的にそれらに依存すべきだ。
See Making Releases.
以下のターゲットは、それらが有用であるプログラムに対して、慣習的な名前を 提案している。
installcheck
installdirs
# Make sure all installation directories (e.g. $(bindir)) # actually exist by making them if necessary. installdirs: mkinstalldirs $(srcdir)/mkinstalldirs $(bindir) $(datadir) \ $(libdir) $(infodir) \ $(mandir)
この規則はコンパイルがなされるディレクトリを変更するべきではない。インス トール用のディレクトリを作成する以外に何もするべきではない。