1: 2016-04-07 (木) 09:10:13 yuji | 現: 2020-12-26 (土) 16:07:35 yuji Attached file: autotools.png |
||
---|---|---|---|
Line 4: | Line 4: | ||
* autotoolsのすすめ [#hb90ff68] | * autotoolsのすすめ [#hb90ff68] | ||
- | Visual Studioなんか使いたくない私みたいな人は,Makefileを手を抜いて作成したいわけです。~ | + | Makefileを手を抜いて作成したい。~ |
- | そんな時に,Makefileを簡単に作成するためのツールがautotoolsです。 | + | そんな時に,Makefileを簡単に作成するためのツールがautotools((UNIX系OSにおいて,ソフトウェアパッケージ開発を行うためのツール及びフレームワークの一種))。 |
通常,Makefileにはコンパイルする際の諸設定,リンクする際の諸設定,処理順序などを逐一記述しておかなくてはならない。しかし,これは,Makefileの作成に慣れていないと面倒な作業です。~ | 通常,Makefileにはコンパイルする際の諸設定,リンクする際の諸設定,処理順序などを逐一記述しておかなくてはならない。しかし,これは,Makefileの作成に慣れていないと面倒な作業です。~ | ||
- | そこで,Makefileよりももっと簡単な設定ファイルMakefile.amだけを記述して,あとの細かなところの設定記述はツールを使って作り出せれば便利です。このような時に使用するのが,autoconf,automake,autoreconf,Libtoolなどのautotools。 | + | そこで,Makefileよりももっと簡単な設定ファイルMakefile.amだけを記述して,あとの細かなところの設定記述はツールを使って作り出せれば便利です。このような時に使用するのが,autoconf,automake,autoreconf,libtoolなどのautotools。 |
** makeとMakefile [#cdabaedb] | ** makeとMakefile [#cdabaedb] | ||
Line 24: | Line 24: | ||
他人にソースを配布するときは,手軽にコンパイルができるようにMakefileも一緒に配布したい。~ | 他人にソースを配布するときは,手軽にコンパイルができるようにMakefileも一緒に配布したい。~ | ||
しかし,相手の環境によってコンパイルの仕方が変わってしまうかもしれないので(ライブラリが見つからない〜とか,違うOS上で実行するとか),単にMakefileを一緒に配布しても上手くいかないことも多いわけです。~ | しかし,相手の環境によってコンパイルの仕方が変わってしまうかもしれないので(ライブラリが見つからない〜とか,違うOS上で実行するとか),単にMakefileを一緒に配布しても上手くいかないことも多いわけです。~ | ||
- | そこで登場するのが,''configure''コマンド。~ | + | そこで登場するのが,''configure''((configureは,Bourne Shell用のシェルスクリプト))コマンド。~ |
''configure''は,実行すると,その実行した環境に合った''Makefile''を生成してくれるシェルスクリプト。これを''Makefile''の代わりにソースコードと一緒に配布することで, | ''configure''は,実行すると,その実行した環境に合った''Makefile''を生成してくれるシェルスクリプト。これを''Makefile''の代わりにソースコードと一緒に配布することで, | ||
$ ./configure | $ ./configure | ||
Line 43: | Line 43: | ||
まずは試しに,こんなソースのファイルsample.cを用意してみる | まずは試しに,こんなソースのファイルsample.cを用意してみる | ||
#include <stdio.h> | #include <stdio.h> | ||
+ | |||
int main(void) | int main(void) | ||
{ | { | ||
printf("Hello Yuji!\n"); | printf("Hello Yuji!\n"); | ||
+ | |||
return 0; | return 0; | ||
} | } | ||
Line 53: | Line 53: | ||
''Makefile.amを作成''~ | ''Makefile.amを作成''~ | ||
移植性の高いMakefileを作るためのMakefile.acの雛形(Makefileの大元)になる''Makefile.am''を作成する。~ | 移植性の高いMakefileを作るためのMakefile.acの雛形(Makefileの大元)になる''Makefile.am''を作成する。~ | ||
- | bin_PROGRAMS = sample | + | noinst_PROGRAMS = sample |
sample_SOURCES = sample.c | sample_SOURCES = sample.c | ||
これは,sample.exeはsample.cから作られる場合です。 | これは,sample.exeはsample.cから作られる場合です。 | ||
+ | |||
+ | noinst_PROGRAMSは,noinstで「make installしてもインストールしない」の意味で,PROGRAMSは実行ファイルを意味していて,それをつなげたものです。この変数には,「make installしてもインストールしない」「実行ファイル」の名前を設定します。複数設定可能。~ | ||
+ | ちなみに,make installしたときにインストールする実行ファイルは,bin_PROGRAMSに設定します。 | ||
+ | |||
+ | sample_SOURCESは,noinst_PROGRAMSに設定したsampleに関するビルド情報の意味で,SOURCESはソースファイルを設定する。複数設定可能。 | ||
%%しかし今回は,何も記述していない空のファイルでも大丈夫です。%% | %%しかし今回は,何も記述していない空のファイルでも大丈夫です。%% | ||
Line 63: | Line 68: | ||
つまり,''必要なファイルとしては,ソースコード以外にはMakefile.amだけ。'' | つまり,''必要なファイルとしては,ソースコード以外にはMakefile.amだけ。'' | ||
- | *** autoscanでconfigure.acを生成する [#x4212841] | + | *** autoscanでconfigure.acを生成する [#b66d2551] |
$ autoscan | $ autoscan | ||
$ 好きなEditorでconfigure.scanを編集する | $ 好きなEditorでconfigure.scanを編集する | ||
Line 70: | Line 75: | ||
# -*- Autoconf -*- | # -*- Autoconf -*- | ||
# Process this file with autoconf to produce a configure script. | # Process this file with autoconf to produce a configure script. | ||
+ | |||
AC_PREREQ([2.68]) | AC_PREREQ([2.68]) | ||
AC_INIT([sample], [1.0.0], [y-ueno@nalux.co.jp]) <-- 編集 | AC_INIT([sample], [1.0.0], [y-ueno@nalux.co.jp]) <-- 編集 | ||
AC_CONFIG_SRCDIR([sample.c]) | AC_CONFIG_SRCDIR([sample.c]) | ||
AC_CONFIG_HEADERS([config.h]) | AC_CONFIG_HEADERS([config.h]) | ||
- | AM_INIT_AUTOMAKE([foreign 1.11.1]) <-- 追加 | + | AM_INIT_AUTOMAKE([foreign]) <-- 追加 |
+ | |||
# Checks for programs. | # Checks for programs. | ||
AC_PROG_CC | AC_PROG_CC | ||
+ | |||
# Checks for libraries. | # Checks for libraries. | ||
+ | |||
# Checks for header files. | # Checks for header files. | ||
+ | |||
# Checks for typedefs, structures, and compiler characteristics. | # Checks for typedefs, structures, and compiler characteristics. | ||
+ | |||
# Checks for library functions. | # Checks for library functions. | ||
+ | |||
AC_CONFIG_FILES([Makefile]) | AC_CONFIG_FILES([Makefile]) | ||
AC_OUTPUT | AC_OUTPUT | ||
AC_INITマクロにプログラムの情報を入れることと,AM_INIT_AUTOMAKEマクロを追加します。~ | AC_INITマクロにプログラムの情報を入れることと,AM_INIT_AUTOMAKEマクロを追加します。~ | ||
- | AM_INIT_AUTOMAKEは,automakeを使うことをautoconfに伝えるマクロのようです。 | + | AM_INIT_AUTOMAKEは,automakeを使うことをautoconfに伝えるマクロのようです。~ |
- | $ automake --version | + | この時の引数はGNU準拠のprojectとして作るわけではないので,foreignにします。((GNU準拠にした場合,INSTALL,NEWS,README,AUTHORS,ChangeLog,COPYING,といったファイルを用意する必要があります。))~ |
- | で表示されたバージョンを,AC_INIT_AUTOMAKEに入れます。この時の引数はGNU projectとして作るわけではないので,foreignにします。~ | + | |
AC_PROG_CCは,使用するCコンパイラの設定で,configureが環境変数CCを使用するという意味になる。~ | AC_PROG_CCは,使用するCコンパイラの設定で,configureが環境変数CCを使用するという意味になる。~ | ||
AC_CONFIG_FILES([Makefile])は,Makefile.inを雛形にしてMakefileを生成しろという意味になる。 | AC_CONFIG_FILES([Makefile])は,Makefile.inを雛形にしてMakefileを生成しろという意味になる。 | ||
Line 104: | Line 108: | ||
これで,configureが作成される。 | これで,configureが作成される。 | ||
AM_INIT_AUTOMAKE([foreign 1.11.1])の効果で,必要なファイルが追加される。特にMakefile.inのおかげで,移植性が高いものになっている。 | AM_INIT_AUTOMAKE([foreign 1.11.1])の効果で,必要なファイルが追加される。特にMakefile.inのおかげで,移植性が高いものになっている。 | ||
+ | |||
+ | *** autoconf/automakeでconfigureを作成する場合 [#ufa4753f] | ||
+ | autoreconfを使わないで,autoconf/automakeでconfigureを作成する場合。autoreconfで作成する場合はいらない。(autoreconfは,この処理を全部行ってくれる。) | ||
+ | $ aclocal | ||
+ | これで,aclocal.m4が作成される。~ | ||
+ | aclocal.m4は,configure.acやMakefile.amを解析して,autotoolsを実行するのに必要なマクロを集めたものだと思う。 | ||
+ | |||
+ | $ autoconf | ||
+ | autoconfを使って,configure.acを解析してconfigureを作成する。 | ||
+ | |||
+ | $ autoheader | ||
+ | autoheaderを使って,configure.acを解析してconfig.h.inを作成する。~ | ||
+ | config.h.inは,configureがconfig.hを作成する時に使用する。 | ||
+ | |||
+ | $ automake --add-missing | ||
+ | automakeを使って,Makefile.amとconfigure.ac,config.h.inを解析してMakefile.inを作成する。--add-missingで,install-sh,depcomp,missingなどのファイルを作成する。~ | ||
+ | Makefile.inは,configureがMakefileを作成する時に使用する。 | ||
*** configureを実行してMakefileを作成 [#s6e839f0] | *** configureを実行してMakefileを作成 [#s6e839f0] |