LoginSignup
67
61

More than 5 years have passed since last update.

Autotoolsを使ってプロジェクトのMakefileを生成する

Last updated at Posted at 2016-02-07

はじめに

Autotoolsを用いた Makefile生成の流れを勉強したので,メモがてらまとめました.

AutotoolsはLinuxなら各々のパーケージ管理ツールからインストールできます.MacOSでも Homebrew経由で簡単に入れられます.

$ brew install automake
$ brew install autoconf

今回の例として,ディレクトリ構造は次のようなものを想定しています.

  • project
    • src
      • book.h
      • book.cpp
      • main.cpp

1. Makefileの生成

1.1 Makefile.amの作成

プロジェクトルートおよびソースが入っている全てのサブディレクトリ内に Makefile.amを作成します.以下は一例です.

Makefile.am
# ソースファイルの入っているサブディレクトリの指定
SUBDIRS = src
src/Makefile.am
# 作成する実行可能ファイルの名前
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を次のように変更します.

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の生成

初めに, NEWSREADMEAUTHORSChangeLogというファイルを(空で構いませんので)作成します.

$ touch NEWS README AUTHORS ChangeLog

この手順は configure.acAM_INIT_AUTOMAKEの行を次のように変更することで省略することができます.

configure.ac
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を作成できるようになります.

bootstrap.sh
#!/bin/sh
autoreconf --install --force || exit 1
echo "Please run ./configure, make and make install."

autoreconfというのは,autoheader aclocal automake autoconf等をまとめてやってくれるコマンドです.

4. 最後に

これでもうゴリゴリ Makefileを書かなくて済む…
Autotoolsに関してはまだまだ全くの初心者ですので,不適切な表現をしている箇所がありましたらコメントにて指摘して頂けると幸いです.

参考

67
61
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
67
61