1. ホーム
  2. unix

[解決済み] なぜいつも ./configure; make; make install; の3つのステップを別々に行うのですか?

2022-08-21 06:52:13

疑問点

ソースから何かをコンパイルするときは、いつも同じ3つのステップを踏んでいます。

$ ./configure
$ make
$ make install

インストールプロセスを異なるステップに分割することに意味があることは理解できますが、この地球上のすべてのコーダーが、1つの仕事を成し遂げるために、なぜ同じ3つのコマンドを何度も何度も書かなければならないのか、私には理解できません。私の見解では、インストール時に ./install.sh スクリプトが自動的に次のテキストを含むソースコードと一緒に配信されるのは、まったく理にかなっていると思います。

#!/bin/sh
./configure
make
make install

なぜ、3つのステップを別々に行うのでしょうか?

どのように解決するのですか?

それぞれのステップで異なることを行うので

ビルドのための環境を準備(セットアップ)する

./configure

このスクリプトには、変更すべきオプションがたくさんあります。例えば --prefix または --with-dir=/foo . つまり、システムごとに構成が異なるということです。また ./configure はインストールすべきライブラリの欠落をチェックします。ここで何か問題があれば アプリケーションをビルドしない原因 . そのため、ディストロでは、特定のライブラリやファイルを特定のディレクトリにインストールした方が良いと考えるので、異なる場所にインストールされるパッケージがあります。を実行すると言われています。 ./configure を実行すると言われていますが、実際には常に変更する必要があります。

例えば Arch Linux パッケージサイト . ここでは、どのパッケージも異なる configure パラメータを使用していることがわかります(ビルドシステムに autotools を使用していると仮定しています)。

システムの構築

make

これは実際には make all をデフォルトとしています。そして、すべてのmakeは異なるアクションを実行します。ビルドを行うもの、ビルド後にテストを行うもの、外部の SCM リポジトリからチェックアウトするものなどです。通常、パラメータを指定する必要はありませんが、パッケージによっては実行方法が異なります。

システムへインストール

make install

これは、configureで指定された場所にパッケージをインストールします。もし必要であれば ./configure を指定して、ホームディレクトリを指定することもできます。しかし、多くの configure オプションは /usr または /usr/local . ということは、実際には sudo make install というのは、rootだけが/usrと/usr/localにファイルをコピーすることができるからです。


各ステップは次のステップのための事前条件であることがお分かりいただけたと思います。各ステップは、問題のないフローで物事を動作させるための準備です。ディストロはこのメタファーを使ってパッケージ (RPM、deb など) を構築しています。

ここで、各ステップが実際には異なる状態であることがわかるでしょう。これがパッケージマネージャが異なるラッパーを持つ理由です。以下は、1 つのステップでパッケージ全体をビルドするためのラッパーの例です。しかし、それぞれのアプリケーションは異なるラッパーを持っていることを覚えておいてください (実際にはこれらのラッパーは spec, PKGBUILD などの名前を持っています)。

def setup:
... #use ./configure if autotools is used

def build:
... #use make if autotools is used

def install:
... #use make all if autotools is used

ここでは、オートツールを使うことができます。 ./configure , makemake install . しかし、別のものはSConsやPython関連の設定や別のものを使用することができます。

ご覧のように、それぞれの状態を分割することで、特にパッケージメンテナやディストロにとって、メンテナンスやデプロイがずっと簡単になります。