autotoolsメモ

# Autotools の使い方忘備録

## 概要

仕事でC++を使う機会があったので、せっかくだから ./configure && makeできるいつものあの形式でインストールしたいなあと考えて、たどり着いたautotools。
autotoolsは初学者のため使い方がわからないのでメモ。一回雛形ができてしまえば後は楽そう、かなあ、なれるかなあ。

一旦いい加減に書きなぐってあるため、あとで修正予定。。。

## プロジェクトの構成

とりあえず以下のように決めてしまった。
srcの下に1フォルダ1出力物（実行可能ファイル、la、soなど）が生成されるようにする。
includeにはヘッダファイルを配置。これはライブラリの場合などはそのまま配布物に含むようにする。

<pre>

<src_topdir>/
  src/
    [any_dirs]/
    <any>.cpp
  include/
    <any>.h

</pre>

## make までの流れ

1. top_srcdir に移動
1. top_srcdirとsrc,include に Makefile.am ファイルを作成する
1. autoscan を実行 configure.scan が作成される
1. mv configure.scan configure.ac とする
1. configure.acを編集
1. autoheader を実行
1. aclocal を実行
1. automake --add-missing --copy を実行  Makefile.am から Makefile.in が作成される
1. autoconf を実行 configure が作成される

ここまで来ると後はいつものコマンド

```shell
$ ./configure
$ make
```

でビルドが可能となる。

この後編集する場合は

```shell
$ autoreconf -i
```

で configure まで作ってくれる（というかautoreconfだけで大丈夫ぽいのだけど）

## 各ファイルの中身

あくまで参考例として。。。
以下の構造になります。自分で作る、もしくは編集するファイルを上の構造に追加。
<pre>
\<src_topdir\>/
    am.conf
    Makefile.am
    configure.ac
    src/
        sample.cpp
        Makefile.am
    include/
        sample.h
        Makefile.am
</pre>

### Makefile.am

すべてのMakefile.amから参照できるようの広域設定ファイルを作っておく。
ファイル名はなんでもいいけど、 am.conf としておく。

#### am.conf

```shell
AM_CPPLAGS= <C++ コンパイラオプション>
```

変数は適当に定義して構わない（がAM_ LT_ AC_ 等autotoolsが予約しているものは使わないように）

#### \<top_srcdir\>/Makefile.am

```shell
include $(top_srcdir)/am.conf
SUBDIRS = src include
ACLOCAL_AMFLAGS = -I m4
```
include で最初に作った am.confを読み込んでおく。
SUBDIRS にmake対象のディレクトリの一覧を記載する。
ACLOCAL_AMFLAGSは指定しておかないと怒られるので指定しておく。

#### \<top_srcdir\>/src/Makefile.am

##### 実行可能ファイルの場合

```shell
include $(top_srcdir)/am.conf
bin_PROGRAMS = <exe_file_name>
<exe_file_name>_SOURCES = sample.cpp sample.h
<exe_file_name>_LDADD = <any_link_archive_or_shared_objects>
ACLOCAL_AMFLAGS = -I m4
```

bin_PROGRAMS の値が出力される実行可能ファイル名となる
_SOURCESの前はbin_PROGRAMSで指定した値となる。（LDADDも同じ）コンパイルするソースファイルを列挙する
_LDADDについてはリンクするライブラリがなければ指定しない。

##### ライブラリの場合

.laファイルと.aファイル、.soファイルを作ります。

<dl>
<dt>.la</dt>
<dd>libtools のライブラリファイル。テキストファイル。プラットフォーム間の依存を解決するためのファイルらしい</dd>
<dt>.a</dt>
<dd>archiveファイル。Windowsで言うところのlibファイルに相当？静的リンクをする際に使用</dd>
<dt>.so</dt>
<dd>shared objectファイル。Windowsで言うところのdllファイルに相当。動的リンクをする際に使用</dd>
</dl>

```shell
lib_LTLIBRARIES = lib<name>.la
<lib<name>>_la_SOURCES = libsample.cpp
<lib<name>>_la_LIBADD = <any_link_archive_or_shared_objects>
```

実行可能ファイルと違って libtoolにわたすパラメータを記載。Linux界隈のライブラリは
lib\<name\>.so などと lib をprefixに持つファイル名が伝統なので、それに従う。
リンクするライブラリはLDADDでなくLIBADDとなる。
LDADDもLIBADDもファイルの拡張子まで含めフルパスを指定する必要がある。

#### \<top_srcdir\>/include/Makefile.am

```shell
include $(top_srcdir)/am.conf
noinst_HEADERS = sample.h
```

noinst_HEADERS にヘッダファイルを定義。noinstとかはたくさん種類があるので適宜使い分ける。
大まかには以下をよく使う、かな？？

<dl>
<dt>noinst</dt>
<dd>インストールされないヘッダファイル。実行可能ファイル作成時などは外部にヘッダを提供する必要がないのでこれを指定</dd>
<dt>include</dt>
<dd>インストールされるヘッダファイル。ライブラリの作成時などヘッダファイルを提供する必要がある場合に指定</dd>
<dt>nobase</dt>
<dd>例えば func/header.h のようにディレクトリ構造になっている場合、nobaseをつけないとインストール時に funcが省かれ &lt;include_dir&gt;/header.hとしてインストールされてしまう。nobaseをつけると&lt;include_dir&gt;/func/header.h にインストールされるようになる。基本的にはnobase_include_HEADERS などとして使う。（includeやdistの前につける）</dd>
</dl>

### configure.ac

autoscanしてできたファイルを例に。。。

<pre>
  1 #                                               -*- Autoconf -*-
  2 # Process this file with autoconf to produce a configure script.
  3 
  4 AC_PREREQ([2.69])
  5 AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
  6 AC_CONFIG_SRCDIR([include/prog.h])
  7 AC_CONFIG_HEADERS([config.h])
  8 
  9 # Checks for programs.
 10 AC_PROG_CXX
 11 AC_PROG_CC
 12 
 13 # Checks for libraries.
 14 
 15 # Checks for header files.
 16 
 17 # Checks for typedefs, structures, and compiler characteristics.
 18 AC_TYPE_SIZE_T
 19 
 20 # Checks for library functions.
 21 AC_CHECK_FUNCS([memset strcasecmp])
 22 
 23 AC_CONFIG_FILES([Makefile
 24                  include/Makefile
 25                  src/Makefile])
 26 AC_OUTPUT
</pre>

#### AC_INIT

<dl>
<dt>FULL-PACKAGE-NAME</dt>
<dd>実行可能ファイルやライブラリの名前</dd>
<dt>VERSION</dt>
<dd>1.0などのバージョン</dd>
<dt>BUG-REPORT-ADDRESS</dt>
<dd>バグレポート用のメールアドレス。通常作者のもの</dd>
</dl>

#### AC_CONFIG_SRCDIR

ソースディレクトリのファイル一つを指しておく。代表的なのがいいのかな？

#### AC_CONFIG_FILES

makeするMakefileの場所をすべて指定。Makefile.amを各所先に作っておけば自動的に作成される。

#### その他追加項目など

|値　　　　　　　　　　　　　　|何を指定する？|
|:---------------------------|:-------------|
|AM_INIT_AUTOMAKE([foreign])|おまじない。foreignは必要なファイルを勝手に作るオプション|
|LT_INIT|ライブラリを作る際に必要|
|AM_PROG_LIBTOOL|ライブラリを作る際に必要|
|AC_CONFIG_MACRO_DIRS([m4])|libtoolを使うときのおまじない|

編集後のファイル

<pre>
  1 #                                               -*- Autoconf -*-
  2 # Process this file with autoconf to produce a configure script.
  3 
  4 AC_PREREQ([2.69])
  5 AC_INIT([program], [1.0], [mail@mail.mail])
  6 AC_CONFIG_SRCDIR([src/program.cpp])
  7 AC_CONFIG_HEADERS([config.h])
  8 AM_INIT_AUTOMAKE([foreign])
  9 
 10 # Checks for programs.
 11 AC_PROG_CXX
 12 AC_PROG_CC
 13 
 14 # Checks for libraries.
 15 
 16 # Checks for header files.
 17 
 18 # Checks for typedefs, structures, and compiler characteristics.
 19 AC_TYPE_SIZE_T
 20 
 21 # Checks for library functions.
 22 AC_CHECK_FUNCS([memset strcasecmp])
 23 
 24 AC_CONFIG_FILES([Makefile
 25                  include/Makefile
 26                  src/Makefile])
 27 AC_OUTPUT
</pre>