[Unix] 為什麼總是./configure; 使; 安裝; 作為3個單獨的步驟?


Answers

首先,它應該是./configure && make && make install因為每個都取決於前者的成功。 部分原因是演化,部分原因是開發工作流程方便。

最初,大多數Makefile只包含編譯程序的命令,並且安裝由用戶完成。 一個額外的規則允許make install將編譯後的輸出放在一個可能正確的地方; 還有很多很好的理由,你可能不想這樣做,包括不是系統管理員,根本不想安裝它。 而且,如果我正在開發軟件,我可能不想安裝它。 我想進行一些更改並測試坐在我的目錄中的版本。 如果我要有多個版本,這變得更加突出。

./configure會去檢測環境中可用的和/或用戶想要的,以確定如何構建軟件。 這不是需要經常改變的東西,而且往往需要一些時間。 再次,如果我是一名開發人員,不值得花時間重新配置。 更重要的是,由於make使用時間戳來重建模塊,如果我重新運行configure ,那麼標誌可能會改變,現在我的構建中的某些組件將用一組標誌進行編譯,而其他組件則使用一組不同的標誌導致不同的,不相容的行為。 只要我不重新運行configure ,即使我更改了源代碼,我也知道我的編譯環境保持不變。 如果我重新運行configure ,我應該首先make clean掉所有內置源以確保所有內容均勻地構建。

連續運行三個命令的唯一情況是用戶安裝程序或構建了一個包(例如,Debian的debuild或RedHat的rpmbuild)。 並且假定可以給包提供一個普通的configure ,通常情況下不需要打包,至少需要--prefix=/usr 。 並且pacakgers喜歡在做make install部分時處理偽造的根。 由於存在很多例外情況,因此使用./configure && make && make install規則對於許多頻繁使用它的人來說是不方便的!

Question

每當你從源代碼編譯東西時,你都要經歷3個步驟:

$ ./configure
$ make
$ make install

我明白,將安裝過程劃分為不同的步驟是有意義的,但我不明白,為什麼這個星球上的每個編碼器都必須一次又一次地編寫相同的三個命令才能完成一項單獨的工作。 從我的角度來看,使用包含以下文本的源代碼自動提供./install.sh腳本是完全有意義的:

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

人們為什麼要分開做3個步驟?




首先./configure並不總能找到它需要的所有東西,或者在其他情況下找到它需要的所有東西,但不是它可以使用的所有東西。 在這種情況下,你會想知道它(和你的./install.sh腳本無論如何都會失敗!)從我的角度來看,無故障帶來意想不到後果的典型例子是編譯ffmpeg或mplayer等大型應用程序。 如果它們可用,它們將使用庫,但如果它們不可用,則會進行編譯,從而禁用某些選項。 問題在於你後來發現它是在沒有對某種格式或其他格式的支持的情況下編譯的,因此要求你回去重做它。

另一件事./configure有點交互式地給你選擇定制應用程序在系統上的安裝位置。 不同的發行版/環境具有不同的約定,您可能想要遵守系統上的約定。 此外,您可能想要在本地安裝(僅限於您自己)。 傳統上,./configure和make步驟不能以root身份運行,而make install(除非它是為你自己安裝的)必須以root身份運行。

特定的發行版經常提供以分發敏感的方式執行./install.sh功能的腳本 - 例如, 源RPMs + spec文件+ rpmbuildslackbuilds

(注:據說,我同意./configure; make; make install;會變得非常單調乏味。)




Links