2013-05-19 93 views
7

我知道從源碼安裝的過程是。爲什麼在「make install」之前「make」

  1. 的./configure
  2. 使
  3. 使安裝

但爲什麼 「讓安裝」 之前 「做」,爲什麼不只是做 「讓安裝」

我的瞭解,以便「make」只是將源代碼編譯成可執行文件,而「make install」實際上將它們放入可執行文件夾中,對嗎?

也許我沒有明確表示我的問題,並對此表示遺憾。

說,我們要在機器上安裝可執行文件,我們可以做

  1. 的./configure
  2. 使安裝的

,而不是以上3個步驟。

回答

10

當您運行make,你指示它基本上遵循一套構建步驟特定目標。當不帶參數調用make時,它運行第一個目標,它通常只是編譯項目。 make install映射到install目標,它通常不會將二進制文件複製到目標中。

通常,install目標取決於編譯目標,因此只需運行make install即可獲得相同的結果。 但是,我可以看到至少有一個很好的理由在分開的步驟:特權分離。

通常,當您安裝軟件時,它會進入普通用戶沒有寫權限的位置(如/usr/bin/usr/local/bin)。通常情況下,最終實際上必須運行make,然後運行sudo make install,因爲安裝步驟需要權限升級。這是一個「Good Thing™」,因爲它允許您的軟件作爲普通用戶進行編譯(這對某些項目實際上有所不同),限制了嚴重行爲構建過程的潛在損害範圍,並且僅獲取根安裝步驟的權限。

+0

只是旁註:「make」沒有任何評論會跳過任何通配符目標。 '%'相當於目標名稱的正則表達式'+'。防爆。如果您有3個目標:1)「%_targetsuffix:」2)「wildTarget:」3)「defaultTarget:」按此順序從上到下。 「make」命令將跳過「%_youtargetsuffic:」並構建「wildTarget:」(「defaultTarget:」被忽略,因爲「wildTarget:」在它之前)。對不起,我不知道如何格式化評論以提高可讀性。 – funa68

0

很多軟件這些日子只會做make install正確的事情。 在那些不會的情況下,安裝目標不會依賴編譯的二進制文件。 所以爲了安全起見,大多數人使用make && make install或其變體只是爲了安全起見。

3

make不帶參數取./Makefile(或./makefile),並構建第一目標。按照慣例,這可能是所有目標,但不一定。 make install建立特殊目標,安裝。按照慣例,這需要make all的結果,並將它們安裝在當前計算機上。

不是每個人都需要make install。例如,如果您構建了一個Web應用程序以部署在不同的服務器上,或者如果您使用交叉編譯器(例如,您在Linux機器上構建Android應用程序),則運行make install是沒有意義的。

在大多數情況下,單行./configure && make all install將等同於您描述的三步過程,但這取決於產品,根據您的具體需求,而且這僅僅是一個約定。

1

有幾次我想嘗試編譯代碼更改但不部署這些更改。例如,如果我要攻擊Asterisk C代碼庫,並且我想確保我所做的更改仍然可以編譯,那麼我將保存並運行make。但是,我不想部署這些更改,因爲我沒有編寫代碼。

對我來說,運行make只是一種方法,可以確保我的代碼中沒有太多的編譯錯誤,導致我無法定位它們。也許更有經驗的C程序員沒有這個問題,但對我來說,限制編譯之間的變化次數有助於減少可能已經完全丟棄我的構建的可能變化的數量,這使得調試更容易。

最後,這也有助於給我一個停止點。如果我想去吃午飯,我知道有人可以在當前工作狀態下重新啓動應用程序,而無需找到我,因爲只有進行安裝才能將二進制文件複製到實際的應用程序文件夾中。

可能還有其他原因,但這是我接受兩個命令分開的原因。正如其他人所說,如果你想讓他們結合起來,你可以使用你的shell將它們結合起來。