在我該系列的之前的所有隨筆中,都是采用 Linux 發行版自帶的包管理工具(如 apt-get、yum 等)進行軟件的安裝和卸載,從來沒有向大家展示使用源代碼自行編譯安裝軟件的方法。但是長期混跡於 Unix/Linux 世界的童鞋們都知道,從源代碼自行編譯安裝軟件並不是那么的難,一般都是這樣三個步驟:
configure make make install
之所以能夠把源代碼的構建管理得如此簡單,這得益於 Gnu 的 Autotools 工具鏈。在上面的三個命令中,configure 是一個腳本,它的功能很強大,可以探測系統環境,比如探測出系統中的編譯工具版本、標准庫版本以及其它需要依賴的工具,生成一個Makefile,而后面的 make 和 make install 就根據剛生成的 Makefile 進行軟件的編譯和安裝。看似很簡單,但事實上 Autotools 工具鏈非常復雜,復雜到我多少次想學習這些工具都望而卻步。直到我遇到 Eclipse。
先來說說 Gnu Autotools,關於該工具鏈的使用方法網上有很多的博文,我這里來一張圖片先:
可以看到,Gnu Autotools 包含了 autoscan、aclocal、automake、autoconf、autoheader 等工具,而且還涉及一門非常古老的宏語言 m4 。其工作原理是這樣的,先由 autoscan 對源碼進行掃描,生成一個 Configure.scan 文件,然后用戶對該文件進行編輯,生成 configure.in 文件。用戶還要編寫一個文件,那就是 Makefile.am 文件。然后 automake 對 Makefile.am 和 configure.in 文件進行處理,生成 Makefile.in 文件,而 autoconf 工具對 configure.in 進行處理,生成 configure 腳本, autoheader 工具對 configure.in 文件進行處理,生成 config.h.in 文件。至此,Autotools 工具的使命完成,生成的這些文件可以交付給用戶使用了。用戶拿到源碼包后,運行 configure 腳本,該腳本會處理 Makefile.in 文件,生成最后的 Makefile,同時處理 config.h.in 文件,生成 config.h 文件。有了 Makefile,用戶就可以使用 make 和 make install 編譯和安裝該軟件了。(注:configure.in 或 configure.ac 均可。)
那么 aclocal 命令干啥用呢?這是因為 configure.in 文件中包含了大量的 m4 宏,這些宏最終都會展開為各種各樣的 Shell 代碼,用來探測系統環境。但是這些宏的定義往往散布在系統的各個角落,aclocal 命令就是將這些用到的宏收集到一個文件 aclocal.m4 中。
這個工具鏈真的是太復雜了,幸好我有 Eclipse。看過我 Java 博客的朋友都知道我是 Eclipse 粉,這里不多說。我們來看看 Ubuntu 的軟件源中都有 Eclipse 的哪些包,如下圖:
命令sudo aptitude search eclipse 可以找出軟件源中所有包含單詞 eclipse 的軟件包,但是我要過濾一下,不是以 eclipse 開頭的不要,包含“:i386”的也不要,因為我是64位的平台,默認的軟件包正適合我,所以就有了后面的 | grep ' eclipse' | grep -v ':' ,最后,再加一個管道,使用 awk 命令只顯示第2列,也就是軟件包的名字。結果如上圖所示。
從這些結果中可以看出,eclipse-cdt 是用來寫 C/C++ 代碼的 IDE 環境,而且還有 eclipse-cdt-autotools 包可用,那真的是正中我的下懷。不過我更貪心一點,我想安裝所有的這些和 eclipse 相關的包,怎么辦?有辦法,在上面的命令后面再加上 | xargs echo sudo aptitude install 即可生成一個安裝所有這些包的命令。我把生成的結果重定向到一個腳本文件,給該腳本文件加上執行權限,然后運行它,如下圖:
回答一個“y”,就耐心地等待 eclipse 的安裝吧。安裝完成后,啟動 eclipse ,新建項目的時候就可以選擇 C++ 項目了,如下圖:
點下一步,是如下界面:
可以看到有很多種項目類型可以選擇,Eclipse 既可以使用它自己的項目文件管理 C/C++ 項目,也可以使用 Makefile 管理項目,當然,我們這里選擇使用 Gnu Autotools 管理項目,而且選擇簡單的“Hello World”示范項目。點下一步,如下圖:
輸入一些項目相關的信息,再繼續點下一步,如下圖:
如果點那個“Advanced settings”按鈕,還可以對 Gnu Autotools 工具鏈進行更詳細的設置。如下圖:
這個我這里就不瞎折騰了,點 OK 返回剛才的對話框,然后點 Finish 按鈕,結果如下圖:
Eclipse 提示我進入 C/C++ 透視圖。那是必須的,點 Yes 按鈕,結果如下圖:
左邊是項目文件的組成,右邊可以看到 Makefile 的各個 Target,上面的一排工具欄,帶錘子的那個就是 Build 命令。再看看下圖:
而帶箭頭的那個按鈕,就是運行程序的命令了。運行左邊的那個帶小蟲子的按鈕,就是調試命令。而且從上圖可以看出,在 Build 之前,左側的項目瀏覽器中看到的文件比較少,除了那個簡單的顯示 Hello World 的 cpp 文件之外,就只有 configure.ac 和 Makefile.am 值得我們看一看。看看 configure.ac 的內容,如下圖,里面就是幾行簡單的 m4 宏。如下圖:
Build 一下,就不得了了,如下圖:
左邊的項目視圖,里面 aclocale.m4、configure腳本、Makefile.in 和 Makefile 都有了,右邊的 Makefile 視圖也可以看到一滿條 Targets 了。中間,讓大家見識一下傳說中的 m4 宏是什么樣子的。
下圖,看看生成的 configure 腳本:
四千多行啊,太恐怖了。雖然我在這里 Bash腳本編程語言中的美學與哲學 和大家探討過 Shell 腳本,但是對於寫四千多行的 configure 文件我是想都不敢想。好在該文件是自動生成的。
同樣自動生成的文件還有 Makefile ,七百多行,也夠人喝一壺的,如下圖:
在右邊選擇一個 Makefile 的 Target,點鼠標右鍵,在彈出的菜單中選擇 Build Target,就可以進行相應的構建。是不是很方便呢?如下圖:
現在,把 Eclipse 提供的 GUI 界面和前面介紹的 Gnu Autotools 工具鏈相互驗證一下,是不是感覺突然明白了很多呢?
(京山游俠於2015-03-16發布於博客園,轉載請注明出處。)
