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

22. Automakeが不十分なとき

状況によっては,Automakeだけで作業をまかなえず,手書きのルールや手書き の`Makefile'といった手段を利用します.


22.1 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 `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 (autoconf)Particular Programs 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しています.


22.2 サードパーティーの`Makefile'

ほとんどのプロジェクトで,すべての`Makefile'はAutomakeで生成され ます.しかし,状況によっては手書きの`Makefile'をサブディレクトリ に配置する必要があるプロジェクトもあります.例えば,あるディレクトリは 独自のビルドシステムを用いたサードパーティーのプロジェクトで,それ以外 はAutomakeを使用していることもあるでしょう.

以下の再帰的なターゲットをすべて認識する`Makefile'があるディレク トリであれば,任意のディレクトリをSUBDIRSDIST_SUBDIRS にリストアップすることが可能です.

ユーザが以下のターゲットを実行したとき,ターゲットはすべてのサブディレ クトリで再帰的に実行されます.これは,サードパーティーの `Makefile'がそれらをサポートしていることが重要である理由です.

all

パッケージを完全にコンパイルします.これは,Automakeが生成する `Makefile'ではデフォルトのターゲットですが,サードパーティーの `Makefile'ではデフォルトである必要はありません.

distdir

tarballが構築される前に$(distdir)に配布すべきファイルをコピーし ます.もちろん,このターゲットもno-distオプション (see section Automakeの動作の変更が使用されている場合は不要です.

変数$(top_distdir)$(distdir)(see section 配布物に含まれるもの)は, distdirターゲットが呼び出されるとき,サブパッケージとなる外部パッ ケージから渡されます.これら二つの変数は,再帰的になっているディレクト リで調整されているので,すでに使用されています.

install
install-data
install-exec
uninstall

ファイルをインストールしたりアンインストールしたりします (see section インストールされるもの).

install-info

Texinfoドキュメントだけをインストールします(see section Texinfo).

installdirs

インストールディレクトリを作成しますが,ファイルはインストールしません.

check
installcheck

パッケージを調査します(see section テストスイートのサポート).

mostlyclean
clean
distclean
maintainer-clean

クリーンルールです(see section クリーンされるもの).

dvi
pdf
ps
info
html

さまざまな書式のドキュメントをビルドします(see section Texinfo).

tags
ctags

TAGSCTAGSをビルドします(see section etagsのインターフェース).

プロジェクトでGettextを使用したことがある場合,これはサードパーティー の`Makefile'がAutomakeが使用可能だという良い例になります. `po/'と`intl/'にあるgettextizeされた `Makefile'は,これらすべてのターゲットを実装している手書きの `Makefile'です.すなわち,AutomakeパッケージのSUBDIRSに追 加することが可能です.

DIST_SUBDIRSだけでリストアップされていて,SUBDIRSでリス トアップされていないディレクトリは,distcleanmaintainer-clean,そしてdistdirルールだけが必要です (see section サブディレクトリの条件).

通常,これらのルールの多くは,サードパーティーのサブプロジェクトには無 関係ですが,パッケージ全体がうまく動作するために要求されます.何もしな いルールもOKなので,ドキュメントもタグのサポートもないサードパーティー のプロジェクトを統合する場合は,単純に`Makefile'にを追加すること も可能でしょう.

 
EMPTY_AUTOMAKE_TARGETS = dvi pdf ps info html tags ctags
.PHONY: $(EMPTY_AUTOMAKE_TARGETS)
$(EMPTY_AUTOMAKE_TARGETS):

サードパーティーのビルドシステムとの統合のもう一つの側面は,それらが VPATHのビルドをサポートしているかどうかによります.明らかに,サブパッ ケージがVPATHのビルドをサポートしていない場合,パッケージ全体ではVPATH のビルドをサポートしないことになります.言い替えると,make distcheckはVPATHのビルドに依存するため動作しないことを意味します.こ れを利用しないことも可能です(実際,Automakeユーザにはmake distcheckを聞いたこともない人がたくさんいます).それ以外の人々は,既 存の`Makefile'をVPATHをサポートするように改造するかもしれません. そうすることの必要性をAutomakeが要求するわけではありませんが.Autoconf だけは必要とします(see (autoconf)Build Directories section `Build Directories' in The Autoconf Manual).必要となる代入は,`Makefile'の処 理で`configure'で定義される@scrdir@@top_srcdir@,そして@top_buildir@で(see (autoconf)Preset Output Variables section `Preset Output Variables' in The Autoconf Manual),それらは前述の$(distdir)$(top_distdir)変数の ようにMakefileで計算されません.

サードパーティーの`Makefile'が上記で要求されるターゲットを導入す るように編集するのは,不便なことも時々あります.例えば,新しいバージョ ンに簡単に更新できるようサードパーティのソースをいじらないようにしたい 人もいるかもしれません.

他にも二つの考えがあります.GNU makeと仮定する場合,一つの方法として, 要求されるターゲットを追加しサードパーティの`Makefile'をインクルー ドした`GNUmakefile'をサブディレクトリに追加することが可能です. VPATHのビルドでこれを動作するため,`GNUmakefile'はディレクトリの ビルドでだます必要があります.こうするための最も簡単な方法は,代わりに これを`GNUmakefile.in'に書き,外部パッケージから AC_CONFIG_FILESで処理させることです.例えば,`Makefile'で ドキュメントのターゲット以外のすべてのターゲットを定義していると仮定し, checkターゲットは実際にはtestで呼び出される場合, `GNUmakefile'(または`GNUmakefile.in')を以下のように書くでしょ う.

 
# First, include the real Makefile
include Makefile
# Then, define the other targets needed by Automake Makefiles.
.PHONY: dvi pdf ps info html check
dvi pdf ps info html:
check: test

includeを使用しない同じような考えは,本物の`Makefile'にルー ルを送る,代わりの`Makefile'を書くことで,$(MAKE) -f Makefile.real $(AM_MAKEFLAGS) target (オリジナルの`Makefile'の名 前を変更できる場合),または,cd subdir && $(MAKE) $(AM_MAKEFLAGS) target (サブディレクトリのプロジェクトの階層をもう一 つ深くできる場合)のいずれかを用います.この代わりの`Makefile'を Automakeで生成可能だというのは,良い知らせでしょう.ルールを送りつける -local ターゲット(see section Automakeルールの拡張)だけが必要です.もちろん,それ以外 のAutomakeの機能も利用可能なので,Automakeに配布とインストールを実行さ せることを決定することも可能でしょう.以下は,実行可能な `Makefile.am'です.

 
all-local:
        cd subdir && $(MAKE) $(AM_MAKEFLAGS) all
check-local:
        cd subdir && $(MAKE) $(AM_MAKEFLAGS) test
clean-local:
        cd subdir && $(MAKE) $(AM_MAKEFLAGS) clean

# Assuming the package knows how to install itself
install-data-local:
        cd subdir && $(MAKE) $(AM_MAKEFLAGS) install-data
install-exec-local:
        cd subdir && $(MAKE) $(AM_MAKEFLAGS) install-exec
uninstall-local:
        cd subdir && $(MAKE) $(AM_MAKEFLAGS) uninstall

# Distribute files from here.
EXTRA_DIST = subdir/Makefile subdir/program.c ...

このアイディアは最後の手段で,サブプロジェクトのビルドシステムを無視し, すべてをこの代わりの`Makefile.am'で生成します.これは,VPATHのビ ルドが必要でサブプロジェクトがそれをサポートしていない場合,非常に理に かなったものに感じるでしょう.


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

This document was generated by Akihiro Sagawa on June, 8 2005 using texi2html 1.70.