Autotools の使い方忘備録
概要
仕事でC++を使う機会があったので、せっかくだから ./configure && makeできるいつものあの形式でインストールしたいなあと考えて、たどり着いたautotools。
autotoolsは初学者のため使い方がわからないのでメモ。一回雛形ができてしまえば後は楽そう、かなあ、なれるかなあ。
一旦いい加減に書きなぐってあるため、あとで修正予定。。。
プロジェクトの構成
とりあえず以下のように決めてしまった。
srcの下に1フォルダ1出力物(実行可能ファイル、la、soなど)が生成されるようにする。
includeにはヘッダファイルを配置。これはライブラリの場合などはそのまま配布物に含むようにする。
/
src/
[any_dirs]/
.cpp
include/
.h
make までの流れ
- top_srcdir に移動
- top_srcdirとsrc,include に Makefile.am ファイルを作成する
- autoscan を実行 configure.scan が作成される
- mv configure.scan configure.ac とする
- configure.acを編集
- autoheader を実行
- aclocal を実行
- automake --add-missing --copy を実行 Makefile.am から Makefile.in が作成される
- autoconf を実行 configure が作成される
ここまで来ると後はいつものコマンド
$ ./configure
$ make
でビルドが可能となる。
この後編集する場合は
$ autoreconf -i
で configure まで作ってくれる(というかautoreconfだけで大丈夫ぽいのだけど)
各ファイルの中身
あくまで参考例として。。。
以下の構造になります。自分で作る、もしくは編集するファイルを上の構造に追加。
\/
am.conf
Makefile.am
configure.ac
src/
sample.cpp
Makefile.am
include/
sample.h
Makefile.am
Makefile.am
すべてのMakefile.amから参照できるようの広域設定ファイルを作っておく。
ファイル名はなんでもいいけど、 am.conf としておく。
am.conf
AM_CPPLAGS= <C++ コンパイラオプション>
変数は適当に定義して構わない(がAM_ LT_ AC_ 等autotoolsが予約しているものは使わないように)
<top_srcdir>/Makefile.am
include $(top_srcdir)/am.conf
SUBDIRS = src include
ACLOCAL_AMFLAGS = -I m4
include で最初に作った am.confを読み込んでおく。
SUBDIRS にmake対象のディレクトリの一覧を記載する。
ACLOCAL_AMFLAGSは指定しておかないと怒られるので指定しておく。
<top_srcdir>/src/Makefile.am
実行可能ファイルの場合
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ファイルを作ります。
- .la
- libtools のライブラリファイル。テキストファイル。プラットフォーム間の依存を解決するためのファイルらしい
- .a
- archiveファイル。Windowsで言うところのlibファイルに相当?静的リンクをする際に使用
- .so
- shared objectファイル。Windowsで言うところのdllファイルに相当。動的リンクをする際に使用
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
include $(top_srcdir)/am.conf
noinst_HEADERS = sample.h
noinst_HEADERS にヘッダファイルを定義。noinstとかはたくさん種類があるので適宜使い分ける。
大まかには以下をよく使う、かな??
- noinst
- インストールされないヘッダファイル。実行可能ファイル作成時などは外部にヘッダを提供する必要がないのでこれを指定
- include
- インストールされるヘッダファイル。ライブラリの作成時などヘッダファイルを提供する必要がある場合に指定
- nobase
- 例えば func/header.h のようにディレクトリ構造になっている場合、nobaseをつけないとインストール時に funcが省かれ <include_dir>/header.hとしてインストールされてしまう。nobaseをつけると<include_dir>/func/header.h にインストールされるようになる。基本的にはnobase_include_HEADERS などとして使う。(includeやdistの前につける)
configure.ac
autoscanしてできたファイルを例に。。。
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
AC_INIT
- FULL-PACKAGE-NAME
- 実行可能ファイルやライブラリの名前
- VERSION
- 1.0などのバージョン
- BUG-REPORT-ADDRESS
- バグレポート用のメールアドレス。通常作者のもの
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を使うときのおまじない |
編集後のファイル
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