翻譯一篇文章,我最早從這篇文章中瞭解到為什麼Linux平台上,從原始碼安裝軟體通常都需要這三步:./configure, make, make install 。譯文如下:
我總是聽人們說,通常只要使用configure, make, make install來讓程式可以運行。不幸的是大多數現在用電腦的是根本沒有使用過compiler,或是寫過一行代碼。隨著圖形使用者介面(GUI),應用程式構建工具(application builder)的出現,現在很多真正的程式員也不用configure; make; make install了。
你所要做的有三步,每一步都會使用現有的程式使得一個新的程式就緒或運行。在make之前先要使用configure,但每一步都會有著不同的目的。接來我會解釋第二步(make)和第三步(make install),之後我會再解釋configure.
make這個實用工作已經成為Unix曆史的一部分了。設計它的主要目的是減少程式員的記憶負擔。我猜,更好的說法是它減少了程式員所需編寫的文檔。在任何情況下,一旦你建立了一套make可以理解的規則去建立一個程式,你就不用再惦記著他們(這套規則)了。
為了讓這些工作變得簡單,make工具 + 生產力有一套內建的規則,你只要告訴make構建你的程式所需的規則。舉例來說,你輸入了make love,make會根據你的輸入尋找一些規則,如果你壓根就沒有建立規則,他們使用內建的規則,其中的一個內建規則就是運行Linker,找到 程式名.o 結尾檔案去產生一個可執行檔。
所以,make會去到名為love.o的檔案。但make並不會止步於此。即使它找到了.o檔案,它還有一組規則確保.o檔案是最新的。換句話說,就是比原始碼檔案要新。在Linux系統中,最常的原始碼是用C語言所編寫的以.c為尾碼的檔案。
如果make同時找到了.c檔案(love.c)和.o檔案,它會查看它們倆的時間戳記來確保.o檔案更加新一些,如果沒有.c檔案新,或是.o檔案不存在,make會使用另一組內建的規則用.c檔案(使用C compiler)構建一個新的.o檔案。對其它類型的編程也會採用相同的規則。最終當make運行完成後,會有一個最新的可執行程式產生。
順便提一個Unix上的笑話,來自於早期版本make。當make找不到所需的檔案時,例如沒有love.o,love.c或其它格式的原始碼檔案,make程式會說:
make: don’t know how to make love. Stop.
再回到正題,通常make使用目前的目錄下的Makefile。如果你有一個程式原始碼檔案,那邊有Makefile,你可以看一看。他就內容就是普通文本。單詞後跟冒號行就是目標(target),也就是你緊隨make命令之後輸入的東西。make根據你的不同輸入執行一些不同的操作。如果你只是輸入make而不跟隨任何命令,第一個目標將會被執行。
在大多數make檔案的開頭部分,你最有可能見到的是一些類似賦值的語句。每行有很多欄位,欄位間用等號相連。它們用來設定make的內部變數。常見的設定如C compiler的位置,程式的版本號碼,等類似的東西。
現在是回到談configure的時候了。在不同的系統中C compiler可能位於不同的位置,你可能使用zsh而不是bash作為你的shell,程式可能需要知道你的主機名稱,可能會使用dbm庫,需要知道系統中安裝的是gdbm庫,還是ndbm庫,等等,等等。為了完成這些配置,時常需要修改Makefile。另外一個讓程式員痛苦的是:任何時候你想要在一個新的系統中安裝軟體,你都需要重新列舉出這些配置。
伴隨著越來越多的軟體被開發出來,更多相容POSIX系統出現,這些配置的工作越來越難做。這時configure出現了。它是一個shell指令碼(通常用GNU Autoconf來編寫),它來尋找一些工具的位置,試圖看這些工具是否可以工作。之後便按照Makefile.in檔案的指示產生可能在當前系統中工作Makefile(可能還有別的檔案)。
背景知道介紹完了,讓我們總結一下吧:
- 你運行configure(通常你在shell中輸入./configure),這會產生一個新的Makefile檔案。
- 鍵入make命令,構建程式。他會在Makefile中找到第一個target,根據第一個target的說明來構建可執行檔。這步的目的就是產生一個可執行檔。
- 現在,以root的身份鍵入make install。再次調用make找到一個名為install的target,根據這個target指定的檔案和目錄安裝軟體。
這是一個簡化了的解釋,但在大多數情況下,你知道這些就足夠了。大多數程式都會有一個名為INSTALL的檔案,這個檔案包含了安裝步驟,和一些注意事項。比如,提供一些選項給configure命令來改變最終可執行檔的目錄。同時還會有其它的make target,諸如clean,用來在安裝完成後執行一些清理工作。還有些時候會有test這個target,允許你在make和make install這兩個步驟之間測試產生的可執行軟體。
原文網址:http://tldp.org/LDP/LG/current/smith.html