教材の本は、Infoを読むモチベーションを与えてくれている、と考えることにする。
* GNU Automake
** 1 Introduction
- Automakeは、'Makefile.am'から'Makefile.in'を生成
するツールである。
- 'Makefile.am'の中身は、makeの変数定義が連なって
いる。
- 'Makefile.in'の中身は、GNU Makefile standardsに
準拠している。
- Automakeは、そのプロジェクトがAutoconfを使用す
ることを前提としている。また、'configure.ac'の
かきぶりについてAutomakeが求めるところもある。
- Automakeはperlを使っている。
** 2 An Introduction to the Autotools
- AutomakeはThe Autotoolsと呼ばれるツールセットの
一部である。
*** 2.1 Introducing the GNU Build System
- Unixでは、makeというbuild systemが使われていた。
それは'Makefile'を読み込んで動作する。
- 'Makefile'はプラットフォーム毎に調整が必要なも
の。
- それを自動でやるのが'configure'というシェルスク
リプト。
- GNU projectは、この2つをThe GNU Coding
Standardsにて標準化した。もっとも単純なシナリオ
では、 ./configure && make && make install でパッ
ケージの導入が完了する。
- このbuild systemを GNU Build System と言う。
- Autotoolsは、ソフトウエアパッケージのためにa
GNU Build Systemをつくるためのツールである。
- Automakeは'Makefile'にフォーカスし、
Autoconfは'configure'にフォーカスする。
*** 2.2 Use Cases for the GNU Build System
- ubuntu(interpid)にはamhelloは存在しない。リポジ
トリから取ってくる。
git clone http://git.sv.gnu.org/r/automake.git
- Autotoolsが実現していることは、GNU Coding
Standardを越えている。ここでは、これこれが越えて
いる機能です、ということを明示しないこともある。
**** 2.2.1 Basic Installation
- 典型的なシーケンス
tar zxf amhello-1.0.tar.gz
cd amhello-1.0
./configure
make
make check
sudo make install
make installcheck
**** 2.2.2 Standard 'Makefile' Targets
- GNU Conding Standardで説明されているターゲット。
make all
make install
make install-strip
make uninstall
make clean
make distclean
make check
make installcheck
make dist
**** 2.2.3 Standard Directory Variables
- GNU Conding Standardで説明されているディレクト
リ。
Directory variable Default value
-------------------------------------------------------
`prefix' `/usr/local'
`exec_prefix' `${prefix}'
`bindir' `${exec_prefix}/bin'
`libdir' `${exec_prefix}/lib'
...
`includedir' `${prefix}/include'
`datarootdir' `${prefix}/share'
`datadir' `${datarootdir}'
`mandir' `${datarootdir}/man'
`infodir' `${datarootdir}/info'
`docdir' `${datarootdir}/doc/${PACKAGE}'
...
**** 2.2.4 Standard Configuration Variables
- GNU Conding Standardで説明されている構成に関す
る変数。
`CC'
C compiler command
`CFLAGS'
C compiler flags
`CXX'
C++ compiler command
`CXXFLAGS'
C++ compiler flags
`LDFLAGS'
linker flags
`CPPFLAGS'
C/C++ preprocessor flags
...
- configureがこれらを適切に自動設定する。
configureの引数で指定することもできる。
**** 2.2.5 Overriding Default Configuration Setting with 'config.site'
- 'PREFIX/share/config.site'が存在すると、
configureは起動直後にそれをsourceする。
- サイトの共有設定を書いたりする。
**** 2.2.6 Parallel Build Trees (a.k.a. VPATH Builds)
- GNU build systemはソースツリーとビルドツリーを
分離できるつくりになっている。これをparallel
buildsとかVPATH buildsと言う。
- top directoryでmakeすると、ソーツとバイナリが混
在する。
- 分けるには次のようにする。
tar zxf ~/amhello-1.0.tar.gz
cd amhello-1.0
mkdir build && cd build
../configure
make
- これを利用するというか、複数のビルドツリーを持
つことによって、ひとつのソースツリーから多様な
ビルドを並列に配置することができる。
**** 2.2.7 Two-Part Installation
- make installは実体としては、2つの部分でできてい
る。
- make install-execとmake install-data。前者は
arichitecture-dependent files、後者は
architecture-independent filesをインストールする。
- dep/indepはパスによって識別される。exec-prefix
配下に入れるものはdependent、それ以外の場所に入
れるものはindependent。
**** 2.2.8 Cross-Compilation
- configureの引数で指定する。targetは
cross-compilerをビルドするときのみ意味がある。
`--build=BUILD'
`--host=HOST'
`--target=TARGET'
**** 2.2.9 Renaming Programs at Install Time
- インストールするexecutablesの名前を変えることが
できる。configureの引数で指定する。
`--program-prefix=PREFIX'
`--program-suffix=SUFFIX'
`--program-transform-name=PROGRAM'
**** 2.2.10 Building Binary Package Using DESTDIR
- make install and make uninstallは何をどこにイン
ストールしたかを完全には管理していない。
- The GNU Build Systemはa package managerにとって
変われるようなものではない。
- DESTDIRをつかうと何をどこに入れるのかの確認はで
きる。例。
make DESTDIR $HOME/inst install
- また、DESTDIRをつかってインストールツリーを構成
し、それをtarで固めることによって、同じプラット
フォームの別ホストにインストールする簡易パッケー
ジみたいにはできる。
**** 2.2.11 Preparing Distributions
- make distで'package-version.tar.gz'をつくること
ができる。
- make distcheckは、できるものは同じだが、いろい
ろなテストを実施してくれる。
- make, make check, make install,
make installcheck, make distをテスト。
- VPATH buildsをテスト。
- make clean, make dist clean, make uninstallを
テスト。
- DESTDIRインストールをテスト。
- すごいな、、、
**** 2.2.12 Automatic Dependecy Tracking
- dependency trackingはコンパイルの際に副作用とし
て実行される。
- ここでDependencyとは、C言語でいうとコンパイルし
ようとしているCソースの中でincludeされている
headersのこと。
- dependency trackingは一回だけしかbuildしないな
ら、意味はない。どうせ全部buildしないといけない
から。
- dependency trackingは二回目以降のbuildを効率化
する。
- configureの引数でon/offできる。
`--disable-dependency-tracking'
`--enable-dependency-tracking'
**** 2.2.13 Nested Packages
- GNU Build Systemsはネストすることができる。
- 一般にはあまり使わないが、GCCはこの機能をヘビー
に使っている。
- くわしくは、configure --help=recursive
*** 2.3 How Autotools Help
- 手で、Autotoolsを使わずに、the GNU Build System
をつくる('Makefile'と'configure'を書く)のは、や
らないほうがいい。
*** 2.4 A Small Hello World
- 'amhello-1.0'をゼロから作ってみる。すなわち、
`configure.ac'と`Makefile.am'などを書く。
**** 2.4.1 Creating 'amhello-1.0.tar.gz'
- 次のようなファイルとディレクトリをつくる。
~/amhello % cat src/main.c
#include
#include
int
main (void)
{
puts ("Hello World!");
puts ("This is " PACKAGE_STRING ".");
return 0;
}
~/amhello % cat README
This is a demonstration package for GNU Automake.
Type `info Automake' to read the Automake manual.
~/amhello % cat src/Makefile.am
bin_PROGRAMS = hello
hello_SOURCES = main.c
~/amhello % cat Makefile.am
SUBDIRS = src
dist_doc_DATA = README
~/amhello % cat configure.ac
AC_INIT([amhello], [1.0], [bug-automake@gnu.org])
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
AC_PROG_CC
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([
Makefile
src/Makefile
])
AC_OUTPUT
~/amhello %
- 次のように使う。
amhello-selfmade $ autoreconf --install
configure.ac:2: installing `./install-sh'
configure.ac:2: installing `./missing'
src/Makefile.am: installing `./depcomp'
amhello-selfmade $ ls -lR
.:
合計 260
-rw-r--r-- 1 aka aka 37 2009-11-17 00:52 Makefile.am
-rw-r--r-- 1 aka aka 19940 2009-11-17 00:55 Makefile.in
-rw-r--r-- 1 aka aka 100 2009-11-17 00:51 README
-rw-r--r-- 1 aka aka 32230 2009-11-17 00:55 aclocal.m4
drwxr-xr-x 2 aka aka 4096 2009-11-17 00:55 autom4te.cache
-rw-r--r-- 1 aka aka 557 2009-11-17 00:55 config.h.in
-rwxr-xr-x 1 aka aka 131436 2009-11-17 00:55 configure
-rw-r--r-- 1 aka aka 188 2009-11-17 00:53 configure.ac
-rwxr-xr-x 1 aka aka 17867 2009-11-17 00:55 depcomp
-rwxr-xr-x 1 aka aka 13620 2009-11-17 00:55 install-sh
-rwxr-xr-x 1 aka aka 11135 2009-11-17 00:55 missing
drwxr-xr-x 2 aka aka 4096 2009-11-17 00:55 src
./autom4te.cache:
合計 332
-rw-r--r-- 1 aka aka 131773 2009-11-17 00:55 output.0
-rw-r--r-- 1 aka aka 131773 2009-11-17 00:55 output.1
-rw-r--r-- 1 aka aka 5875 2009-11-17 00:55 requests
-rw-r--r-- 1 aka aka 30309 2009-11-17 00:55 traces.0
-rw-r--r-- 1 aka aka 19093 2009-11-17 00:55 traces.1
./src:
合計 24
-rw-r--r-- 1 aka aka 44 2009-11-17 00:52 Makefile.am
-rw-r--r-- 1 aka aka 12428 2009-11-17 00:55 Makefile.in
-rw-r--r-- 1 aka aka 137 2009-11-17 00:51 main.c
amhello-selfmade $ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
configure: creating ./config.status
config.status: creating Makefile
config.status: creating src/Makefile
config.status: creating config.h
config.status: executing depfiles commands
amhello-selfmade $ ls -lR
.:
合計 328
-rw-r--r-- 1 aka aka 20347 2009-11-17 00:58 Makefile
-rw-r--r-- 1 aka aka 37 2009-11-17 00:52 Makefile.am
-rw-r--r-- 1 aka aka 19940 2009-11-17 00:55 Makefile.in
-rw-r--r-- 1 aka aka 100 2009-11-17 00:51 README
-rw-r--r-- 1 aka aka 32230 2009-11-17 00:55 aclocal.m4
drwxr-xr-x 2 aka aka 4096 2009-11-17 00:55 autom4te.cache
-rw-r--r-- 1 aka aka 702 2009-11-17 00:58 config.h
-rw-r--r-- 1 aka aka 557 2009-11-17 00:55 config.h.in
-rw-r--r-- 1 aka aka 7720 2009-11-17 00:58 config.log
-rwxr-xr-x 1 aka aka 29114 2009-11-17 00:58 config.status
-rwxr-xr-x 1 aka aka 131436 2009-11-17 00:55 configure
-rw-r--r-- 1 aka aka 188 2009-11-17 00:53 configure.ac
-rwxr-xr-x 1 aka aka 17867 2009-11-17 00:55 depcomp
-rwxr-xr-x 1 aka aka 13620 2009-11-17 00:55 install-sh
-rwxr-xr-x 1 aka aka 11135 2009-11-17 00:55 missing
drwxr-xr-x 3 aka aka 4096 2009-11-17 00:58 src
-rw-r--r-- 1 aka aka 23 2009-11-17 00:58 stamp-h1
./autom4te.cache:
合計 332
-rw-r--r-- 1 aka aka 131773 2009-11-17 00:55 output.0
-rw-r--r-- 1 aka aka 131773 2009-11-17 00:55 output.1
-rw-r--r-- 1 aka aka 5875 2009-11-17 00:55 requests
-rw-r--r-- 1 aka aka 30309 2009-11-17 00:55 traces.0
-rw-r--r-- 1 aka aka 19093 2009-11-17 00:55 traces.1
./src:
合計 40
-rw-r--r-- 1 aka aka 12491 2009-11-17 00:58 Makefile
-rw-r--r-- 1 aka aka 44 2009-11-17 00:52 Makefile.am
-rw-r--r-- 1 aka aka 12428 2009-11-17 00:55 Makefile.in
-rw-r--r-- 1 aka aka 137 2009-11-17 00:51 main.c
amhello-selfmade $ make
make all-recursive
make[1]: ディレクトリ `/home/aka/local/work/scratch/autotools/amhello-selfmade' に入ります
Making all in src
make[2]: ディレクトリ `/home/aka/local/work/scratch/autotools/amhello-selfmade/src' に入ります
gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.c
mv -f .deps/main.Tpo .deps/main.Po
gcc -g -O2 -o hello main.o
make[2]: ディレクトリ `/home/aka/local/work/scratch/autotools/amhello-selfmade/src' から出ます
make[2]: ディレクトリ `/home/aka/local/work/scratch/autotools/amhello-selfmade' に入ります
make[2]: `all-am' に対して行うべき事はありません.
make[2]: ディレクトリ `/home/aka/local/work/scratch/autotools/amhello-selfmade' から出ます
make[1]: ディレクトリ `/home/aka/local/work/scratch/autotools/amhello-selfmade' から出ます
amhello-selfmade $ src/hello
Hello World!
This is amhello 1.0.
amhello-selfmade $ make distcheck
{ test ! -d amhello-1.0 || { find amhello-1.0 -type d ! -perm -200 -exec chmod u+w {} ';' && rm -fr amhello-1.0; }; }
test -d amhello-1.0 || mkdir amhello-1.0
[snip]
=============================================
amhello-1.0 archives ready for distribution:
amhello-1.0.tar.gz
=============================================
amhello-selfmade $
- autoreconfは、autoconfやautomakeやその他種々の
ツールを適切な順番で呼び出してくれる。
**** 2.4.2 'amhello-1.0' Explained
***** configure.acについて。
AC_INIT([amhello], [1.0], [bug-automake@gnu.org])
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
AC_PROG_CC
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([
Makefile
src/Makefile
])
AC_OUTPUT
- これは、AutoconfもAutomakeも読む。
- これは、M4マクロの連なりである。これらM4マクロ
は、shell codeに展開され、最終的にはconfigureス
クリプトになる。
- `AC_'はAutoconfのマクロ。Autoconfのマニュアルに
説明がある。
- `AM_'はAutomakeのマクロ。Automakeのマニュアルに
説明がある。
- line 1,2
AC_INIT([amhello], [1.0], [bug-automake@gnu.org])
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
- これは、AutoconfとAutomakeの初期化をする。
- `AC_INIT'の引数は、パッケージの名前、バージョン番
号、コンタクトアドレス。
- `AM_INIT_AUTOMAKE'の引数は、`automake'のオプショ
ンのリスト。これはコンパイラのオプションでは無
いことに注意。
- `-Wall' : すべての警告を取扱う
- `-Werror' : 警告をすべてエラーとして扱う
- `foreign' : このパッケージがthe GNU Standard
に準拠していないことを宣言
- GNU packagesはChangeLogとかAUTHORSとかが必
須なのだが、このパッケージには存在しない。
そんなことでautomakeに文句をいわれたくない
ため。
- line 3
AC_PROG_CC
- configureがCコンパイラを探し、それを
CCに設定するようになる。このCCは、Automakeが作っ
たsrc/Makefile.inの中に現われる。
- line 4
AC_CONFIG_HEADERS([config.h])
- configureがconfig.hを作るようになる。
- 具体的には、configure.acの中を知らべて`#define'
によって定義されているもの収集する。この例では、
例えば次のものが含まれる。
/* Define to the full name and version of this package. */
#define PACKAGE_STRING "amhello 1.0"
- main.cはconfig.hをincludeしているので、これを使
うことができる。
- line 5
AC_CONFIG_FILES([
Makefile
src/Makefile
])
- configureが`*.in'テンプレートから生成すべきファ
イルを指定する。
- また、Automakeもこれをscanする。処理すべき
Makefile.amをここで特定するのだ。
- line 6
AC_OUTPUT
- ファイル生成処理を開始する。
- 具体的には、AC_CONFIG_FILESとAC_CONFIG_HEADERS
で指定したものを作る。
- これでcounfigure.acはおしまい。
- 実戦でも、このくらいの簡単なものから徐々に育て
るのがよい。
- autoscanを使うのもよい。必要なテストをいろいろ
提案してくれる。
***** Makefile.amについて。
- src/Makefile.am
bin_PROGRAMS = hello
hello_SOURCES = main.c
- これはhelloをコンパイルする。
- Makefile.amの構文はMakefileと一緒。
- Makefile.amの内容は、そのまま、全て、
Makefile.inに含まれる。
- ただしそれだけではない。automakeは、build rules
や他の変数定義を追加する。
- _PROGRAMSで終わる変数は、Makefileがbuildすべき
programsを格納する。
- この`_PROGRAMS'というサフィックスをAutomakeでは
"primary"と言う。他のprimariesとして、
`_SCRIPTS'、`_DATA'、`_LIBRARIES'などなどがある。
- `bin_PROGRAMS'の`bin'は、成果物をBINDIRにインス
トールすべきことを示す。
- PROG_SOURCESは前項をbuildするためのsource files
を指定する。
- Makefile.am
SUBDIRS = src
dist_doc_DATA = README
- SUBDIRSは、再帰すべきディレクトリのリスト。
- dist_doc_DATA = READMEは、READMEを配布物と認識
し、DOCDIRにインストールすることを示す。
- `_DATA' primaryに属するファイルは、デフォルトで
は配布物にならない。なので、このような指定をす
る。
こつこつ。
0 件のコメント:
コメントを投稿