在 Debian 中,有多種編譯工具可用于幫助開發(fā)人員編譯和構(gòu)建他們的程序。其中包括 make、Autotools和 Meson,這些編譯工具在 Debian 中得到良好的支持,并且可通過軟件包管理器進行安裝和使用。本篇教程將詳細介紹Debian編譯工具。
編譯工具軟件包列表:
軟件包 | 流行度 | 大小 | 文檔 |
make | V:152, I:556 | 1592 | 通過 make-doc 包提供“info make” |
autoconf | V:31, I:232 | 2025 | 由 autoconf-doc 包提供“info autoconf” |
automake | V:31, I:231 | 1837 | 由 automake1.10-doc 包提供“info automake” |
libtool | V:26, I:215 | 1213 | 由 libtool-doc 包提供”info libtool” |
cmake | V:16, I:115 | 36695 | cmake(1) 跨平臺、開源的編譯系統(tǒng) |
ninja-build | V:6, I:40 | 428 | ninja(1) 接近 Make 精髓的小編譯系統(tǒng) |
meson | V:3, I:22 | 3741 | meson(1) 在 ninja 之上的高生產(chǎn)力的構(gòu)建系統(tǒng) |
xutils-dev | V:0, I:9 | 1484 | imake(1),xmkmf(1) 等。 |
一、make
Make 是一個維護程序組的工具。一旦執(zhí)行 make(1),make 會讀取規(guī)則文件 Makefile,自從上次目標文件被修改后,如果目標文件依賴的相關(guān)文件發(fā)生了改變,那么就會更新目標文件,或者目標文件不存在,那么這些文件更新可能會同時發(fā)生。
規(guī)則文件的語法如下所示:
target: [ prerequisites ... ] [TAB] command1 [TAB] -command2 # ignore errors [TAB] @command3 # suppress echoing
“[TAB]”表示制表符,它用于在shell腳本中進行代碼塊的縮進。在變量替換之后,shell會逐行解釋執(zhí)行腳本。如果一行代碼太長,可以使用行尾的反斜杠(”)來表示繼續(xù)到下一行。為了在shell腳本中獲取環(huán)境變量的值,可以使用兩個連續(xù)的美元符號($$)。
目標跟相關(guān)文件也可以通過隱式規(guī)則給出,例如,如下所示:
%.o: %.c header.h
在這里,目標包含了 “%” 字符 (只是它們中確切的某一個)。”%” 字符能夠匹配實際的目標文件中任意一個非空的子串。相關(guān)文件同樣使用 “%” 來表明它們是怎樣與目標文件建立聯(lián)系的。
自動變量的列表:
自動變量 | 值 |
---|---|
$@ |
當前目標 |
$< |
首個相關(guān)文件 |
$? |
所有較新的相關(guān)文件 |
$^ |
所有相關(guān)文件 |
$* |
目標模式中,$* 指代匹配符 “% ” 匹配的部分 |
變量擴展的列表:
變量擴展 | 說明 |
---|---|
foo1 := bar |
一次性擴展 |
foo2 = bar |
遞歸擴展 |
foo3 += bar |
增加 |
運行 “make -p -f/dev/null” 命令來查看內(nèi)部自動化的規(guī)則。
二、Autotools
Autotools 是一套工具集,旨在幫助開發(fā)者將源代碼軟件包移植到多種類 Unix 系統(tǒng)上。它根據(jù)“configure.ac”文件生成一個 shell 腳本“configure”。這個“configure”腳本用于自動檢測系統(tǒng)特性和依賴關(guān)系,以便從“Makefile.in”模板生成適合當前系統(tǒng)的“Makefile”。Automake 則是根據(jù)“Makefile.am”文件生成“Makefile.in”的工具。它簡化了“Makefile”的創(chuàng)建過程,使之更符合GNU編碼標準。
Libtool是一個shell腳本工具,用于在編譯共享庫時自動處理與軟件移植性相關(guān)的問題,確保庫的正確鏈接和安裝。
1、編譯并安裝程序
當安裝編譯好的程序的時候,注意不要覆蓋系統(tǒng)文件。
Debian 不會在 “/usr/local” 或 “/opt” 目錄下創(chuàng)建文件。如果想要源碼編譯程序,把它安裝到 “/usr/local/” 目錄下,因為這并不會影響到 Debian。
$ cd src $ ./configure --prefix=/usr/local $ make # this compiles program $ sudo make install # this installs the files in the system
2、卸載程序
如果有源碼并且它使用 autoconf(1)/automake(1),如果能記得是怎樣配置它的話,執(zhí)行如下的命令來卸載程序。
$ ./configure all-of-the-options-you-gave-it $ sudo make uninstall
或者,如果十分確信安裝進程把文件都放在了 “/usr/local/” 下并且這里沒什么重要的東西,可以通過如下的命令來清除它所有的內(nèi)容。
# find /usr/local -type f -print0 | xargs -0 rm -f
如果不確定文件被安裝到了哪里,可以考慮使用 checkinstall 軟件包中的 checkinstall(8),它將會提供一個清晰的卸載路徑?,F(xiàn)在,它支持創(chuàng)建帶有 “-D” 選項的 Debian 軟件包。
三、Meson
隨著軟件開發(fā)的不斷演進,構(gòu)建系統(tǒng)也在不斷進步。自90年代起,Autotools作為一套可移植構(gòu)建架構(gòu),在Make的基礎(chǔ)上成為了事實上的標準,但它的處理速度相對較慢。
CMake于2000年推出,顯著地提升了構(gòu)建速度,盡管它仍然基于本質(zhì)上較慢的Make系統(tǒng)。不過,現(xiàn)在CMake可以使用Ninja作為其后端構(gòu)建工具。
Ninja在2012年發(fā)布,目標是取代Make,以進一步加快構(gòu)建速度。它的設(shè)計允許其他上層構(gòu)建系統(tǒng)生成輸入文件。
Meson于2013年推出,是一個較新且流行的構(gòu)建系統(tǒng),它不僅速度快,而且屬于上層構(gòu)建系統(tǒng),默認使用Ninja作為后端工具,從而充分利用了Ninja的速度優(yōu)勢。