私たちのシステムには、たくさんのフリーソフトウェアや商用ソフトウェアのパッケージがインストールされて、すべてのユーザーがそれらを使用できるようになっています。 一方で生徒たちは自分自身のホームディレクトリにソフトウェアパッケージをダウンロードしてインストールすることが許可されています。 通常は個人的に使用するためにインストールされます。
ソフトウェアのインストールに必要な手順をあげてみます。
手順のなかでもっとも難しいのは、おそらくソースコードをコンパイルするステップです。
すべての高級言語はコンピューターが理解できるコードに変換する必要があります。 例として C 言語のソースコードはアセンブリ言語という低レベルの言語に変換します。 そしてアセンブリ言語のコードから、コンピューターが直接理解するコードの断片から成り立っているオブジェクトコードに変換されます。 コンパイルの最後の段階では、オブジェクトコードをいくつかの組み込み関数を含むコードのライブラリにリンクして、実行可能なプログラムを生成します。
このような手順を手作業で行うのはあまりに複雑であり、一般ユーザーに求められる能力をはるかに超えています。 そのため、プログラマやエンドユーザーがこれらの手順を簡素化するためのユーティリティとツールが開発されています。
make コマンドは、プログラマが大規模なプログラムあるいはプログラムのグループを管理することを可能にします。 また、プログラム全体の中で最後のコンパイル以降に変更されたプログラムの部分だけをコンパイルするなど、大規模なプログラムの開発にも役立ちます。
make プログラムは、ソースファイルと同じディレクトリにある Makefile と呼ばれるテキストファイルから、コンパイルのルールを取得します。 Makefile には最適化レベルをどうするのか、実行可能ファイルにデバッグ情報を含めるのか否かといった、プログラムをどのようにコンパイルするかという情報が記述されています。 その他にも、コンパイル済みの(実行可能な)バイナリファイル、マニュアルページ、データファイル、依存ライブラリ、設定ファイルをインストールする場所についての情報を含んでいます。
UNIX 系 OS の数が増えるにつれて、すべての亜種で実行可能なプログラムを書くことが困難になりました。 開発者はすべての UNIX システムにアクセスすることやバージョン間の差異を把握できるわけではありません。 GNU の設定と構築システムはソースコードとして配布されているプログラムの構築を単純化します。 システムは、単純で標準化された、ふたつのステップのプロセスを使用して構築されています。 プログラムをビルドする人がプログラムを構築するために特別なツールをインストールする必要はありません。
configure は、コンパイル時に使用される様々なシステムに依存する変数の、正しい値を推測するシェルスクリプトです。 configure から得られた値を用いて、パッケージの各ディレクトリに Makefile が作成されます。
パッケージのコンパイル手順は次のとおりです。
configure には様々なオプションを指定できます。 --help オプションを使うと利用可能なオプションの一覧を見ることができます。
よく使われるオプションに、 --prefix と --exec-prefix があります。これらのオプションはインストール ディレクトリを指定するものです。
--prefix オプションで指定されたディレクトリは、ドキュメンテーション データや設定ファイルなどの、マシンに依存しないファイルのインストール場所となります。
--exec-prefix オプションで指定されたディレクトリ(通常は --prefix のサブディレクトリ)は、実行可能ファイルなど、マシンに依存するファイルのインストール場所となります。
この例では、重さや長さなどの単位を変換するフリーソフトウェアをダウンロードします。
ダウンロード用のディレクトリを作ります。
% mkdir download
units-1.74.tar.gz をダウンロードして、作成したダウンロード用のディレクトリに保存します。
download ディレクトリに移動して中身を確認します。
% cd download % ls -l
ファイル名が tar.gz で終わっているのを見るでしょう。 tar は tar コマンドによって作成されたファイルであることを表します。 tar コマンドはいくつかのファイルおよびディレクトリを単一のファイルに変えます。 gz で終わっているファイル名は gzip コマンドによって圧縮されていることを表しています。
まずは gunzip コマンドで圧縮を解きます。すると .tar ファイルが作成されます。
% gunzip units-1.74.tar.gz
次は tar ファイルを展開します。
% tar -xvf units-1.74.tar
もう一度 download ディレクトリの内容を見てみましょう。それから units-1.74 サブディレクトリへ移動してください。
% cd units-1.74
最初にすることは、注意深く README と INSTALL という名前のテキストファイルを読むことです( less コマンドを使います)。 これらのファイルにはコンパイル方法やソフトウェアの利用について重要なことが書かれています。
units パッケージはソースコードのコンパイルに GNU の設定ツールを使います。 私たちがすべき事はインストール用のディレクトリを用意することです。 なぜならデフォルトのインストール先は書き込み権限の無いメインのシステムエリアに設定されているからです。 インストール用のディレクトリをホームディレクトリに作ります。
% mkdir ~/units174
インストールのパスを指定して configure を実行します。
% ./configure --prefix=$HOME/units174
Note
$HOME 変数は環境変数のひとつであり、あなたのホームディレクトリのパスを値として保持しています。次のように入力してください。
% echo $HOME
変数の内容が表示されます。環境変数については、あとで学びます。
configure が正常に終了すれば、コンパイルやインストールに必要なすべてのオプションを含む Makefile が作成されます。 less コマンドで Makefile の内容を見ることができます。ただし編集してはいけません。
では make コマンドを使ってパッケージをビルドします。
% make
(コンピューターのスピードによるが)1分〜2分も待てば、実行可能なファイルが出来上がります。コンパイルが成功しているかチェックします。
% make check
すべてうまくいったらパッケージをインストールします。
% make install
ファイルは先ほど作成した ~/utils174 ディレクトリにインストールされます。
ソフトウェアを実行する準備が整いました。
% cd ~/utils174
units174 ディレクトリにはいくつかのサブディレクトリがあるはずです。
bin | 実行可能なバイナリファイル |
info | GNU info 形式のドキュメント |
man | man ページ |
share | 共有データファイル |
プログラムを実行するには bin ディレクトリに移動して次のように入力します。
% ./units
実行例として、6フィートをメートルに変換してみます。
You have: 6 feet You want: metres * 1.8288
1.8288 という結果が得られたら正解です。パッケージの構築からインストールまで成功しています。
変換可能な単位については share ディレクトリのデータ ファイルを見てください。
完全なドキュメントを読むには info ディレクトリに移動して次のように入力してください。
% info --file=units.info
開発中のソフトウェアでは、デバッグ情報を実行可能ファイルに含めると、それはプログラマに役立つ情報となります。 デバッグ情報を含めれば、もしも実行中のプログラムに問題があった場合に、プログラマはデバッギング ソフトウェアに実行形式のファイルを読み込ませて、バグを発見することができるようになります。
プログラマにとっては役立つデバッグ情報は、一般ユーザーにとっては不用となります。 私たちがダウンロードできるパッケージは一度テストやデバッグが終了していると仮定できます。 しかし、私たちが上記のソフトウェアをコンパイルしたとき、デバッグ情報は実行可能なファイルにまだ残されています。 私たちはデバッグ情報を必要としていないので、実行可能ファイルからデバッグ情報を取り除くこともできるのです。 デバッグ情報を削除する有利な点は、実行可能ファイルのサイズが小さくなり、幾分か速く動くようになるのです。
これから何が起こるかを見るためにバイナリファイルのサイズを確認しておきます。 bin ディレクトリへ移動します。
% cd ~/units174/bin % ls -l
ご覧の通り、ファイルのサイズは100キロバイト以上です。あなたは、 file コマンドを用いてファイルの種類に関する詳細な情報を得ることができます。
% file units units: ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses shared libs), not stripped
デバッグと行番号の情報をバイナリファイルから削除します。
% strip units % ls -l
見てわかるように、ファイルのサイズが36キロバイトです。元のサイズの3分の1になりました。バイナリファイルの3分の2がデバッグ用のコードだったのです!
もう一度ファイル情報を確認しましょう。
% file units units: ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses shared libs), stripped
パッケージをインストールするときに、すべてのバイナリファイルからあらかじめ不用な情報を除去したコピーをインストールすることも、ときどき出来ます。 make install の代わりに make install-strip と入力します。
この文書は UNIX Tutorial for Beginners から派生した文書です。 Creative Commons License の下で利用できます。
最終更新日: 2011年02月24日(木)