從 0 開始學(xué)習(xí) Linux 系列之「10.Autoconf 打包軟件」

Autoconf

版權(quán)聲明:本文為 cdeveloper 原創(chuàng)文章镶殷,可以隨意轉(zhuǎn)載利花,但必須在明確位置注明出處!

Autoconf 簡(jiǎn)介

Autoconf 是一種用于生成 shell 腳本的工具泊藕,可自動(dòng)配置軟件源代碼包辅辩,以適應(yīng)多種類型的類似 Posix 的系統(tǒng)。你可以簡(jiǎn)單地把它看為打包源碼的工具娃圆,例如你在 GNU 官網(wǎng)下載的那些 xxx.tar.gz 格式的軟件包玫锋,我們使用這個(gè)工具最終目的就是將源代碼打成一個(gè)包來提供給別人使用。本次就跟大家分享下如何打包一個(gè)基本的 Hello World 給別人使用讼呢,掌握這個(gè)步驟以后就可以類比來打包別的軟件包了撩鹿,首先我們來看看 Autoconf 的基本打包流程。

Autoconf 打包流程

我們使用 Autoconf 打包一個(gè)軟件包主要依靠下面這張圖:

Autoconf

這張圖中主要使用了 5 個(gè)與 autoconf 相關(guān)的工具悦屏,我們分別來了解即可节沦,不需要深入學(xué)習(xí)。

1. autoscan

autoscan 用來掃描源代碼目錄并生成 configure.scan 文件础爬,這個(gè)文件包含了系統(tǒng)配置的基本選項(xiàng)散劫,里面都是一些宏定義,在使用的時(shí)候需要將這個(gè)文件改名為 configure.ac幕帆,并修改相關(guān)的配置,我們后面在實(shí)際例子中介紹赖条。

2. aclocal

aclocal 是一個(gè) prel 腳本程序失乾,aclocal 根據(jù) configure.ac 文件的內(nèi)容自動(dòng)生成 aclocal.m4 文件常熙,這個(gè)文件內(nèi)容是 configure.ac 中的宏展開

3. autoconf

autoconf 用來產(chǎn)生 configure 文件碱茁,這個(gè)文件就是我們?cè)谑謩?dòng)編譯一個(gè)軟件是要做的第一步:./configure裸卫。

4. autoheader

autoheader 自動(dòng)生成相關(guān)的文件,這個(gè)功能在源碼需要頭文件時(shí)才使用纽竣。

5. automake

automake 可以將 Makefile.am 生成 Makfile.in墓贿,但是 Makefil.am 需要我們手動(dòng)書寫。

了解了這 5 個(gè)工具蜓氨,下面我們就來打包一個(gè)實(shí)際的 Hello World !

實(shí)踐:Autoconf 打包 Hello World

我們來以一個(gè)實(shí)際打包 hello.c 的例子來介紹 Autoconf 的基本用法聋袋。

安裝 autoconf

首先確定你的系統(tǒng)有沒有安裝 autoconf,在命令行鍵入 autoconf穴吹,如果提示沒有安裝幽勒,則需要先安裝:

sudo apt-get install autoconf

編輯 hello.c

我們編寫一個(gè) hello.c 作為測(cè)試:

#include <stdio.h>
int main(void) {
    printf("Hello World!\n");
    return 0;
}

下面就開始正式打包流程。

1. autoscan

從上面的圖中可以看到港令,第一步我們需要使用 autoscan 來生成 configure.scan 文件:

autoscan

執(zhí)行的結(jié)果除了 hello.c 還有另外 2 個(gè)文件:

autoscan

2. 修改 configure.ac

之后我們還需要將 configure.scan 改名configure.ac啥容,并修改以下的 3 點(diǎn)內(nèi)容:

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.69])

# 1. 修改:可執(zhí)行文件名稱,版本號(hào)顷霹,bug 郵箱
AC_INIT(hello, 1.0, chenghjy@gmail.com)

AC_CONFIG_SRCDIR([hello.c])
AC_CONFIG_HEADERS([config.h])

# 2. 我們后面使用 automake, 所以需要加上這個(gè)配置
AM_INIT_AUTOMAKE

# Checks for programs.
AC_PROG_CC

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

# 3. 輸出文件指定為 Makefile
AC_OUTPUT(Makefile)

3. aclocal

從上圖可以看到我們生成 configure 需要 [aclocal.m4] 文件咪惠,我們使用 aclocal 來生成:

aclocal

結(jié)果生成了 aclocal.m4 文件,如下圖所示:

aclocal

4. autoconf

現(xiàn)在可以使用 autoconf 來生成 configure 啦:

autoconf

結(jié)果如下淋淀,生成了 configure

autoconf

我們直接執(zhí)行 ./configure 看看是否能夠配置成功:

./configure

# 結(jié)果
configure: error: cannot find install-sh, install.sh, or shtool in "." "./.." "./../.."

但是結(jié)果提示我們缺少一些 shell 腳本遥昧,因此我們還需要進(jìn)行后面的配置。

5. autoheader

如果在 configure.ac 中需要頭文件绅喉,則需要進(jìn)行這一步渠鸽,否則不需要,我們配置了所以需要:

autoheader
autoheader

6. 編寫 Makefile.am

上圖中柴罐,我們?nèi)绻褂?automake 來生成 Makefile.in徽缚,則還需要 Makefile.am 文件,但是這個(gè)文件需要我們手動(dòng)編寫革屠,具體如何編寫凿试,可以查看 automake 官方文檔,在下面這個(gè)圖片位置:

Makefile.am

因?yàn)槲覀兊?hello 程序很簡(jiǎn)單似芝,不需要依賴其他的庫(kù)那婉,所以這里只需要寫 2 行:

bin_PROGRAMS = hello
hello_SOURCES = hello.c 

7. automake

上面寫完了 Makefile.am 文件,現(xiàn)在就可以使用 automake 來生成 Makefile.in 啦:

automake

# 結(jié)果
configure.ac:10: error: required file './compile' not found
configure.ac:10:   'automake --add-missing' can install 'compile'
configure.ac:8: error: required file './install-sh' not found
configure.ac:8:   'automake --add-missing' can install 'install-sh'
configure.ac:8: error: required file './missing' not found
configure.ac:8:   'automake --add-missing' can install 'missing'
Makefile.am: error: required file './INSTALL' not found
Makefile.am:   'automake --add-missing' can install 'INSTALL'
Makefile.am: error: required file './NEWS' not found
Makefile.am: error: required file './README' not found
Makefile.am: error: required file './AUTHORS' not found
Makefile.am: error: required file './ChangeLog' not found
Makefile.am: error: required file './COPYING' not found
Makefile.am:   'automake --add-missing' can install 'COPYING'
Makefile.am: error: required file './depcomp' not found
Makefile.am:   'automake --add-missing' can install 'depcomp'

但是出現(xiàn)了一些錯(cuò)誤党瓮,從提示信息中發(fā)現(xiàn)可以使用 automake --add-missing

automake --add-missing

# 結(jié)果
configure.ac:10: installing './compile'
configure.ac:8: installing './install-sh'
configure.ac:8: installing './missing'
Makefile.am: installing './INSTALL'
Makefile.am: error: required file './NEWS' not found
Makefile.am: error: required file './README' not found
Makefile.am: error: required file './AUTHORS' not found
Makefile.am: error: required file './ChangeLog' not found
Makefile.am: installing './COPYING' using GNU General Public License v3 file
Makefile.am:     Consider adding the COPYING file to the version control system
Makefile.am:     for your code, to avoid questions about which license your project uses
Makefile.am: installing './depcomp'

還是有錯(cuò)誤详炬,但是這個(gè)錯(cuò)誤很好解決,它提示 NEWS寞奸,README呛谜,AUTHORS在跳,ChangeLog 這 4 個(gè)文件沒有找到,其實(shí)這 4 個(gè)文件是一個(gè)正規(guī)軟件發(fā)布的時(shí)候一般都帶有的隐岛,我們這里新建這 4 個(gè)文件即可猫妙,就不寫內(nèi)容了:

touch NEWS README AUTHORS ChangeLog

# 再次執(zhí)行,沒有錯(cuò)誤信息
automake --add-missing 

結(jié)果生成了 Makefile.in聚凹,這也就是我們配置的最終結(jié)果啦:

Makefile.in

可以看到目前我們的文件已經(jīng)很多了割坠,是不是有些正式發(fā)布的軟件的樣子了,其實(shí)正式的軟件里面的大部分配置文件也是自動(dòng)生成的妒牙。不過我們還差最后一步:打包彼哼。

8. 打包

我們使用 make dist 命令直接打包:

# 先要配置得到 Makefile
./configure

# 打包
make dist

# ls 結(jié)果
hello-1.0.tar.gz

測(cè)試 hello-1.0.tar.gz

下面我們就來測(cè)試我們打包的 hello 程序是否可用,我們從配置到最后的卸載一共分為 6 步:

# 1. 配置:./configure 
./configure

# 2. 編譯:make
make

# 3. 安裝:install
sudo make install

# 4. 運(yùn)行
hello

# 5. 結(jié)果单旁,打印 Hello World! 說明成功啦沪羔!
Hello World!

# 6. 卸載:uninstall
sudo make uninstall

一路綠燈,說明我們打的包沒有問題象浑,那么這個(gè)實(shí)驗(yàn)也就到此結(jié)束了蔫饰。

結(jié)語

本次我們學(xué)習(xí)如何在 Linux 下通過命令行和 Autoconf 來打包一個(gè)程序,我們也知道了從網(wǎng)上下載下的軟件包中的那么多文件是怎么來的了愉豺,并且我們也實(shí)際練習(xí)了如何打包一個(gè) Hello World! 給別人使用了篓吁。通過這個(gè)例子,希望你能夠掌握 Autoconf 基本的用法蚪拦,在以后遇到問題的時(shí)候杖剪,還望你能主動(dòng)去 Autoconf 官網(wǎng) 查找資料,做一個(gè)主動(dòng)學(xué)習(xí)的人驰贷。

最后盛嘿,感謝你的閱讀,我們下次再見 :)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末括袒,一起剝皮案震驚了整個(gè)濱河市次兆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锹锰,老刑警劉巖芥炭,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異恃慧,居然都是意外死亡园蝠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門痢士,熙熙樓的掌柜王于貴愁眉苦臉地迎上來彪薛,“玉大人,你說我怎么就攤上這事∨闫” “怎么了训唱?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)挚冤。 經(jīng)常有香客問我,道長(zhǎng)赞庶,這世上最難降的妖魔是什么训挡? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮歧强,結(jié)果婚禮上澜薄,老公的妹妹穿的比我還像新娘。我一直安慰自己摊册,他們只是感情好肤京,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著茅特,像睡著了一般忘分。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上白修,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天妒峦,我揣著相機(jī)與錄音,去河邊找鬼兵睛。 笑死肯骇,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的祖很。 我是一名探鬼主播笛丙,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼假颇!你這毒婦竟也來了胚鸯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤拆融,失蹤者是張志新(化名)和其女友劉穎蠢琳,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體镜豹,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡傲须,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了趟脂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泰讽。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出已卸,到底是詐尸還是另有隱情佛玄,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布累澡,位于F島的核電站梦抢,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏愧哟。R本人自食惡果不足惜奥吩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蕊梧。 院中可真熱鬧霞赫,春花似錦、人聲如沸肥矢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽甘改。三九已至旅东,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間楼誓,已是汗流浹背玉锌。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留疟羹,地道東北人主守。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像榄融,于是被迫代替她去往敵國(guó)和親参淫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容