|
1: 2016-04-07 (木) 09:10:13 yuji |
| + | #topicpath |
| + | #contents |
| | | |
| + | * autotoolsのすすめ [#hb90ff68] |
| + | |
| + | Visual Studioなんか使いたくない私みたいな人は,Makefileを手を抜いて作成したいわけです。~ |
| + | そんな時に,Makefileを簡単に作成するためのツールがautotoolsです。 |
| + | |
| + | 通常,Makefileにはコンパイルする際の諸設定,リンクする際の諸設定,処理順序などを逐一記述しておかなくてはならない。しかし,これは,Makefileの作成に慣れていないと面倒な作業です。~ |
| + | |
| + | そこで,Makefileよりももっと簡単な設定ファイルMakefile.amだけを記述して,あとの細かなところの設定記述はツールを使って作り出せれば便利です。このような時に使用するのが,autoconf,automake,autoreconf,Libtoolなどのautotools。 |
| + | |
| + | ** makeとMakefile [#cdabaedb] |
| + | makeは,そのディレクトリ内にあるMakefileを参照して,書かれた通りにコンパイルやリンクを行っていくコマンドツールです。 |
| + | 簡単なMakefileの例だと, |
| + | sample.o : sample.c |
| + | gcc sample.c -o sample.exe |
| + | 単に1つのソースファイルをコンパイルするだけならmakeをする必要はないけど,複雑な依存関係をもっているライブラリを使用したり,複数のファイルを使ってコンパイルするときなんかは,いちいち毎回コマンドを打って手作業でこれをやると大変なので,makeを使うわけです。 |
| + | |
| + | この時はMakefileを一度作っておけば,その後はmakeと打てば複数ファイルをコンパイル出来たり,必要なライブラリをリンク出来ます。依存関係にあるファイルの実行ファイルが既に出来ている時は,そのファイルのタイムスタンプを見ながら,ソースファイルに更新があったとかを自動的に認識して,コンパイルはしないで無駄な処理をしない…とか,そういうことも自動で行ってくれます。 |
| + | |
| + | ** configureってなに? [#ec26f595] |
| + | |
| + | 他人にソースを配布するときは,手軽にコンパイルができるようにMakefileも一緒に配布したい。~ |
| + | しかし,相手の環境によってコンパイルの仕方が変わってしまうかもしれないので(ライブラリが見つからない〜とか,違うOS上で実行するとか),単にMakefileを一緒に配布しても上手くいかないことも多いわけです。~ |
| + | そこで登場するのが,''configure''コマンド。~ |
| + | ''configure''は,実行すると,その実行した環境に合った''Makefile''を生成してくれるシェルスクリプト。これを''Makefile''の代わりにソースコードと一緒に配布することで, |
| + | $ ./configure |
| + | $ make |
| + | $ make install |
| + | という手順でコンパイル,インストール,が可能になったりします。この時,たとえ相手の実行環境が違う場合であっても,configureがその違いを吸収してくれます。 |
| + | |
| + | configureを手作業で一から書くのはめんどうです。なので,configureを自動で生成してくれるツールautotoolsの出番となります。~ |
| + | これらのことにより,Makefileを手を抜いて作成することも,誰かにコンパイルも可能なソースコードを渡すことも出来るようになります。 |
| + | |
| + | ** autotoolsを使えるようにする [#af662a00] |
| + | |
| + | [[MinGW>/開発/toolchain/MinGW]]をインストールして使えるようになっていれば,これらのツールもインストールされています。~ |
| + | [[MinGW>/開発/toolchain/MinGW]]をインストールしていない場合は,さっさとインストールしちゃいましょう。 |
| + | |
| + | ** とりあえず使ってみる [#k37cdf00] |
| + | *** サンプルの用意 [#tfc46514] |
| + | まずは試しに,こんなソースのファイルsample.cを用意してみる |
| + | #include <stdio.h> |
| + | |
| + | int main(void) |
| + | { |
| + | printf("Hello Yuji!\n"); |
| + | |
| + | return 0; |
| + | } |
| + | |
| + | ''Makefile.amを作成''~ |
| + | 移植性の高いMakefileを作るためのMakefile.acの雛形(Makefileの大元)になる''Makefile.am''を作成する。~ |
| + | bin_PROGRAMS = sample |
| + | sample_SOURCES = sample.c |
| + | これは,sample.exeはsample.cから作られる場合です。 |
| + | |
| + | %%しかし今回は,何も記述していない空のファイルでも大丈夫です。%% |
| + | $ touch Makefile.am |
| + | %%Editorでも右クリックで新規ファイル作成でもとにかくファイルを作ればOK%% |
| + | |
| + | つまり,''必要なファイルとしては,ソースコード以外にはMakefile.amだけ。'' |
| + | |
| + | *** autoscanでconfigure.acを生成する [#x4212841] |
| + | $ autoscan |
| + | $ 好きなEditorでconfigure.scanを編集する |
| + | $ mv configure.scan configure.ac |
| + | autoscanを使ってconfigure.scanを作成した後,ファイルを以下のように編集します。 |
| + | # -*- Autoconf -*- |
| + | # Process this file with autoconf to produce a configure script. |
| + | |
| + | AC_PREREQ([2.68]) |
| + | AC_INIT([sample], [1.0.0], [y-ueno@nalux.co.jp]) <-- 編集 |
| + | AC_CONFIG_SRCDIR([sample.c]) |
| + | AC_CONFIG_HEADERS([config.h]) |
| + | AM_INIT_AUTOMAKE([foreign 1.11.1]) <-- 追加 |
| + | |
| + | # Checks for programs. |
| + | 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]) |
| + | AC_OUTPUT |
| + | AC_INITマクロにプログラムの情報を入れることと,AM_INIT_AUTOMAKEマクロを追加します。~ |
| + | AM_INIT_AUTOMAKEは,automakeを使うことをautoconfに伝えるマクロのようです。 |
| + | $ automake --version |
| + | で表示されたバージョンを,AC_INIT_AUTOMAKEに入れます。この時の引数はGNU projectとして作るわけではないので,foreignにします。~ |
| + | AC_PROG_CCは,使用するCコンパイラの設定で,configureが環境変数CCを使用するという意味になる。~ |
| + | AC_CONFIG_FILES([Makefile])は,Makefile.inを雛形にしてMakefileを生成しろという意味になる。 |
| + | |
| + | これが終わったら,ファイル名を''configure.ac''にリネームします。 |
| + | |
| + | *** autoreconfでconfugureを作成する [#k5c92cfd] |
| + | 普通は,この後autoconf/automakeを使用してconfigureを作成するわけだけど,この手順を手軽に行うautoreconfを使うと便利。 |
| + | $ autoreconf -i |
| + | これで,configureが作成される。 |
| + | AM_INIT_AUTOMAKE([foreign 1.11.1])の効果で,必要なファイルが追加される。特にMakefile.inのおかげで,移植性が高いものになっている。 |
| + | |
| + | *** configureを実行してMakefileを作成 [#s6e839f0] |
| + | $ ./configure |
| + | を実行すると,Makefileがめでたく作成される。 |
| + | |
| + | *** コンパイルと実行 [#q402389e] |
| + | $ make |
| + | $ sample |
| + | Hello Yuji! |
| + | makeコマンドでコンパイルされ,sample.exeが出来ます。実行してみると無事動きました。 |
| + | |
| + | *** make distしてみる [#q99e7a68] |
| + | $ make dist |
| + | を実行すると,sample-1.0.0.tar.gzが作成される。~ |
| + | 他の人にソースコード類を渡すのにはこのファイルを渡せばOKです。便利ですね。~ |
| + | この時作られるファイル名は,configure.acに記述した |
| + | AC_INIT([sample], [1.0.0], [y-ueno@nalux.co.jp]) |
| + | から作られます。 |
| + | |
| + | $ make distcheck |
| + | でパッケージを作成して,正しくプログラムが作成できるかどうかを実際に試してチェックすることが出来ます。~ |
| + | %%中身が空のMakefile.amでもMakefileが出来るとは%%,さすがGNUツールです。 |
| + | |
| + | * Autotools(autoconfとautomake)による作業の流れ [#e2ed497c] |
| + | #ref(autotools.png) |