LE社のエンジニアたちの風がふくまま気の向くまま本音コラム

configure の作り方 ~まだ Makefile を書いていませんか?~

»

 リーディング・エッジ社の末広です。

 Makefile を生成してくれる「configureスクリプト」の作り方を簡単に紹介します。

 configureを利用する利点は以下のようなものです。

  • 何も書かなくてもヘッダの依存関係を自動で調べてビルドする
  • yacc や lex といったツールも拡張子で判断してバイナリにしてくれる
  • ビルド環境のヘッダやライブラリの有無のチェックを自動で行ってくれる
  • configure の実行時のマシン環境をlogとして保存

 中でもトラブルシューティングに必要なマシン環境のlogは重宝します。

 configure は autotools というツール群によって作ることができます。

■autotools とは

 autotools は、automake,autoconfig などの autoXX と名付けられたツールの総称で、ユーザーからは、 configure という実行形式で提供されるものをいいます。

 以下のような設定をした Makefile 、ヘッダファイルの生成を行います。

  • C,C++を利用するうえで、OSやコンパイラなどの環境に依存する、システムコール、ライブラリが存在しているかのチェック
  • コンパイル、インストールするための環境を自動設定
  • インストール先の設定
  • クロス用のツールチェイン(コンパイラ、リンカ、スプリッタ等)を Path から検索を行いビルドの設定

 これによって、Mac OS、商用UNIX、Linux、BSD、Windows、TOPPERS、OSなどの環境の組み合わせでも、単一のソースコードで実行可能なソフトウェアを開発するための基盤となっています。

クロスコンパイル環境であっても、configureの引数--hostに toolprefix (armの場合、arm-target-linux-gnueabiなど)を記述することで、自動的に必要なツールチェイン・ライブラリの有無を調べてくれます。ただし、新しいバージョンでは――hostを指定する場合――buildにビルドするマシンのアーキテクチャを記述する方法が推奨されています。

■configure作成スクリプト

 あまり使わないのですぐに忘れてしまうため、自分はテンプレートを作って、 congfigure を作成するまでを全部やってくれるシェルを利用しています。

そのシェルが以下のようなものになります。

=========

#!/bin/sh
cat >>Makefile.am <

#testと言うプログラムをビルド、インストールするためのサンプル

#ビルドしてインストールするプログラム名
bin_PROGRAMS=test

#test_CFLAGSはtestをコンパイルする際のコンパイルオプション
#../configureなどルートディレクトリ以外で実行した時のインクルードディレクトリの指定
test_CFLAGS=-g -I @srcdir@/include/
#test_CXXFLAGS はC++ の場合のコンパイルオプション
#test_CXXFLAGS is test package C++ compiler option

#test_LDADDはtestが利用するライブラリ
test_LDADD= -lm

#test_SOURCESはtestのソースコード(複数可)
test_SOURCES=test.c

#ライブラリ用の設定
#インストールするヘッダファイル
include_HEADERS=test.h
#ライブラリ作成する際のライブラリ名
lib_LIBRARIES=libtest.a
#libtest.aのソースコード
libtest_a_SOURCES

#ビルドしないけどインストールするファイル
#prefixオプションで指定したディレクトリ以下の/share/パッケージ名に配置される
pkgdata_DATA=setting
#C言語からdefineとして参照する
AM_CFLAGS = -DEVENTTABLE_CSV='"$(pkgdatadir)/setting"'

#再帰的にmakeを実行するディレクトリの指定
SUBDIRS= subdir subdir2/subsubdir
EOF
vim Makefile.am
autoscan
touch NEWS README AUTHORS ChangeLog
awk '{if(/AC_INIT/){ print "AC_INIT(FULL-PACKAGE-NAME, 0.0.1, name@hoge.jp)";print"AM_INIT_AUTOMAKE" }else{ print $0} }' configure.scan > configure.ac
vim configure.ac
aclocal
autoheader
autoconf
automake -a -c

=========

 プログラマにとって、便利でもあり面倒な Makefile は、コンパイル環境構築には欠かせないものです。ところが、ソースコードのフォルダ管理と各種ツールのバス設定が煩雑になってくるとメンテナンスが難しくなってきます。最近の統合開発環境では GUI によって自動生成を行なってくれる場合もありますが、昔からある GNU ツールの開発環境の「configure」スクリプトが基本となっているので一度チャレンジしてみてはいかがでしょうか?

より詳しい設定などは書籍やman、infoなどをご覧ください

GNU Autoconf/Automake/Libtool

Comment(0)