[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

23. Automakeが不十分なとき

(_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 section 4. `Makefile.in'の生成)で,オーバーライドしている定義が簡単に捕え られます.

Automakeには,コマンドを用いたルールと依存性を指定するだけのルールに差 異がないことに注意して下さい.automakeが定義したターゲットに, ルール全体を定義することなく新しい依存性を追加することは不可能です.

しかし,様々な有用なターゲットには,`Makefile.in'で指定可能な, `-local'バージョンがあります.Automakeはこれらのユーザが提供する ターゲットを用いて標準ターゲットを補足します.

ローカルバージョンをサポートするターゲットは,allinfodvipspdfhtmlcheckinstall-datainstall-execuninstallinstalldirsinstallcheck,そして様々なcleanター ゲット(mostlycleancleandistclean,そして maintainer-clean)です.uninstall-exec-localuninstall-data-localターゲットが無いことに注意してください. uninstall-localだけを使用してください.データだけ,あるいは実行 可能プログラムだけをアンインストールすることには意味がありません.

例えば,ファイルを`/etc'にインストールする一つの方法は,以下のよ うになります.

 
install-data-local:
        $(INSTALL_DATA) $(srcdir)/afile $(DESTDIR)/etc/afile

ルールには,hookと呼ばれる,その仕事が終った後にもう一つのルール を実行する方法もあります.フックは,主要なターゲットに`-hook' を 追加して命名します.フックが可能なターゲットは,install-datainstall-execuninstalldist,そして 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 section `Particular Program Checks' in The Autoconf Manual), `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しています.


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Akihiro Sagawa on February, 25 2004 using texi2html