前回入手したソースコードのファイルを調べ、ビルド前に必要な作業について解説します(編集部)
前回からGNU Helloを例に、実際にビルドの手順を追いながら解説をしてきました。フリーソフトウェア、オープンソースソフトウェア(以下FOSS)のソースコード配布パッケージの入手、そのパッケージが本物であることの確認までが終わりました。
GNU Helloのソースコード配布パッケージは無事入手できましたでしょうか。まだの方は前回を参照しながら入手してください。本物かどうかの確認は、ついついおろそかにしがちですが、習慣としたいものです。FOSSのサイトがクラックされた例も過去にはあるのですから、習慣付けておいて損はありません。
それでは入手した配布パッケージを展開し、中に何が入っているか見てみましょう。
$ tar zxvf hello-2.7.tar.gz $ cd hello-2.7 $ ls -p ABOUT-NLS ChangeLog.O NEWS aclocal.m4 configure.ac man/ AUTHORS INSTALL README build-aux/ contrib/ po/ COPYING Makefile.am THANKS config.in doc/ src/ ChangeLog Makefile.in TODO configure gnulib/ tests/
ファイル名が大文字になっているものは、ほとんどの場合ドキュメントです。まずはドキュメントからチェックしていきましょう。
ほとんどのソースコード配布パッケージでは、ドキュメントは慣例に従ったファイル名になっています。ほかのファイルと見分けやすいように、すべて大文字か、大文字で始まる形になっています。数字で始まることもあります。
ドキュメントファイルはプレーンテキストですので、サーバ上でもlessコマンドなどで表示できます。HTMLやPDFといった形式のドキュメントを用意しているFOSSも増えてきましたが、そういったドキュメントはたいてい「doc/」などのディレクトリにあります。普通はサイト上にも同じものがあるので、そちらを見た方が早いでしょう。
まず「README」には、そのソフトウェアの紹介や、作者の連絡先などが書かれています。インストール手順をここにまとめてあることもあります。「ChangeLog」「CHANGES」などの名前のファイルは、バージョンごとの変更点がまとめられています。バージョンアップするときは目を通しておくとよいでしょう。
インストールの手順を示したファイルは「INSTALL」です。ほかのソフトウェアが必要なFOSSであれば、その一覧も記載してあるでしょう。ビルドという作業を進める上で、とても重要なドキュメントです。ざっとでも良いので、ビルド前には一読しておくべきです。詳しいインストール手順は、HTMLやPDFファイルに記載されている場合もあります。見逃さないようにしましょう。
このほかに、事前に把握すべきものとしては、そのFOSSのライセンスがあります。ライセンス条項を記したファイルは「COPYING」や「LICENSE」という名前になっています。著作権者は、ライセンスに基づいてソフトウェアの利用や再配布を許諾しているということを忘れてはなりません。
特に仕事で使う場合、ライセンスが問題となるケースもあります。代表的なライセンスであるGPLでは、派生したソフトウェアを再配布するときもGPLで配布しなければならないという制約があります。
派生したソフトウェアを販売しようと考えたとき、この点が問題になります。販売することも自由なのですが、入手した人が無料で再配布するのもまた自由になってしまうのです。このように、ライセンスの種類によっては、FOSSを採用できないということもあります。ライセンスを扱った解説記事やWebサイトなどもあります。詳しくはそちらを参照してください。
さて、実際にGNU HelloのINSTALLファイルを見てみますと、冒頭に次のような1文があります。
Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package.
インストールにsudoを使っていないという違いはあるものの、これまでの連載で何度か示してきた手順と同じであることが分かります。
makeコマンドがどのような処理をしているかは、これまでの連載でその概要を解説しました。Makefileという名前のファイルに記した設定に従ってソースコードをコンパイル、リンクしたり、インストールなどを実行しているのでした。
ここで配布パッケージ内のファイル一覧をよく見てください。Makefileがどこにもありません。似たような名前のファイルはあるものの、配布パッケージには入っていないわけです。当然、配布パッケージを展開した直後にmakeを実行すると、Makefileがないのでエラーになります。
このことから、makeコマンドの前に実行しているconfigureコマンドが、Makefileを生成しているのだろうと分かります。configureはカレントディレクトリのファイルを実行していますので、これは配布パッケージ内にあるファイルということになります。
とにかく、configureを実行してみましょう。実行すると、以下のようになります。
$ ./configure checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking for a thread-safe mkdir -p... /bin/mkdir -p checking for gawk... gawk checking whether make sets $(MAKE)... yes checking for gcc... gcc checking whether the C compiler works... yes checking for C compiler default output file name... a.out checking for suffix of executables... checking whether we are using the GNU C compiler... yes checking whether gcc accepts -g... yes checking for gcc option to accept ISO C89... none needed checking for style of include used by make... GNU checking dependency style of gcc... gcc3 checking for ranlib... ranlib (略) checking where the gettext function comes from... libc configure: creating ./config.status config.status: creating Makefile config.status: creating contrib/Makefile config.status: creating doc/Makefile config.status: creating gnulib/lib/Makefile config.status: creating man/Makefile config.status: creating po/Makefile.in config.status: creating src/Makefile config.status: creating tests/Makefile config.status: creating config.h config.status: executing depfiles commands config.status: executing po-directories commands config.status: creating po/POTFILES config.status: creating po/Makefile $
ずらずらと「checking 〜」という表示が並び、最後の方で「creating Makefile」という表示を確認できます。この表示からもMakefileを生成しているということが分かります。
なぜ、Makefileを配布パッケージには含めず、付属のconfigureコマンドで生成するようになっているのでしょうか。これはソフトウェアをビルドする環境には、多かれ少なかれ差異があるからです。
Linuxと言ってもCentOSやDebian GNU/Linuxなどといった違いがありますし、FreeBSDやSolarisなどまったく別のUNIXもあります。同じCentOSでも、パッケージのインストール状況はそれぞれの環境で異なるでしょう。このような差異があると、単一のMakefileではうまく対応できないのです。
第9回の例を参照してほしいのですが、コンパイラのコマンド名をマクロとしてMakefileに記述しました。GNU C Compilerならgccですが、もしIntelのコンパイラをインストールしていればiccと記述します。コンパイラの標準コマンド名であるccが、どちらのコンパイラにシンボリックリンクを張ってあるかは、設定した人によるでしょう。
コンパイラに限らず、このように環境に依存しているものを決め打ちでMakefileに埋め込んでしまうと、自分の環境ではビルドできるがほかの人の環境ではできない、ということにもなりかねません。これを移植性が悪いともいいます。
環境の差異を吸収するには、その部分を設定可能にするしかありません。Makefileのマクロで定義すれば、実行時に上書きもできますし、Makefileの書き換えも簡単です。しかし、これはユーザーが差異を調べて吸収する作業をしなければならないということです。ビルドという作業をやり遂げる際のハードルがかなり高いものになってしまいます。
そこで、自動的に環境を調査して、環境に合わせて設定したMakefileを生成する、という方法が採られるようになりました。そのためのコマンドがconfigureです。lessなどで表示してみれば分かりますが、configureはシェルスクリプトです。標準的なUNIXであれば、どこでも実行できるようになっています。なお、configureが生成するのはMakefileだけではありません。ソースコードが参照するファイルなども設定しています。
configureがチェックする要素はかなりたくさんあります。configureの出力にある「checking 〜」という表示は、環境ごとの差異になり得る部分を1つチェックしていることを示す表示です。次のようにして調べてみると、GNU Helloで202個もあります。
$ ./configure | grep 'checking' | wc -l 202
configureによる自動設定が主流になる前は、Makefileなどのファイルを自分の環境に合わせて書き換えてからmakeしていました。それに比べると現在のビルド作業は、はるかに楽になったものです。ただし、今現在でもconfigureが付属せず、自分で書き換えなければいけないFOSSは、ごく少ないですが存在しています。
configureは環境を調査するだけではありません。インストール先などのユーザーの指示に基づいて各ファイルを生成します。次回はその方法について解説します。
Copyright © ITmedia, Inc. All Rights Reserved.