前: Alternative, 上: Directories


6.4 入れ子状のパッケージ

GNUビルド・システムでは,パッケージを任意の深さに入れ子状にすることが 可能です.これは,独自のconfigureMakefileなどがある他 のパッケージを埋め込んだパッケージが可能になることを意味します.

これらのその他のパッケージは,親パッケージのサブディレクトリに存在する ようにすべきです.それらは,他の普通のディレクトリと同様に SUBDIRSにリストアップする必要があります.しかし,サブパッケージ のMakefileは,親のconfigureではなく,独自の configureスクリプトで出力するようにすべきです.これはAutoconfマ クロのAC_CONFIG_SUBDIRSを使用して達成します (see AC_CONFIG_SUBDIRS).

サブディレクトリのhand/にある入れ子状のパッケージhandラ イブラリとリンクする,armプログラムのパッケージ例は,以下のよう になります.

armconfigure.acです.

     AC_INIT([arm], [1.0])
     AC_CONFIG_AUX_DIR([.])
     AM_INIT_AUTOMAKE
     AC_PROG_CC
     AC_CONFIG_FILES([Makefile])
     # Call hand's ./configure script recursively.
     AC_CONFIG_SUBDIRS([hand])
     AC_OUTPUT

armMakefile.amです.

     # Build the library in the hand subdirectory first.
     SUBDIRS = hand
     
     # Include hand's header when compiling this directory.
     AM_CPPFLAGS = -I$(srcdir)/hand
     
     bin_PROGRAMS = arm
     arm_SOURCES = arm.c
     # link with the hand library.
     arm_LDADD = hand/libhand.a

さて,handhand/configure.acです.

     AC_INIT([hand], [1.2])
     AC_CONFIG_AUX_DIR([.])
     AM_INIT_AUTOMAKE
     AC_PROG_CC
     AC_PROG_RANLIB
     AC_CONFIG_FILES([Makefile])
     AC_OUTPUT

そしてそのhand/Makefile.amです.

     lib_LIBRARIES = libhand.a
     libhand_a_SOURCES = hand.c

make distがトップレベルのディレクトリで実行されるとき, handサブディレクトリだけでなく,armコードも含むアーカイ ブarm-1.0.tar.gzを作成します.このパッケージは,通常のパッケー ジと同じように,いつもの./configure && make && make installでビ ルドしインストールすることが可能です(handサブパッケージは,処理 中にビルドとインストールがなされます.).

make disthandディレクトリで実行されるとき,それ自身が 含まれているhand-1.2.tar.gzアーカイブを作成します.他のパッケー ジに埋め込まれているのですが,別々に使用することも可能です.

AC_CONFIG_AUX_DIR([.])機能の目的は,AutomakeとAutoconfに追加ス クリプトをカレントディレクトリで探すように強制することです.例えば,二 つのinstall-shのコピーがあって,一つはトップレベルのarm パッケージ,もう一つはhandパッケージのhand/サブディレク トリにあるということを意味します.

歴史的なデフォルトは,これらの追加スクリプトを直接の親と更にその親のディ レクトリで探します.そのため,AC_CONFIG_AUX_DIR([.])行が hand/configure.acからなくなると,サブパッケージはarmパッ ケージの追加スクリプトを共有します.これは若干サイズが大きくなる(数Kバ イト)ように見えますが,handサブパッケージのモジュール性が実際に なくなり,自身には含まれないことになってしまいます(サブディレクトリで make distしても動作しません).

Automakeを使用しないパッケージは,この方法で統合するために,さらなる作 業が必要ですSee Third-Party Makefiles.