ソフトウェアパッケージのコンパイル

私たちのシステムには、たくさんのフリーソフトウェアや商用ソフトウェアのパッケージがインストールされて、すべてのユーザーがそれらを使用できるようになっています。 一方で生徒たちは自分自身のホームディレクトリにソフトウェアパッケージをダウンロードしてインストールすることが許可されています。 通常は個人的に使用するためにインストールされます。

ソフトウェアのインストールに必要な手順をあげてみます。

  • ソースコードを探してダウンロードする(大抵の場合圧縮されている)
  • ソースコードを展開する
  • コードをコンパイルする
  • 実行形式のファイルをインストールする
  • インストールディレクトリにパスをセットする

手順のなかでもっとも難しいのは、おそらくソースコードをコンパイルするステップです。

ソースコードをコンパイルする

すべての高級言語はコンピューターが理解できるコードに変換する必要があります。 例として C 言語のソースコードはアセンブリ言語という低レベルの言語に変換します。 そしてアセンブリ言語のコードから、コンピューターが直接理解するコードの断片から成り立っているオブジェクトコードに変換されます。 コンパイルの最後の段階では、オブジェクトコードをいくつかの組み込み関数を含むコードのライブラリにリンクして、実行可能なプログラムを生成します。

このような手順を手作業で行うのはあまりに複雑であり、一般ユーザーに求められる能力をはるかに超えています。 そのため、プログラマやエンドユーザーがこれらの手順を簡素化するためのユーティリティとツールが開発されています。

make と Makefile

make コマンドは、プログラマが大規模なプログラムあるいはプログラムのグループを管理することを可能にします。 また、プログラム全体の中で最後のコンパイル以降に変更されたプログラムの部分だけをコンパイルするなど、大規模なプログラムの開発にも役立ちます。

make プログラムは、ソースファイルと同じディレクトリにある Makefile と呼ばれるテキストファイルから、コンパイルのルールを取得します。 Makefile には最適化レベルをどうするのか、実行可能ファイルにデバッグ情報を含めるのか否かといった、プログラムをどのようにコンパイルするかという情報が記述されています。 その他にも、コンパイル済みの(実行可能な)バイナリファイル、マニュアルページ、データファイル、依存ライブラリ、設定ファイルをインストールする場所についての情報を含んでいます。

configure

UNIX 系 OS の数が増えるにつれて、すべての亜種で実行可能なプログラムを書くことが困難になりました。 開発者はすべての UNIX システムにアクセスすることやバージョン間の差異を把握できるわけではありません。 GNU の設定と構築システムはソースコードとして配布されているプログラムの構築を単純化します。 システムは、単純で標準化された、ふたつのステップのプロセスを使用して構築されています。 プログラムをビルドする人がプログラムを構築するために特別なツールをインストールする必要はありません。

configure は、コンパイル時に使用される様々なシステムに依存する変数の、正しい値を推測するシェルスクリプトです。 configure から得られた値を用いて、パッケージの各ディレクトリに Makefile が作成されます。

パッケージのコンパイル手順は次のとおりです。

  1. パッケージ内のソースコードを含むディレクトリに移動( cd )する
  2. ./configure と入力してあなたのシステムのための設定を行う
  3. make と入力してコンパイルする
  4. 任意で make check と入力してテストを行う
  5. make install と入力してプログラムやデータファイルやドキュメントをインストールする
  6. 任意で make clean と入力してソースコードディレクトリからバイナリやオブジェクトファイルを削除する

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

Makefile の設定と作成

最初にすることは、注意深く 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 の下で利用できます。

Creative Commons License


最終更新日: 2011年02月24日(木)


Back to top