はじめに
Autotoolsを用いた Makefile生成の流れを勉強したので,メモがてらまとめました.
AutotoolsはLinuxなら各々のパーケージ管理ツールからインストールできます.MacOSでも Homebrew経由で簡単に入れられます.
$ brew install automake
$ brew install autoconf
今回の例として,ディレクトリ構造は次のようなものを想定しています.
- project
- src
- book.h
- book.cpp
- main.cpp
- src
1. Makefileの生成
1.1 Makefile.amの作成
プロジェクトルートおよびソースが入っている全てのサブディレクトリ内に Makefile.amを作成します.以下は一例です.
# ソースファイルの入っているサブディレクトリの指定
SUBDIRS = src
# 作成する実行可能ファイルの名前
bin_PROGRAMS = test
# Cコンパイラへ渡すオプション(ここではコメントアウトしています)
# test_CFLAGS = -g
# C++コンパイラへ渡すオプション
test_CXXFLAGS = -g
# 使用しているライブラリ(ここではコメントアウトしています)
# test_LDADD = -lm
# test生成に必要なソースコード
test_SOURCES = main.cpp book.h book.cpp
### 以下はライブラリを作成する際の設定(オプション)
# インストールするヘッダファイル
include_HEADERS = book.h
# インストールする際のライブラリ名
lib_LIBRARIES = libbook.a
# Cコンパイラへ渡すオプション(ここではコメントアウトしています)
# libbook_a_CFLAGS = -g
# C++コンパイラへ渡すオプション
libbook_a_CXXFLAGS = -g
# ライブラリ生成に必要なソースコード
libbook_a_SOURCES = book.h book.cpp
test
という実行可能ファイルに関するオプション・依存ファイル等を設定する際は,接頭辞として **'test_'**を付与しています.(test
という名前以外の実行可能ファイルを作成する際はこれらの接頭辞も変えて下さい)
ライブラリ名についても同様です.こちらは拡張子の前の **'.'**もアンダーバーに変えてください.
1.2 configure.acの作成
プロジェクトルートでautoscan
を実行します.
$ autoscan
そうすると, project直下に configure.scanというファイルが作られます.このファイル名を次のように変更します.
$ mv configure.scan configure.ac
その後, configure.acを次のように変更します.
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.69])
AC_INIT([test], [1.0], [your@address.com]) # プロジェクトに合わせてこの行を変更
AM_INIT_AUTOMAKE # この行を新規追加
AC_PROG_RANLIB # ライブラリを作成するならこの行を新規追加
AC_CONFIG_SRCDIR([src/book.cpp])
AC_CONFIG_HEADERS([config.h])
# Checks for programs.
AC_PROG_CXX
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_CONFIG_FILES([Makefile
src/Makefile])
AC_OUTPUT
1.3 Makefile.inの生成
初めに, NEWS, README, AUTHORS, ChangeLogというファイルを(空で構いませんので)作成します.
$ touch NEWS README AUTHORS ChangeLog
この手順は configure.acの AM_INIT_AUTOMAKEの行を次のように変更することで省略することができます.
AM_INIT_AUTOMAKE([foreign])
既存のファイル,例えば README.md等を使用したい場合はこのオプションを設定すると良いです.(GNUの標準に従っていないことになりますが)
次に,下記のコマンドを実行していき, Makefile.inを生成します.
$ autoheader
$ aclocal
$ automake -a -c
1.4 configureスクリプトの生成
次のコマンドでconfigure
スクリプトを生成します.
$ autoconf
これでプロジェクトのconfigure
スクリプトを作成することができました.
1.5 Makefileの生成
$./configure
を実行することで Makefileが生成されます.後は,make
を実行することで実行可能ファイルを生成,make install
を実行することでライブラリをインストールすることができます.やったぜ🎉🎉🎉
2. バージョン管理
説明した手順を実行していくと多数の中間ファイルが生成されますが,結局次のファイルのみをバージョン管理の対象とすればよさそうです.
- 各々の Makefile.am
- configure.ac
- (作成していれば) NEWS README AUTHORS ChangeLog
3. プロジェクトの公開
GitHub上でプロジェクトを公開する際は,次のようなスクリプトも追加しておくとユーザはより簡単に Makefileを作成できるようになります.
#!/bin/sh
autoreconf --install --force || exit 1
echo "Please run ./configure, make and make install."
autoreconf
というのは,autoheader
aclocal
automake
autoconf
等をまとめてやってくれるコマンドです.
4. 最後に
これでもうゴリゴリ Makefileを書かなくて済む…
Autotoolsに関してはまだまだ全くの初心者ですので,不適切な表現をしている箇所がありましたらコメントにて指摘して頂けると幸いです.