[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
状況によっては,Automakeだけで作業をまかなえず,手書きのルールや手書き の`Makefile'といった手段を利用します.
22.1 Automakeルールの拡張 | Adding new rules or overriding existing ones. | |
22.2 サードパーティーの`Makefile' | Integrating Non-Automake `Makefile's. |
(_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はこれらのユーザが提供する ターゲットを用いて標準ターゲットを補足します.
ローカルバージョンをサポートするターゲットは,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 (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
しています.
ほとんどのプロジェクトで,すべての`Makefile'はAutomakeで生成され ます.しかし,状況によっては手書きの`Makefile'をサブディレクトリ に配置する必要があるプロジェクトもあります.例えば,あるディレクトリは 独自のビルドシステムを用いたサードパーティーのプロジェクトで,それ以外 はAutomakeを使用していることもあるでしょう.
以下の再帰的なターゲットをすべて認識する`Makefile'があるディレク
トリであれば,任意のディレクトリをSUBDIRS
やDIST_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
TAGS
とCTAGS
をビルドします(see section etags
のインターフェース).
プロジェクトでGettextを使用したことがある場合,これはサードパーティー
の`Makefile'がAutomakeが使用可能だという良い例になります.
`po/'と`intl/'にあるgettextize
された
`Makefile'は,これらすべてのターゲットを実装している手書きの
`Makefile'です.すなわち,AutomakeパッケージのSUBDIRS
に追
加することが可能です.
DIST_SUBDIRS
だけでリストアップされていて,SUBDIRS
でリス
トアップされていないディレクトリは,distclean
,
maintainer-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.