ラベル Automake の投稿を表示しています。 すべての投稿を表示
ラベル Automake の投稿を表示しています。 すべての投稿を表示

2009年11月18日水曜日

【Automake】Infoを読む (2)

Automakeの基礎は、Infoの8章まででいい感じ。
このくらいの知識で、教材のトラブルシューティングがいけるかなぁ。


** 3 General ideas
- Automakeの動作について、基本的な考え方を紹介す
る。

*** 3.1 General Operation
- Automakeは`Makefile.am'を読み込み、
`Makefile.in'を生成する。
- `Makefile.am'で定義された変数やルールを拠り所に
して、Automakeが追加的なコードを生成することも
ある。
- 例えば、`bin_PROGRAMS'変数があると、Automakeは、
コンパイルとリンクのルールを追加する。

- `Makefile.am'の中身(変数とルールの定義)は、その
まま、`Makefile.in' にコピーされる。
- 自動生成された、`Makefile.in'に、手でルール等を
追加することは問題ない。
- Automakeは、ほとんどのGNU make拡張を認識しない。
すなわち、`Makefile.am'に書くとエラーになる。唯
一の例外は、+=演算子。

- Makefile.amで定義したルールの名前が、automake が
自動生成するルールの名前と衝突していた場合、
Makefile.amのものが優先される。名前の衝突は避け
るべきである。
- 同様に、Makefile.amの変数定義またはconfigure.ac
のAC_SUBSTされた変数定義が、automakeが自動生成す
るものと衝突していた場合、前者が優先される。
- Automakeの変数展開はmakeと同じ(ようだ)。

- ##で始まる行をAutomakeは無視する。(先行してスペー
スがあっても同じ)

*** 3.2 Strictness
- strictnessは、the GNU standardsへの準拠を
Automakeがどれだけ厳格に取り扱うかという指標。
- 使える値は次のもの。
- foregin : Automakeが動作するのに必要最低限な
チェックだけを実施。
- gnu : the GNU standardsに適合しているか可能な
かぎりチェックする。デフォルト。
- gnits : Gnits standards (策定中)に適合してい
るかチェックする。Gnits standardsはthe GNU
standardsをベースとし、より詳細である。

*** 3.3 The Uniform Naming Scheme
- Automakeの変数は、uniform naming schemeに従って
いる。
- この命名則に従えば、名前によって、「make time」
において、そのプログラムを如何ように構築すべきか
が判別できる。
- また、この命名則は、「configure time」において、
何を構築すべきかということの判断することを助け
る。
- この命名則では、名前はいくつかの部分からなる。
- 何を構築すべきかということを示す部分を"primary"
と呼ぶ。PROGRAMSというprimaryは、コンパイルとリ
ンクが必要なものであることを示す。
- primaryの前に'EXTRA_'をつけることができる。これ
は、maybe builtという意味であり、実際にbuildす
るかどうかはconfigureが決める。
- 他の部分には、built objectsをシステム上のどこに
格納するのかを示すものがある。primaryのprefixに
なる。「どこに」として選択できるかきぶりは、the
GNU standardsできまっているディレクトリ構成に準
拠すべし。
- noinst_をつけると、構築されるが、インストールは
されない。
- check_をつけると、make check済みでないと構築さ
れない。make check済みだと、noinst_と同様の振舞。

- primary namesの一覧

`PROGRAMS', `LIBRARIES', `LISP', `PYTHON',
`JAVA', `SCRIPTS', `DATA', `HEADERS', `MANS',
and `TEXINFOS'.

- いくつかのprimaryには、`dist_', `nodist_',
`nobase_'というprefixが使える。これらによって、
automakeの振る舞いを制御できる。

*** 3.4 Staying below the command line length limit
- unix-likeシステムでは、プロセス生成時にリソース
制限がある。具体的には、コマンドライン引数の長
さや環境情報(環境変数など)のサイズだ。
- POSIXの要求は、少くとも4KB確保。実際のシステム
の上限はもっと高い。
- ポータビリティを考えると4KB以内になるようにすべ
き。
- Automakeの機能だけでは、これを達成できない。
- そのためのMakefile.amのかきぶりの注意点など。

*** 3.5 How derived variables are named
- 値由来の名前をもとにして、Automakeが新な名前をつ
くるときのルール。
- 例えば、_PROGRAMSが格納するリストをもと
に、_SOURCESの名前をつくるとき、大抵の記号は'_'
になる。
- 例:
'snif-glue'が'_PROGRAMS'にあると
き、'snif_glue_PROGRAMS'という名前をつく
る。'snif-glue_PROGRAMS'では無い。

*** 3.6 Variables reserved for the user
- the GNU Coding Standardsでは、ユーザ用の変数を定
めている。メンテナはこれを使うべきではない。
- 例えば、'CFLAGS'。
- Automakeは、ユーザ用変数のシャドウ変数を用意し
ている。メンテナはこちらを使う。シャドウ変数は、
AM_で始まる。例えば、'CFLAGS'のシャドウ変数
は、'AM_CFLAGS'。

*** 3.7 Programs automake might require

- Automakeを使って作成したMakefileが正しく動作す
るためには、ヘルパープログラムが必要になること
がある。これはその一覧。これらはAutomakeと一緒
に配布されている。

`ansi2knr.c'
`ansi2knr.1'
`compile'
`config.guess'
`config.sub'
`config-ml.in'
`depcomp'
`elisp-comp'
`install-sh'
`mdate-sh'
`missing'
`mkinstalldirs'
`py-compile'
`symlink-tree'
`texinfo.tex'
`ylwrap'

** 4 Some example packages
*** 4.1 A simple example, start to finish
- Autoconfは使っているが、Automakeはまだ使ってい
ないという状況において、どのようにAutomakeを導
入するかというシナリオ。

*** 4.2 Building true and false
- true.cというひとつのソースから、trueとfalseとい
う2つのプログラムをbuildするためのMakefile.amの
かきぶり紹介。(なぜ、ここでこんなものを紹介する
のか理解できない。。。)

** 5 Creating a 'Makefile.in'
- Makefile.inを生成するには、トップレベルディレク
トリにて'automake'を実行すればよい。
- automakeは、configure.acをscanして、Makefile.am
を探し出す。
- ただし、configure.acが複数存在するようなプロジェ
クトというか構成においては、それらはおそらくサブ
プロジェクトを運用しているということなのだが、
configure.acが存在するディレクトリ毎にautomakeを
実行しなければならない。
- さらにただし、autoreconfをつかうと、
configure.acに記述されているconfigure.ac間の依
存関係から自動的にautomakeも再帰処理してくれる。

- automakeは常にトップレベルディレクトリで実行し
なければいけない。そうしないと、大元の
configure.acが存在するディレクトリとの出入りな
どを勘案できないからだ。
- Automakeはconfigure.acをscanするために、
autoconfを走らせる。(scanするためだけ)

- Automakeのオプション一覧

`-a'
`--add-missing'

`--libdir=DIR'

`-c'
`--copy'

`--cygnus'

`-f'
`--force-missing'

`--foreign'

`--gnits'

`--gnu'

`--help'

`-i'
`--ignore-deps'

`--include-deps'

`--no-force'

`-o DIR'
`--output-dir=DIR'

`-v'
`--verbose'

`--version'

`-W CATEGORY'

`--warnings=CATEGORY'
`gnu'
`obsolete'
`override'
`portability'
`syntax'
`unsupported'
`all'
`none'
`error'

上記のものに'no-'をつけると除外指示。


** 6 Scanning 'configure.ac'
*** 6.1 Configuration requirements
- Automakeを使うために、configure.acがどうあるべ
きかという話。

- 唯一必須は、'AM_INIT_AUTOMAKE'マクロ。

- その他にもautomakeが必要とするマクロがある。
- `AC_CONFIG_FILE'
- `AC_OUTPUT'
- この2つのかきぶりはこんな感じ。configure.acの
末尾。

...
AC_CONFIG_FILES([
Makefile
doc/Makefile
src/Makefile
src/lib/Makefile
...
])
AC_OUTPUT

- AC_CONFIG_FILESの引数で指定されているMakefile
がautomakeの生成対象となる。なので、同じパス
にMakefile.amが存在することが期待され、同じパ
スにMakefile.inを生成する。
- AC_CONFIG_FILESの引数に変数を使うときは要注意
どう展開させるかどうかという制御が必要。その
制御にはAC_SUBSTを使う。詳細は割愛。

*** 6.2 Other things Automake recognize

- configure.acに書き得る内容で、Automakeが生成す
るMakefile.inに影響を与えうるものどもの一覧。

`AC_CANONICAL_BUILD'
`AC_CANONICAL_HOST'
`AC_CANONICAL_TARGET'

Automakeは、config.guessとconfig.subが存在すること
を保証する。(なければ作るということか?)

build_triplet, host_triplet, target_tripletという
変数を導入する。


`AC_CONFIG_AUX_DIR'

helper scriptsを探すにあたって、これの引数に指定さ
れたディレクトリを対象とする。このマクロが無い場合、
標準配置場所(ものによって異なる)を探す。


`AC_CONFIG_LIBOBJ_DIR'

このマクロの引数で指定するディレクトリ

`AC_LIBSOURCE'

Automake will require the sources file declared with
`AC_LIBSOURCE' (see below) in the directory specified by this
macro.

`AC_CONFIG_HEADERS'

Automakeは、ここで指定されたヘッダを作成するための
ルールを生成する。


`AC_CONFIG_LINKS'

Automakeは、ルールをつくる。このルールは、
configureが生成したリンクを'make distclean'で削除
し、'make dist'で、ソースファイル(リンクじゃないと
いうこと?)を配布物に含める。


`AC_LIBOBJ'
`AC_LIBSOURCE'
`AC_LIBSOURCES'

Automakeは、`AC_LIBSOURCE' または `AC_LIBSOURCES'
に含まれているファイルを配布物に含める。

`AC_LIBOBJ'は`AC_SIBSOURCE'を呼び出す。そのため、こ
れで指定したものも配布物に含まれる。

`AC_PROG_RANLIB'

ライブラリを構築するなら必要。


`AC_PROG_CXX'

C++のソースが含まれているなら必要。


`AC_PROG_OBJC'

Objective Cのソースが含まれているなら必要。


`AC_PROG_F77'

Fortran 77のソースが含まれているなら必要。


`AC_F77_LIBRARY_LDFLAGS'

ホスト言語はFortran 77ではないが、Fortran 77のコー
ドを含むようなプログラムやライブラリのソースが含ま
れているなら必要。


`AC_PROG_FC'

Fortran 90/95のソースが含まれているなら必要。


`AC_PROG_LIBTOOL'

libtoolのための処理をAutomakeは実行する。


`AC_PROG_YACC'

Yaccソースが含まれているなら、これを使うか、
configure.acで'YACC'変数の定義が必要。


`AC_PROG_LEX'

Latexのソースが含まれているなら必要。


`AC_REQUIRE_AUX_FILE'



`automake' will ensure each file for which this macro is called
exists in the aux directory, and will complain otherwise. It will
also automatically distribute the file. This macro should be used
by third-party Autoconf macros that requires some supporting files
in the aux directory specified with `AC_CONFIG_AUX_DIR' above.
*Note Finding `configure' Input: (autoconf)Input.

`AC_SUBST'

第一引数で指定した変数名を、すべてのMakefile.inで
変数として定義する。


`AM_C_PROTOTYPES'

旧式となったde-ANSI-ficationを使うには必要。


`AM_GNU_GETTEXT'

GNU gettextをつかっているパッケージでは必要。


`AM_GNU_GETTEXT_INTL_SUBDIR'

AM_GNU_GETTEXTの引数でexternalを指定していても、
intl/サブディレクトリを構築する。


`AM_MAINTAINER_MODE'


`--enable-maintainer-mode'オプションが`configure'
に装備されるようにする。すなわち、automakeは
"maintainer-only"ルールを生成する。


`m4_include'

configure.acがこのマクロでincludeしているファイル
を、配布物に含めるようにする。


*** 6.3 Auto-generating aclocal.m4
- Automakeは、多数のAutoconfマクロを含んでいる。
(なぜそんなことに。。。)
- なので、Autoconfからそれらを使えるようにしてあ
げなければならない。AutomakeはAutoconfを使うの
で、Automakeが正常動作するためにもこのことが必
要。
- これを実現するのがaclocalプログラム。
- aclocalは、configure.acを読み込んで、その内容に
応じて、aclocal.m4 filesを作成する。
- これがあるとautoconfはマクロを見付けることがで
きる。
- aclocalはm4マクロがあるべき(あるかも)場所をすべ
て探索する。
- autom4teは、マクロの利用をトレースし、不要なも
の(使われないもの)をaclocal.m4から削除する。

**** 6.3.1 aclocal Options
`--acdir=DIR'
`--diff[=COMMAND]'
`--dry-run'
`--help'
`-I DIR'
`--install'
`--force'
`--output=FILE'
`--print-ac-dir'
`--verbose'
`--version'
`-W CATEGORY'
`--warnings=CATEGORY'

**** 6.3.2 Macro Search Path
- aclocalがm4マクロを探す場所一覧。

`acdir-APIVERSION'
これはAutomakeに同梱されているAC_マクロの置き場所。

`acdir'
サードパーティの.m4ファイルのための場所。

***** 6.3.2.1 Modifying the macro search path: `--acdir'

- これはメンテナが使うものなじゃない。Automakeの
内部利用のためのもの。

***** 6.3.2.2 Modifying the macro search path: `-I DIR'

- これはメンテナが使うもの、DIRが探索先として
prependされる。


***** 6.3.2.3 Modifying the macro search path: `dirlist'

- dirlistファイルがaclocalのm4探索パスにある場合、
そのファイルの中身の指示を探索先に含める。指示
はパターン(シェルの正規表現)で指定する。この探
索先は既存の探索先にappendされる。

**** 6.3.3 Writing your own aclocal macros
- 例えば、自分のパッケージを他のメンテナが利用する
ときに便利なm4マクロを書いたとしよう。そのm4 マ
クロもパッケージに同梱して配布し、aclocalの探索
対象とすることができる。そのやり方。
- 拡張子は`.m4'。
- インストール場所は、`$(datadir)/aclocal'。
- その他、AC_的なオリジナルm4マクロを書くための作
法を紹介。

**** 6.3.4 Handling Local Macros
- Autoconfが提供する機能テストがどんなプロジェク
トでも十分なものである、ということはアタリマエ
だがありえない。
- 往々にして、メンテナは、自分でマクロを書いて補
完することになる。またはサードパーティのマクロ
を使うことになる。
- この際、やり方が2つある。
- ひとつめ。
- acinclude.m4に書く。これはaclocal.m4が取り込ん
でくれる。
- ただし、マクロの数が増えると、1ファイルでそれを
管理するのは面倒になる。
- ふたつめ。こちらが推奨。
- マクロをファイルに分けて、それをm4/というディレ
クトリにまとめる。で、'aclocal -I m4'する。
- その他、ローカルマクロに関する複雑な事情の説明。
- で、それを回避するためには、configure.acに、

ACLOCAL_AMFLAGS = -I m4 --install

と書きましょう、ということ。

- マクロのシリアル番号を入れておくと、
aclocalは'--install'オプションがついていると、そ
れを見て更新すべきかどうかを判断してくれる。
- シリアル番号はマクロファイルの中に、マクロ定義
が出てくる前の位置に書く。

#serial NNN

NNNは数字または'.'。

**** 6.3.5 Serial Numbers
- シリアル番号に関する詳細。

**** 6.3.6 The Future of aclocal
- aclocalは将来消滅すべきである。とくに、これは
Automakeがやるべきことではない。Autoconfがやる
べきことだ。
- ただし、aclocalに依存したサードパーティアプリケー
ションがあったり、ディレクトリ構造があったりす
る。そういった事情の説明。

*** 6.4 Autoconf macros supplied with Automake
- この節は割愛。

**** 6.4.1 Public Macros
**** 6.4.2 Obsolete Macros
**** 6.4.3 Private Macros

** 7 Directories
- 複雑もしくは大規模なプロジェクトでは、プログラ
ムやライブラリ毎にディレクトリをわけて、再帰的
にbuildをする。その方法について。

*** 7.1 Recursing subdirectories
- サブディレクトリに再帰する場合は、親ディレクト
リの'Makefile.am'に、

SUBDIRS = doc intl src test

などと書く。
- AutomakeはSUBDIRSをdepth-firstでディレクトリ構
造を処理していく。するとテストのように全てがビ
ルドされたあとにビルドすべきものが厄介だ。根の
ディレクトリのMakefile.inの作成は、ディレクトリ
ツリーから言えば、一番最後になるから。対処は簡
単。

SUBDIRS = doc intl src . test

*** 7.2 Conditional Subdirectories
- パッケージによっては、ビルドするものを「基本」と
「オプション」と分けたい場合もある。使わないもの
をビルドしてもしょうがないし。
- この節はその手法について。
- 手法は2つ。
- ひとつめは、Automake conditionalsを使う方法。こ
ちらが推奨。
- ふたつめは、Acutoconf AC_SUBST変数を使う方法。
- これらを説明するまえに、DIST_SUBDIRSを紹介。

**** 7.2.1 SUBDIRS vs. DIST_SUBDIRS
- SUBDIRSに含まれるのはビルド対象ディレクトリ。
- DIST_SUBDIRSに含まれるのは、配布対象ディレクト
リ。
- SUBDIRSがAutomake condigionalsによって、条件分岐
する形で書かれている場合、DIST_SUBDIRSには、それ
を勘案してビルドの可能性があるすべてディレクトリ
が含められる。
- 'make mainainer-clean', 'make distclean', 'make
dist' は再帰にあたってDIST_SUBDIRSを使う。それ
以外のターゲットは、SUBDIRSを使う。
- AC_SUBSTをSUBDIRSの引数につかっていると、
DIST_SUBDIRSはうまく動作しない。

**** 7.2.2 Subdirectories with AM_CONDITIONAL
- さて、Automake conditionalsの方法。
- たとえば、src/配下は常にビルド、opt/以下は指定
されればビルドとしたいとする。
- すると、configure.ac(?)には次のように書く。

...
AM_CONDITIONAL([COND_OPT], [test "$want_opt" = yes])
AC_CONFIG_FILES([Makefile src/Makefile opt/Makefile])
...

- そして、トップレベルのMakefile.amで次のようにす
る。

if COND_OPT
MAYBE_OPT = opt
endif
SUBDIRS = src $(MAYBE_OPT)

**** 7.2.3 Conditional Subdirectories with `AC_SUBST'
- AC_SUBSTを使う方法
- configure.ac(?)にはこう書く。
...
if test "$want_opt" = yes; then
MAYBE_OPT=opt
else
MAYBE_OPT=
fi
AC_SUBST([MAYBE_OPT])
AC_CONFIG_FILES([Makefile src/Makefile opt/Makefile])
...

- Makefile.amはこう書く。

SUBDIRS = src $(MAYBE_OPT)
DIST_SUBDIRS = src opt

- DIST_SUBDIRSは、手で設定しなければならない。

**** 7.2.4 Unconfigured Subdirectories
- ここでいうconditonalsというのは、buildするかど
うかということでありconfigureは全ての対象につい
て行う。
- よくある誤解は、configureもconditionalにできるの
では(もしくはそうなっているのでは)と考えてしまう
こと。
- configureをconditionalにするのは、かなりトリッ
キー。初心者はやるべきではない。
- その説明を少々。

*** 7.3 An Alternative Approach to Subdirectories
- 再帰的makeはよろしくないという考えもある。再帰
的makeは遅いし、error-proneであるという。
- 単一のMakefileで複数のディレクトリをカバーする
のがよいという。
- Automake はこの方式にも対応している。
- しかしまだ枯れていない。バグがちょこちょこ出て
いる。
- 実現方法の説明。

*** 7.4 Nesting Packages
- the GNU Build Systemでは、パッケージを任意の深
さまでネストできる。
- ただし、親プロジェクトの中に子プロジェクトのパッ
ケージが配置されており、親プロジェクトのSUBDIRS
に子プロジェクトのディレクトリが含まれているこ
とが必要。
- また、子プロジェクトのconfigureを生成するには、
configure.acにAC_CONFIG_SUBDIRSを書いて指定する
必要がある。

** 8 Building Programas and Libraries
*** 8.1 Building a program
- programをbuildするには、Automakeに、ソースがど
れか、リンクすべきライブラリがどれかを伝えなけ
ればならない。

**** 8.1.1 Defining program sources
- programsがインストールされうる場所は次のとおり。
bindir, sbindir, libexecdir, pkglibdir,
pkglibexecdir
- どこにもインストールしない(noinst_)という選択
肢もある。
- テストのためだけにビルドする(check_)という選
択肢もある。
- PROGRAMS primaryを用いる。
- 例。

bin_PROGRAMS = hello

- このときMakefile.inは、helloという名前のprogram
をビルドするコードを含む。
- この行が存在すると、このhelloという名前に関連し
たいくつかの変数が存在することが暗黙のうちに真
となる。
- それら変数は、Makefile.amにおいてはオプショナル
でありデフォルト値を持つ。それらを見ていく。

- hello_SOURCES
- デフォルト
hello_SOURCES = hello.c
- 手動設定例
hello_SOURCES = hello.c getopt.c getopt.h system.h
- こう書くと自動的に.c達から.oを生成するよう
になる。
- SOUCESに含まれているヘッダファイルは、配布物
に内包される。含まれていないヘッダは内包され
ない。
- configureが生成するヘッダ(config.hのこと?)は、
SOURCESに含めるべきではない。これは配布すべき
ものではないから。
- Lex(.l)とYacc(.y)ファイルもSOURCESに含めるこ
とができる。
**** 8.1.2 Linking the program
- connfigureが見付けることができないライブラリをリ
ンクするには、LDADDを使う。LDADDはリンカのオプショ
ンを格納するところではない。その目的には、
AM_LDFLAGSを使う。
- ビルトするプログラムが複数ある場合、LDADDは全て
のプログラムに対して適用される。
- prog_LDADDにて、progというプログラムについて上書
きできる。prog_LDADDには'-l', '-L', '-dlopen',
'-dlpreopen'を使うことができる。それ以外のオプ
ションはprog_LDFLAGに書くべき。
- 自身のパッケージの中でbuildするライブラリは、
prog_LDADDにて'-l'オプションで取り扱うべきではな
い。明示的にファイル名やパスを書くべきだ。サー
ドバーティのライブラリは'-l'でよい。
- う、prog_DEPENDENCIESのところの説明がいまひとつ
わからない。そもそもリンカの知識がないからだ。

**** 8.1.3 Conditional compilation of sources
- ビルドに使うソースを設定に従って変更する方法に
ついて。
- _SOURCESの値にconfigure substitutionを使うこと
はできない。たとえば、AC_SUBSTで定義したFOOにつ
いて、@FOO@や$(FOO)で参照すること。
- 2つの方法がある。

***** 8.1.3.1 Conditional compilcation using '_LDADD' substitution
- こんな感じ。
- Makefile.am
bin_PROGRAMS = hello
hello_SOURCES = hello-common.c
EXTRA_hello_SOURCES = hello-linux.c hello-generic.c
hello_LDADD = $(HELLO_SYSTEM)
hello_DEPENDENCIES = $(HELLO_SYSTEM)

- configure.ac
...
case $host in
*linux*) HELLO_SYSTEM='hello-linux.$(OBJEXT)' ;;
*) HELLO_SYSTEM='hello-generic.$(OBJEXT)' ;;
esac
AC_SUBST([HELLO_SYSTEM])
...

***** 8.1.3.2 Conditional compilation using Automake conditionals
- こんな感じ。
- Makefile.am

bin_PROGRAMS = hello
if LINUX
hello_SOURCES = hello-linux.c hello-common.c
else
hello_SOURCES = hello-generic.c hello-common.c
endif

- configure.ac
AM_CONDITIONALをつかってLINUXを定義する。

**** 8.1.4 Conditional compilation of programs
- ビルド対象であるプログラムを設定に従って変更する
方法について。

***** 8.1.4.1 Conditional programs using `configure' substitutions
- うーん。よくわからない。Autoconfを理解していな
いからだろう。

***** 8.1.4.2 Conditional programs using Automake conditionals
- これはわかりやすい。
bin_PROGRAMS = cpio pax
if WANT_MT
bin_PROGRAMS += mt
endif
if WANT_RMT
libexec_PROGRAMS = rmt
endif

*** 8.2 Building a library
- ライブラリをビルドするのは、プログラムをビルド
するのとおおよそ一緒。
- primaryは'LIBRARIES'である。
- _SOURCESの考え方はPROGRAMSと同じ。ただし、ライ
ブラリ名は正準化されるので、たとえば、libcpio.a
については、libcpio_a_SOURCESとなる。
- LDADDで指定すると静的リンクができる。例。

noinst_LIBRARIES = libcpio.a
libcpio_a_SOURCES = ...

bin_PROGRAMS = cpio
cpio_SOURCES = cpio.c ...
cpio_LDADD = libcpio.a

*** 8.3 Building a Shared Libraly
- Libtoolsは教材の方で理解すべしということで割愛。

**** 8.3.1 The Libtool Concept
**** 8.3.2 Building Libtool Libraries
**** 8.3.3 Building Libtool Libraries Conditionally
**** 8.3.4 Libtool Libraries with Conditional Sources
**** 8.3.5 Libtool Convenience Libraries
**** 8.3.6 Libtool Modules
**** 8.3.7 _LIBADD, _LDFLAGS, and _LIBTOOLFLAGS
**** 8.3.8 LTLIBOBJS and LTALLOCA
**** 8.3.9 Common Issues Related to Libtool's Use
***** 8.3.9.1 Error: 'required file' ./ltmain.sh' not found'
***** 8.3.9.2 Objects 'created with both libtool and without'

*** 8.4 Program and Library Variables
- プログラム(名)やライブラリ(名)に紐づいた変数の一
覧。
- 'maude'のところは正準プログラム名または正準ライ
ブラリ名となる。

`maude_SOURCES'
`EXTRA_maude_SOURCES'
`maude_AR'
`maude_LIBADD'
`maude_LDADD'
`maude_LDFLAGS'
`maude_LIBTOOLFLAGS'
`maude_DEPENDENCIES'
`maude_LINK'
`maude_CCASFLAGS'
`maude_CFLAGS'
`maude_CPPFLAGS'
`maude_CXXFLAGS'
`maude_FFLAGS'
`maude_GCJFLAGS'
`maude_LFLAGS'
`maude_OBJCFLAGS'
`maude_RFLAGS'
`maude_UPCFLAGS'
`maude_YFLAGS'
`maude_SHORTNAME'

*** 8.5 Default _SOURCES
- _SOURCESのデフォルト設定の様子。

*** 8.6 Special handling for LIBOBJS and ALLOCA
- わからない。。。

*** 8.7 Variables used when building a program
- AutomakeがつくったMakefileの中で使われている変
数の紹介。
- Autoconf 由来

`CC', `CFLAGS', `CPPFLAGS', `DEFS', `LDFLAGS', and `LIBS'

- Automake 作成

`AM_CPPFLAGS', `INCLUDES', `AM_CFLAGS',
`COMPILE', `AM_LDFLAGS', and `LINK'

*** 8.8 Yacc and Lex support
- Automakeは、yaccやlexの中間ファイルはソースと同
じであるとする。

foo.y -> foo.c -> foo.o

伝統的には、y.tab.cなところ。

- 拡張子によって生成されるソースの種類がかわる。

.y -> .c
.yy -> .cc
.y++ -> .c++
.yxx -> .cxx
.ypp -> .cpp

- lexの拡張子についても同様。
- 中間ファイルはSOURCESに列記してはいけない。yacc
or lex のソースだけ示すこと。
- 中間ファイルは配布物に含まれる。ユーザがyaccや
lexをもっていないかもしれないから。

- configure.acには`AC_PROG_YACC'マクロを書く。こ
れが'YACC'変数を設定する。
- 'yacc'が起動されるとき、'YFLAGS'と'AM_YFLAGS'と
をオプションとして渡される。前者はユーザ向け後
者はメンテナ向け。
- 'AM_YFLAGS'は'-d'オブションを指定するために使わ
れる。('-d'はヘッダファイルも生成するというオプ
ション) Automakeはこのオプションがあるとき、そ
のヘッダファイルのルールを適切に設定する。
- ただし、そのヘッダがどこで使われるかはメンテナ
次第であるからメンテナが自分で設定する。通常、
BUILT_SOURCESEに書いて、他のビルドが始まる前に
存在するようにする。例。

BUILT_SOURCES = parser.h
AM_YFLAGS = -d
bin_PROGRAMS = foo
foo_SOURCES = ... parser.y ...

- 続いてlex。

- configure.acには、AC_PROG_LEX。
- LFLAGSとAM_FLAGS、あります。

- もし、AM_MAINTAINER_MODEが使われているなら、
maitainer-modeがオンのときだけ、yaccやlexのため
のリビルドルールは有効になる。(ファイルを削除し
たときは当然有効になるが)

- lexまたはyaccのソースがあるときは、'automake
-i'は自動的に'ylwrap'というプログラムをインストー
ルする。これは、yacc自体の出力ファイル名が固定な
ので、それを回避するためのラッパ。

- なおyaccの出力は、常に同じシンボルを使うため、2
つのyacc生成パーサをひとつの実行ファイルにリン
クすることはできない。

- それを回避するためのrenaming hack。

#define yymaxdepth c_maxdepth
#define yyparse c_parse
#define yylex c_lex
#define yyerror c_error
#define yylval c_lval
#define yychar c_char
#define yydebug c_debug
#define yypact c_pact
#define yyr1 c_r1
#define yyr2 c_r2
#define yydef c_def
#define yychk c_chk
#define yypgo c_pgo
#define yyact c_act
#define yyexca c_exca
#define yyerrflag c_errflag
#define yynerrs c_nerrs
#define yyps c_ps
#define yypv c_pv
#define yys c_s
#define yy_yys c_yys
#define yystate c_state
#define yytmp c_tmp
#define yyv c_v
#define yy_yyv c_yyv
#define yyval c_val
#define yylloc c_lloc
#define yyreds c_reds
#define yytoks c_toks
#define yylhs c_yylhs
#define yylen c_yylen
#define yydefred c_yydefred
#define yydgoto c_yydgoto
#define yysindex c_yysindex
#define yyrindex c_yyrindex
#define yygindex c_yygindex
#define yytable c_yytable
#define yycheck c_yycheck
#define yyname c_yyname
#define yyrule c_yyrule

- このC_の部分をいろいろ変える。

*** 8.9 C++ Support
- 短い。割愛。

*** 8.10 Objective C Support
- 短い。割愛。

*** 8.11 Unified Parallel C Support
- 短い。割愛。

*** 8.12 Assembly Support
- 短い。割愛。

*** 8.13 Fortram 77 Support
- 割愛。
**** 8.13.1 Preprocessing Fortran 77
**** 8.13.2 Compiling Fortran 77 Files
**** 8.13.3 Mixing Fortran 77 With C and C++
***** 8.13.3.1 How the Linker is Chosen

*** 8.14 Fortran 9x Support
- 短い。割愛。

**** 8.14.1 Compiling Fortran 9x Files
*** 8.15 Java Support
- 短い。割愛。

*** 8.16 Vala Support
- 短い。割愛。

*** 8.17 Support for Other Languages
- このマニュアルに載っている言語以外は対応してい
ないと考えてよい。

*** 8.18 Automatic de-ANSI-fication
- この節の内容は旧式。使うべきはない。
- k & r cから ansi cへの移行期に、ansiで書いたソー
スをk & r cに変換する機能としてできた。
*** 8.19 Automatic dependency tracking
- Automakeのモデルは、依存関係の解析はビルド時に
行う、というもの。
- これを実現するために、すべてのコンパイルはラッ
パプログラムdepcomp経由で実行される。
- depcompは、各種多様なコンパイラそれぞれに対して
どのような形式で依存関係情報を記述すべきかを熟
知している。

*** 8.20 Support for executable extensions
- '.exe'の取扱い。割愛。


こつこつ。

2009年11月17日火曜日

【Automake】Infoを読む (1)

結局Infoをごりごり読んでいる。最近このパターンが多い。
教材の本は、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に属するファイルは、デフォルトで
は配布物にならない。なので、このような指定をす
る。


こつこつ。