Linux でプログラムを開発している人は、Makefile に遭遇したことがあるはずです。作成したプログラムをコンパイルするために make コマンドを使用すると、確かに非常に便利です。通常の状況では、誰もが簡単な Makefile を手動で作成しますが、フリー ソフトウェアの規約に準拠した Makefile を作成するのはそれほど簡単ではありません。この記事では、autoconf と automake という 2 つのツールを使用して、ファイルを自動的に生成する方法を紹介します。フリー ソフトウェアの規約に準拠した Makefile。「./configure」、「make」、および「make install」を使用して、一般的な GNU プログラムと同じようにプログラムを Linux システムにインストールできます。これは、オープン ソース ソフトウェアを開発したいプログラム開発者に特に適しています。また、小さな Toy プログラムを自分で作成する場合にも、この記事は非常に役立ちます。
1. Makefile の概要
Makefile は自動コンパイルとリンクに使用されます。各ファイルの変更によりプロジェクトが再リンクされますが、すべてのファイルを再コンパイルする必要はありません。 Makefile ファイル情報を使用して、make はリンク中にどのファイルを再コンパイルする必要があるかを判断します。
Makefile の目的は、ファイルをコンパイルするために他のどのファイルに依存する必要があるかをコンパイラーに知らせることです。これらの依存関係ファイルが変更されると、コンパイラーは、最終的に生成されたファイルが古いことを自動的に検出し、対応するモジュールを再コンパイルします。
Makefile の基本構造はそれほど複雑ではありませんが、プログラム開発者が Makefile を書き始めるとき、自分が書いた内容が規約に準拠しているかどうか疑問に思うことが多く、また、彼が作成した Makefile は自分の開発環境に関連付けられることがよくあります。環境変数またはパスの変更後、それに応じて Makefile を変更する必要がある場合があります。これにより、Makefile を手動で作成する際に多くの問題が発生しましたが、automake はこれらの問題をうまく解決するのに役立ちます。
automake を使用すると、プログラム開発者は、事前定義されたマクロを含むいくつかの単純なファイルを作成するだけで済みます。Autoconf は 1 つのマクロ ファイルに基づいて configure を生成し、automake は別のマクロ ファイルに基づいて Makefile.in を生成し、その後 Makefile.in に基づいて configure を使用します。規約に準拠したMakefile。ここではMakefileのautomake生成方法を詳しく紹介します。
2. 使用する環境
この記事で説明されているプログラムは、Linux ディストリビューション バージョン: Fedora Core リリース 1 に基づいており、使用する autoconf と automake が含まれています。
3. helloworld から始めます
最も一般的に使用されるサンプル プログラム helloworld から始めます。
簡単に言うと、次のプロセスです:
3 つの新しいファイルを作成します:
helloworld.c configure.in Makefile.am
次に、それらを順番に実行します:
autoscan; aclocal; autoconf; automake --add-missing; ./configure; make; ./helloworld;
Makefile が生成され、helloworld.c がコンパイルされて渡されることがわかります。非常に簡単に、いくつかのコマンドを実行するだけで、従来の Makefile を作成できます。それでは、詳細なプロセスを紹介しましょう:
1. ディレクトリを作成します
helloworld プログラムと関連ファイルを /home/my/build の下などに保存するために使用します。 2. helloworld.c
次に、お気に入りのエディターを使用して、コマンド vi helloworld.c などの hellowrold.c ファイルを作成します。 helloworld.c のコンテンツとして次のコードを使用します。
$ mkdir helloword $ cd helloworld
完了したら保存して終了します。これで、helloworld ディレクトリに helloworld.c が作成されたはずです。
3.configure を生成する
autoscan コマンドを使用して、ディレクトリ内のソース コードに基づいて configure.in テンプレート ファイルを生成します。
コマンド:
int main(int argc, char** argv) { printf("Hello, Linux World! "); return 0; }
実行後、ファイルが hellowrold ディレクトリに生成されます:configure.scan は、configure.in の設計図として使用できます。
4、configure.in を生成します
次に、configure.scan の名前をconfigure.in に変更し、編集して次のように変更し、無関係なステートメントを削除します。
$ autoscan $ ls configure.scan helloworld.c
5 aclocal と autoconf を実行します
次に、コマンド aclocal と autoconf を実行します。 autoconf は、それぞれ aclocal.m4 と configure という 2 つのファイルを生成します:
Code ============================configure.in内容开始========================================= # -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_INIT(helloworld.c) AM_INIT_AUTOMAKE(helloworld, 1.0) # 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_OUTPUT(Makefile) ============================configure.in内容结束=========================================
configure.in の内容は、autoconf によって処理された後、システムの特性、環境変数、およびソフトウェアのパラメータシェルスクリプト。
autoconf 是用来生成自动配置软件源代码脚本(configure)的工具。configure脚本能独立于autoconf运行,且在运行的过程中,不需要用户的干预。
要生成configure文件,你必须告诉autoconf如何找到你所用的宏。方式是使用aclocal程序来生成你的aclocal.m4。
aclocal根据configure.in文件的内容,自动生成aclocal.m4文件。aclocal是一个perl 脚本程序,它的定义是:“aclocal - create aclocal.m4 by scanning configure.ac”。
autoconf从configure.in这个列举编译软件时所需要各种参数的模板文件中创建configure。
autoconf需要GNU m4宏处理器来处理aclocal.m4,生成configure脚本。
m4是一个宏处理器。将输入拷贝到输出,同时将宏展开。宏可以是内嵌的,也可以是用户定义的。除了可以展开宏,m4还有一些内建的函数,用来引用文件,执行命令,整数运算,文本操作,循环等。m4既可以作为编译器的前端,也可以单独作为一个宏处理器.
6、新建Makefile.am
新建Makefile.am文件,命令:$ vi Makefile.am
内容如下:
AUTOMAKE_OPTIONS=foreign bin_PROGRAMS=helloworld helloworld_SOURCES=helloworld.c
automake会根据你写的Makefile.am来自动生成Makefile.in。Makefile.am中定义的宏和目标,会指导automake生成指定的代码。例如,宏bin_PROGRAMS将导致编译和连接的目标被生成。
7、运行automake
命令:
$ automake --add-missing configure.in: installing `./install-sh' configure.in: installing `./mkinstalldirs' configure.in: installing `./missing' Makefile.am: installing `./depcomp'
automake会根据Makefile.am文件产生一些文件,包含最重要的Makefile.in。
8、执行configure生成Makefile
$ ./configure checking for a BSD-compatible install /usr/bin/install -c checking whether build environment is sane yes checking for gawk gawk checking whether make sets $(MAKE) yes checking for gcc gcc checking for C compiler default output a.out checking whether the C compiler works yes checking whether we are cross compiling no checking for suffix of executables checking for suffix of object files o checking whether we are using the GNU C compiler yes checking whether gcc accepts -g yes checking for gcc option to accept ANSI C none needed checking for style of include used by make GNU checking dependency style of gcc gcc3 configure: creating ./config.status config.status: creating Makefile config.status: executing depfiles commands $ ls -l Makefile -rw-rw-r-- 1 yutao yutao 15035 Oct 15 10:40 Makefile
你可以看到,此时Makefile已经产生出来了。
9、使用Makefile编译代码
$ make if gcc -DPACKAGE_NAME="" -DPACKAGE_TARNAME="" -DPACKAGE_VERSION="" - DPACKAGE_STRING="" -DPACKAGE_BUGREPORT="" -DPACKAGE="helloworld" -DVERSION="1.0" -I. -I. -g -O2 -MT helloworld.o -MD -MP -MF ".deps/helloworld.Tpo" -c -o helloworld.o `test -f 'helloworld.c' || echo './'`helloworld.c; then mv -f ".deps/helloworld.Tpo" ".deps/helloworld.Po"; else rm -f ".deps/helloworld.Tpo"; exit 1; fi gcc -g -O2 -o helloworld helloworld.o
10, 运行helloworld
$ ./helloworld Hello, Linux World!
这样helloworld就编译出来了,你如果按上面的步骤来做的话,应该也会很容易地编译出正确的helloworld文件。你还可以试着使用一些其他的make命令,如make clean,make install,make dist,看看它们会给你什么样的效果。感觉如何?自己也能写出这么专业的Makefile,老板一定会对你刮目相看。
四、深入浅出
针对上面提到的各个命令,我们再做些详细的介绍。
1、 autoscan
autoscan是用来扫描源代码目录生成configure.scan文件的。autoscan可以用目录名做为参数,但如果你不使用参数的话,那么autoscan将认为使用的是当前目录。autoscan将扫描你所指定目录中的源文件,并创建configure.scan文件。
2、 configure.scan
configure.scan包含了系统配置的基本选项,里面都是一些宏定义。我们需要将它改名为configure.in
3、 aclocal
aclocal是一个perl 脚本程序。aclocal根据configure.in文件的内容,自动生成aclocal.m4文件。aclocal的定义是:“aclocal - create aclocal.m4 by scanning configure.ac”。
4、 autoconf
使用autoconf,根据configure.in和aclocal.m4来产生configure文件。configure是一个脚本,它能设置源程序来适应各种不同的操作系统平台,并且根据不同的系统来产生合适的Makefile,从而可以使你的源代码能在不同的操作系统平台上被编译出来。
configure.in文件的内容是一些宏,这些宏经过autoconf 处理后会变成检查系统特性、环境变量、软件必须的参数的shell脚本。configure.in文件中的宏的顺序并没有规定,但是你必须在所有宏的最前面和最后面分别加上AC_INIT宏和AC_OUTPUT宏。
在configure.ini中:
#号表示注释,这个宏后面的内容将被忽略。
AC_INIT(FILE) 这个宏用来检查源代码所在的路径。
AM_INIT_AUTOMAKE(PACKAGE, VERSION) このマクロは必要です。生成するソフトウェア パッケージの名前とバージョン番号を記述します。PACKAGE はソフトウェア パッケージの名前、VERSION はバージョン番号です。 make dist コマンドを使用すると、helloworld-1.0.tar.gz のようなソフトウェア配布パッケージが生成されます。これには、対応するソフトウェア パッケージの名前とバージョン番号が含まれます。
AC_PROG_CC このマクロは、システムで使用されている C コンパイラをチェックします。
AC_OUTPUT(FILE) このマクロは、出力したい Makefile の名前です。
automake を使用する場合、実際には他のマクロを使用する必要がありますが、aclocal を使用してマクロを自動的に生成できます。 aclocal を実行すると、aclocal.m4 ファイルが取得されます。
configure.in および aclocal.m4 マクロ ファイルを生成した後、autoconf を使用して構成ファイルを生成できます。
5. Makefile.am
Makefile.am は Makefile.in を生成するために使用され、手動で記述する必要があります。 Makefile.am はいくつかのコンテンツを定義します:
AUTOMAKE_OPTIONS これは automake オプションです。 automake を実行すると、AUTHORS、ChangeLog、NEWS、その他のファイルなど、標準の GNU ソフトウェア パッケージに含める必要があるさまざまなファイルがディレクトリ内に存在するかどうかがチェックされます。外部に設定すると、automake は一般的なソフトウェア パッケージの標準を使用してチェックします。
bin_PROGRAMS 生成したい実行ファイルのファイル名を指定します。複数の実行可能ファイルを生成する場合は、名前をスペースで区切ります。
helloworld_SOURCES 「helloworld」を生成するために必要なソースコードを指定します。複数のソース ファイルを使用する場合は、スペースで区切ってください。たとえば、helloworld.h、helloworld.c が必要な場合は、helloworld_SOURCES= helloworld.h helloworld.c と記述してください。
bin_PROGRAMS で複数の実行可能ファイルを定義する場合は、各実行可能ファイルに対応する filename_SOURCES を定義する必要があります。
6. automake
automake を使用して、configure.in と Makefile.am に基づいて Makefile.in を生成します。
オプション --add-missing の定義は「不足している標準ファイルをパッケージに追加する」であり、これにより automake は標準ソフトウェア パッケージに必要ないくつかのファイルを追加します。
automake を使用して生成した Makefile.in ファイルは、GNU Makefile 規則に準拠しています。次に、configure シェル スクリプトを実行して、適切な Makefile ファイルを生成するだけです。
7. Makefile
GNU Makefiel 規則に準拠する Makefile には、いくつかの基本的な事前定義操作が含まれています:
make Makefile に従ってソース コードをコンパイルし、接続し、ターゲット ファイルと実行可能ファイルを生成します。
make clean 最後の make コマンドで生成されたオブジェクト ファイル (接尾辞 ".o" が付いたファイル) と実行可能ファイルをクリアします。
make install 正常にコンパイルされた実行可能ファイルをシステム ディレクトリ (通常は /usr/local/bin ディレクトリ) にインストールします。
make dist 配布パッケージファイル(つまり配布パッケージ)を生成します。このコマンドは、実行可能ファイルと関連ファイルを tar.gz 圧縮ファイルにパッケージ化し、ソフトウェアを公開するためのソフトウェア パッケージとして使用します。現在のディレクトリに「PACKAGE-VERSION.tar.gz」のような名前のファイルが生成されます。 PACKAGE と VERSION は、configure.in で定義した AM_INIT_AUTOMAKE(PACKAGE, VERSION) です。
make distcheck リリースソフトウェアパッケージを生成し、テストしてリリースパッケージの正当性を判断します。この操作により、圧縮されたパッケージ ファイルが自動的に解凍され、configure コマンドを実行してコンパイル エラーがないことを確認します。最後に、ソフトウェア パッケージの準備ができてリリースできることを確認するメッセージが表示されます。
make distclean は make clean に似ていますが、Makefile を含め、configure によって生成されたすべてのファイルも削除します。
5. プロセスの図
6.上記の導入により、GNU 規約に準拠した独自の Makefile と対応するプロジェクト ファイルを簡単に生成できるようになります。規則に準拠したより複雑な Makefile を作成する場合は、組み込みデータベース sqlite、単体テスト cppunit などのオープン コード プロジェクトの configure.in および Makefile.am ファイルを参照できます。