次: Third-Party Makefiles, 上: Not Enough
(_PROGRAMSのような変数は$(EXEEXT)が追加されて書き直され
るといった)わずかな例外はありますが,Makefile.amの内容は
Makefile.inにそのままコピーされます.
これらのコピーの意味は,単純にいくつかのmake変数とルールを
Makefile.amに追加することで,多くの問題が解決可能だということを
意味します.Automakeはこれらの追加を無視します.
Makefile.inは,三つの異なる場所(Makefile.am,
configure.ac,そしてautomake自身)からデータを集めてビ
ルドされるので,ルールや変数の定義が衝突する可能性があります.
Makefile.inをビルドするとき,ユーザが最後の単語を利用することを
保証するために,automakeに関連する優先順位に従います.
Makefile.amでユーザが定義した変数は,configure.acで
AC_SUBSTした変数より優先され,AC_SUBSTされた変数は
automakeが定義した変数より優先されます.同様にルールも関連し
て,ユーザ定義のルールはautomakeが定義した同じターゲットに対
するルールに優先されます.
これらのオーバーライドの意味は,Automakeのデフォルトの設定をうまく調整
したり,そのルールを置換することを可能にします.Automakeのルールをオー
バーライドすることはあまり勧められず,特にサブディレクトリがあるパッケー
ジの最上位のディレクトリではそうです.-Woverrideオプション
(see Invoking Automake)で,オーバーライドしている定義が簡単に捕え
られます.
Automakeには,コマンドを用いたルールと依存性を指定するだけのルールに差
異がないことに注意して下さい.automakeが定義したターゲットに,
ルール全体を定義することなく新しい依存性を追加することは不可能です.
しかし,様々な有用なターゲットには,Makefile.inで指定可能な, `-local'バージョンがあります.Automakeはこれらのユーザが提供する ターゲットを用いて標準ターゲットを補足します.
ローカルバージョンをサポートするターゲットは,all,info,
dvi,ps,pdf,html,check,
install-data, install-exec,uninstall,
installdirs,installcheck,そして様々なcleanター
ゲット(mostlyclean,clean,distclean,そして
maintainer-clean)です.uninstall-exec-localや
uninstall-data-localターゲットが無いことに注意してください.
uninstall-localだけを使用してください.データだけ,あるいは実行
可能プログラムだけをアンインストールすることには意味がありません.
例えば,ファイルを/etcにインストールする一つの方法は,以下のよ うになります.
install-data-local:
$(INSTALL_DATA) $(srcdir)/afile $(DESTDIR)/etc/afile
ルールには,hookと呼ばれる,その仕事が終った後にもう一つのルール
を実行する方法もあります.フックは,主要なターゲットに`-hook' を
追加して命名します.フックが可能なターゲットは,install-data,
install-exec,uninstall,dist,そして
distcheckです.
例えば,インストールしたプログラムにハードリンクを作成する方法は,以下
のようになります.
install-exec-hook:
ln $(DESTDIR)$(bindir)/program$(EXEEXT) \
$(DESTDIR)$(bindir)/proglink$(EXEEXT)
安っぽいけれど,シンボリックリンクより移植性の高いハードリンクは,どこ
ででも動作するわけではありません(例えば,OS/2にはlnがありま
せん).理想としては,lnが動作しないときはcp -pに逆戻りす
べきです.簡単な方法は,シンボリックリンクを受け入れる場合,
configure.acにAC_PROG_LN_Sを追加し(see Particular Program Checks),
Makefile.amで$(LN_S)を使用して下さい.
例えば,以下では,$(LN_S)を用いてプログラムのコピーバージョンの
インストールを可能にする方法です.
install-exec-hook:
cd $(DESTDIR)$(bindir) && \
mv -f prog$(EXEEXT) prog-$(VERSION)$(EXEEXT) && \
$(LN_S) prog-$(VERSION)$(EXEEXT) prog$(EXEEXT)
我々は,新しいバージョンがシンボリックリンクを削除し,本当のバイナリを
削除しないように,プログラムの名前を変更していることに注意して下さい.
また,我々は,相対リンクを作成するため,コピー先のディレクトリに
cdしています.