ソースから何かをコンパイルするたびに、同じ3つの手順を実行します。
$ ./configure
$ make
$ make install
インストールプロセスを異なるステップに分割することは理にかなっていますが、この惑星の各コーダーが同じ3つのコマンドを何度も何度も繰り返して1つのジョブを実行する必要があるのは理解できません。私の観点からすると、次のテキストを含むソースコードで自動的に配信される./install.sh
スクリプトを持つことは完全に理にかなっています:
#!/bin/sh
./configure
make
make install
なぜ人々は3つのステップを別々に行うのですか?
各ステップは異なることを行うため
./configure
このスクリプトには、変更する必要がある多くのオプションがあります。 --prefix
や--with-dir=/foo
など。つまり、すべてのシステムの構成は異なります。また、./configure
は、インストールする必要のある欠落ライブラリーをチェックします。ここで何か間違っていると、アプリケーションをビルドできません。すべてのディストリビューションが特定のライブラリとファイルを特定のディレクトリにインストールする方が良いと考えているため、ディストリビューションに異なる場所にインストールされるパッケージがある理由です。 ./configure
を実行すると言われていますが、実際には常に変更する必要があります。
たとえば、 Arch Linuxパッケージサイト をご覧ください。ここでは、パッケージが異なる構成パラメーターを使用していることがわかります(ビルドシステムにautotoolsを使用していると仮定します)。
make
これは実際にはデフォルトでmake all
です。そして、メーカーごとに異なるアクションがあります。一部はビルドを行い、一部はビルド後にテストを行い、一部は外部SCMリポジトリからチェックアウトを行います。通常、パラメーターを指定する必要はありませんが、いくつかのパッケージはそれらを異なる方法で実行します。
make install
これにより、configureで指定された場所にパッケージがインストールされます。必要に応じて、./configure
を指定して、ホームディレクトリを指すことができます。ただし、多くの構成オプションは/usr
または/usr/local
を指しています。つまり、rootのみが/ usrおよび/ usr/localにファイルをコピーできるため、実際にSudo make install
を使用する必要があります。
これで、各ステップが次のステップの前提条件であることがわかります。各ステップは、問題のないフローで物事を機能させるための準備です。ディストリビューションはこの比metaを使用してパッケージ(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
、make
、およびmake install
を使用できます。しかし、別のものは、SCons、Python関連のセットアップ、または異なるものを使用できます。
ご覧のとおり、各状態を分割すると、特にパッケージメンテナーやディストリビューションの場合、メンテナンスと展開が非常に簡単になります。
まず、それぞれが前者の成功に依存するため、./configure && make && make install
である必要があります。理由の一部は進化であり、理由の一部は開発ワークフローの利便性です。
元々、ほとんどのMakefile
sにはプログラムをコンパイルするためのコマンドのみが含まれ、インストールはユーザーに任されていました。追加の規則により、make install
はコンパイルされた出力を正しい場所に配置できます。システム管理者ではない、まったくインストールしたくないなど、これを行いたくない理由がまだたくさんあります。さらに、ソフトウェアを開発している場合、おそらくインストールしたくないでしょう。いくつかの変更を行い、ディレクトリにあるバージョンをテストしたいと思います。複数のバージョンが存在する場合、これはさらに顕著になります。
./configure
は、環境で利用可能なもの、および/またはソフトウェアの構築方法を決定するためにユーザーが望むものを検出します。これは非常に頻繁に変更する必要があるものではなく、多くの場合時間がかかることがあります。繰り返しになりますが、私が開発者である場合、絶えず再構成するのは価値がありません。さらに重要なことは、make
はタイムスタンプを使用してモジュールを再構築するため、configure
を再実行すると、フラグが変更される可能性があり、ビルド内の一部のコンポーネントが1つのフラグセットでコンパイルされ、別のフラグセットでコンパイルされる可能性があります異なる、互換性のない動作につながります。 configure
を再実行しない限り、ソースを変更してもコンパイル環境は同じままです。 configure
を再実行する場合、最初にmake clean
を実行して、ビルドされたソースを削除して、物事が均一にビルドされるようにします。
3つのコマンドが連続して実行される唯一のケースは、ユーザーがプログラムをインストールしたとき、またはパッケージがビルドされたときです(例:DebianのdebuildまたはRedHatのrpmbuild)。そしてそれは、パッケージにプレーンなconfigure
を与えることができることを前提としています。これは通常、少なくとも--prefix=/usr
が望まれるパッケージングには当てはまりません。そして、パッカッカーは、make install
の部分を実行するときに、偽のルートを処理する必要があります。多くの例外があるため、./configure && make && make install
をルールにすることは、はるかに頻繁にそれを行う多くの人々にとって不便です!
configure
は、依存関係が欠落していることが検出されると失敗する場合があります。
make
は、Makefileにリストされている最初のターゲットであるデフォルトターゲットを実行します。多くの場合、このターゲットはall
ですが、常にではありません。そのため、それがターゲットであることを知っていた場合のみ、make all install
しかできませんでした。
そう ...
#!/bin/sh
if ./configure $*; then
if make; then
make install
fi
fi
または:
./configure $* && ./make && ./make install
多くの場合、configure
にオプションを提供する必要があるため、$*
が含まれています。
しかし、なぜ人々が自分でそれをできるようにしないのですか?これは本当に大きな勝利ですか?
まず、。/ configureは常に必要なものをすべて見つけられるわけではありません。また、他の場合には、必要なすべてを見つけますが、使用できるすべてを見つけるわけではありません。その場合、あなたはそれについて知りたいと思うでしょう(そしてあなたの./install.shスクリプトはとにかく失敗します!)私の観点から、意図しない結果を伴う非失敗の典型的な例は、ffmpegやmplayerのような大きなアプリケーションをコンパイルしています。これらは利用可能な場合はライブラリを使用しますが、利用できない場合はコンパイルし、一部のオプションを無効のままにします。問題は、何らかの形式をサポートせずにコンパイルされたことを後で発見するため、元に戻ってやり直す必要があることです。
./configureがやや対話的に行うもう1つのことは、アプリケーションをシステム上のどこにインストールするかをカスタマイズするオプションを提供することです。異なるディストリビューション/環境には異なる規則があり、おそらくシステムの規則に固執したいと思うでしょう。また、ローカルに(自分でのみ)インストールすることもできます。従来、。/ configureおよびmakeステップはrootとして実行されませんが、make install(自分用にインストールされている場合を除く)はrootとして実行する必要があります。
特定のディストリビューションは、多くの場合、この./install.sh機能をディストリビューションに依存した方法で実行するスクリプトを提供します。たとえば、 ソースRPM +スペックファイル+ rpmbuild または slackbuilds です。
(脚注:言われているとおり、。/ configure; make; make install;は非常に退屈になります。)