[解決済み] なぜいつも ./configure; make; make install; の3つのステップを別々に行うのですか?
疑問点
ソースから何かをコンパイルするときは、いつも同じ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
,
make
と
make install
. しかし、別のものはSConsやPython関連の設定や別のものを使用することができます。
ご覧のように、それぞれの状態を分割することで、特にパッケージメンテナやディストロにとって、メンテナンスやデプロイがずっと簡単になります。
関連
-
[解決済み] SCP Permission denied (publickey). EC2において、ディレクトリに-rフラグを使用した場合のみ。
-
[解決済み] less' で行番号を表示する方法 (GNU)
-
[解決済み] ファイルディスクリプタとは何か、わかりやすく解説します。
-
[解決済み] なぜ1970年1月1日が「エポックタイム」なのか?
-
[解決済み] ダッシュ/ハイフンで始まる文字列をgrepするにはどうしたらいいですか?
-
[解決済み] 標準入力にタイムスタンプを前置するUnixユーティリティはありますか?
-
[解決済み] コマンドライン:検索結果をrmにパイプする
-
[解決済み] ディレクトリの存在確認と削除を1つのコマンドで行う unix
-
[解決済み] ssh user@host コマンド`が動作するように $PATH を設定するには?
-
[解決済み] findコマンドでファイルサイズをファイル名と一緒に出力するにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 新しい鍵を作成せずに、SSH鍵のパスフレーズを削除するにはどうすればよいですか?
-
[解決済み] シンボリックリンクとハードリンクの違いは何ですか?
-
[解決済み] Vimの^M文字とはどういう意味ですか?
-
[解決済み] コマンドラインからdiffをカラー化する方法
-
[解決済み] 標準入力にタイムスタンプを前置するUnixユーティリティはありますか?
-
[解決済み] ファイルにテキストを前置するUnixコマンド
-
[解決済み] ディレクトリの存在確認と削除を1つのコマンドで行う unix
-
[解決済み] Unixの「ls」による名前順ソート
-
[解決済み] シェルスクリプトにヘルプメソッドを追加するにはどうすればよいですか?
-
[解決済み] ssh user@host コマンド`が動作するように $PATH を設定するには?