溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Autotools發(fā)展史

發(fā)布時(shí)間:2020-02-28 18:00:54 來(lái)源:網(wǎng)絡(luò) 閱讀:687 作者:宅學(xué)部落 欄目:系統(tǒng)運(yùn)維

在linux下面擼過代碼、做過開發(fā)的,想必都聽說(shuō)過Makefile。

對(duì),是Makefile,不是make love。如果你看成了后者,只能說(shuō):同志,你的三觀有問題,需要格式化你的硬盤~

Autotools發(fā)展史

在linux開發(fā)程序,沒有集成開發(fā)環(huán)境IDE(integrated development environment),沒有VC++6.0,

只有Makefile和冰冷黑漆漆的shell窗口,寒冷的夜,考驗(yàn)著每一個(gè)工程師疲憊的心

Makefile語(yǔ)法復(fù)雜、難以維護(hù)。對(duì)于一個(gè)小項(xiàng)目還好,對(duì)于大型的項(xiàng)目和開源項(xiàng)目,現(xiàn)在流行使用一些工具自動(dòng)生成Makefile,可以大大減輕軟件開發(fā)人員的負(fù)擔(dān)。

比較常見的工具有GNU Autotools、CMake、QMake、SCons、Ant等。今天講講GNU Autotools,這個(gè)工具在開源軟件和大型項(xiàng)目中被廣泛地使用。

Autotools主要有Autoconf、automake、libtool等軟件包工具組成,我們可以稱為Autotools三劍客。

使用這幾個(gè)工具,雖然能幫助我們自動(dòng)生成Makefile,但是命令過程復(fù)雜,中間會(huì)生成大量的各種配置文件和腳本。很多人往往會(huì)覺得很麻煩、搞不懂里面錯(cuò)綜復(fù)雜的關(guān)系,今天以這些工具的發(fā)展過程,給大家理理里面的關(guān)系。

一、手工makefile時(shí)代

早期我們?cè)赨nix、linux環(huán)境下開發(fā)軟件,makefile都是手寫的。通過makefile,我們就可以使用make命令直接去編譯我們的源代碼。

Autotools發(fā)展史

后來(lái),隨著Unix版本越來(lái)越多,各分支差異越來(lái)越大,我們寫的makefile,有時(shí)候在其它Unix平臺(tái)上可能就編譯失敗,比如庫(kù)的問題等。不同的操作系統(tǒng)版本,庫(kù)和頭文件的路徑可能不一樣。怎么辦?

后來(lái)我們通過手寫一個(gè)配置腳本configure來(lái)解決這個(gè)問題:針對(duì)你當(dāng)前的Unix平臺(tái),通過腳本對(duì)makefile進(jìn)行配置,就可以在當(dāng)前平臺(tái)上愉快地編譯了。

Autotools發(fā)展史

二、Autoconf時(shí)代

后來(lái)linux操作系統(tǒng)問世,后續(xù)的版本也越來(lái)越多,各種發(fā)布版本錯(cuò)綜復(fù)雜,比如Redhat系列、debian系列等。差異越來(lái)越大,甚至包括操作系統(tǒng)的接口都出現(xiàn)差異。這時(shí)候別說(shuō)makefile能不能正確編譯的問題了,就連我們編寫的應(yīng)用程序,即使編譯正確,也有可能在其它的平臺(tái)上運(yùn)行不起來(lái)。這個(gè)問題,大家都知道,后來(lái)出現(xiàn)了POSIX API標(biāo)準(zhǔn),就是可移植的操作系統(tǒng)接口。就是無(wú)論你是發(fā)布什么版本的Unix、Linux,OS的接口要遵循這個(gè)標(biāo)準(zhǔn),這樣我們編寫的應(yīng)用程序才能在linux、Unix等系列版本的操作系統(tǒng)上暢通無(wú)阻地運(yùn)行。

而對(duì)于makefile來(lái)說(shuō),為了適配操作系統(tǒng)的更多版本,只能不斷地添加代碼,這就導(dǎo)致configure腳本越來(lái)遠(yuǎn)大,導(dǎo)致后來(lái)開發(fā)人員再也受不了了,維護(hù)成本越來(lái)越高。

1991年,David Mackenzie開發(fā)了Autoconf工具,用來(lái)自動(dòng)生成configure腳本。因?yàn)閷?duì)于大多數(shù)用戶來(lái)說(shuō),對(duì)于不同版本的差異、庫(kù)的版本、底層的細(xì)節(jié),鬼才懶得管。他們關(guān)心的就是庫(kù)文件、頭文件的位置、軟件最終的安裝路徑是在哪里。所以這個(gè)工具的出現(xiàn),大大解放了開發(fā)人員的時(shí)間,給廣大程序員帶來(lái)了福音。

用戶只需要定義幾個(gè)宏,表示我們關(guān)心的配置選項(xiàng),保存在configure.ac文件里,然后使用Autoconf工具就可以幫我們自動(dòng)生成configure腳本了!

Autotools發(fā)展史

Autoconf工具真是比大姨媽還貼心,為了減輕程序員的負(fù)擔(dān),configure.ac文件也不用我們手寫了。Autoconf工具包里有個(gè)autoscan工具,可以自動(dòng)掃描我們的項(xiàng)目,生成一個(gè)configure.scan文件,里面自動(dòng)添加了很多宏,省得我們?cè)偈止ぬ砑印?/p>

我們只需要將這個(gè)configure.scan文件重命名為configure.ac文件,再修修補(bǔ)補(bǔ),就可以了。

Autotools發(fā)展史

Autoconf工具大大減輕了程序員的負(fù)擔(dān),媽媽,再也不用擔(dān)心晚回家吃飯了

三、automake時(shí)代

然而,隨著項(xiàng)目越來(lái)越大,makefile也越來(lái)越復(fù)雜,尤其是大型項(xiàng)目,手寫越來(lái)越困難,怎么辦?

automake工具這個(gè)時(shí)候閃亮登場(chǎng)了!

對(duì)于開發(fā)人員來(lái)說(shuō),我們關(guān)心的就是這個(gè)項(xiàng)目要生成什么可執(zhí)行文件,需要編譯哪些源文件,至于怎么編譯的?底層的鏈接細(xì)節(jié),鬼才懶得管。程序員的加班已經(jīng)夠多,內(nèi)心已經(jīng)夠疲憊,我們拒絕makefile的肆虐和壓迫!

使用automake工具,我們只需要手工編寫一個(gè)makefile.am文件,在里面定義我們想要生成的目標(biāo)、需要編譯的源文件,然后使用automake工具就可以幫我們自動(dòng)生成makefile!

但是此時(shí)的makefile,是通用的makefile,定義了程序編譯、鏈接的通用規(guī)則,保存在makefile.in里面。

如果想在特定平臺(tái)上成功編譯,還需要我們前面的腳本configure配置一下,最終才生成我們項(xiàng)目的Makefile。

Autotools發(fā)展史

Autoconf工具通過定義一系列的宏,提供給我們使用,讓我們?nèi)ピO(shè)置一些需要的配置選項(xiàng)、去配置我們的makefile。

后來(lái)Automake工具出現(xiàn)后,自定義了一些宏,對(duì)這些宏進(jìn)行了擴(kuò)展。比如,Autoconf以前都是單獨(dú)使用的,現(xiàn)在要跟automake配合使用,要在configure.ac文件里添加一個(gè)AM_INIT_AUTOMAKE這個(gè)宏。

這個(gè)宏是在automake工具包里定義的,當(dāng)我們運(yùn)行autoconf命令的時(shí)候,就是出錯(cuò),因?yàn)檎也坏竭@個(gè)宏的定義。怎么辦,咋辦?

后來(lái)在configure.ac同目錄下,定義一個(gè)aclocal.m4格式的文件,里面存放用戶定義的一些宏、或者automake的一些宏,這樣,autoconf運(yùn)行的時(shí)候,就可以在這個(gè)文件里找到宏定義了。

偷懶,是人類社會(huì)進(jìn)步的最大動(dòng)力。后來(lái),為了進(jìn)一步減少工作量,又出現(xiàn)一個(gè)aclocal工具,會(huì)自動(dòng)將automake、autoconf以及用戶定義的所有宏統(tǒng)統(tǒng)放在aclocal.m4文件里。

Autotools發(fā)展史

為什么要保存在aclocal.m4這種格式的文件里?我也不知道....,m4,macro宏后面4個(gè)字母,縮寫就是m4.

文本文件嘛,后綴名可以隨便定義,比如我姓王,后綴名定義為.wang也是可以的。不要糾結(jié)于這些細(xì)節(jié),我們的征途是構(gòu)建makefile。

autoconf工具包里還有一個(gè)autoheader工具,用來(lái)將configure.ac里面的宏配置轉(zhuǎn)換為我們C語(yǔ)言格式的#define形式,并保存在config.h.in文件里,當(dāng)我們運(yùn)行./configure生成makefile的時(shí)候,順便也會(huì)將config.h.in轉(zhuǎn)換為config.h文件,這樣在我們的程序里,如果想使用這些宏,就可以直接#include “config.h”就可以了。

比如頭文件里面定義的軟件版本號(hào)VERSION宏,就可以在程序里直接使用,打印在程序里打印我們的軟件版本號(hào)。

四、libtool時(shí)代

隨著Unix、Linux之間的差異越來(lái)越大,對(duì)動(dòng)態(tài)共享庫(kù)的管理差異也越來(lái)越大,比如有些共享庫(kù),使用.so格式,有的是.a,有的是.o的形式。運(yùn)行時(shí)對(duì)動(dòng)態(tài)庫(kù)的管理方式也一樣,有的操作系統(tǒng)支持動(dòng)態(tài)加載,有的就不支持。這就對(duì)我們Makefile帶來(lái)了挑戰(zhàn)。怎么辦?libtool的工具出現(xiàn)就是為了解決這個(gè)問題的,它通過對(duì)生成的動(dòng)態(tài)庫(kù)進(jìn)行抽象,統(tǒng)一生成.la的形式,可以支持十幾種各種不同的平臺(tái)。

Autotools發(fā)展史

具體的使用教程,可以參考我發(fā)布的視頻教程:《Makefile工程實(shí)踐》第二季--使用autotools自動(dòng)構(gòu)建項(xiàng)目的Makefile。



向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI