[譯文] 如何開始一個真正的 GTK 項目(第二部分:配置 Autoconf)

原文地址:Advanced GTK Techniques


在這個教程中,你將學(xué)習(xí)如何創(chuàng)建一個空的 Autotools 編譯系統(tǒng)。這是《如何開始一個真正的 GTK 項目》的第一章節(jié)。


首先,我們創(chuàng)建一個名為 app-skeleton1 的目錄。在這個目錄中再創(chuàng)建名為 Makefile.am 的空文件(可以在終端中使用 touch Makefile.am 命令),這是一個 Automake 文件,我們將在稍后在這里輸入如何將代碼轉(zhuǎn)換成程序的指令。現(xiàn)在,我們需要使用 Autoconf 配置我們的項目。

在當(dāng)前用目錄下新建一個 configure.ac 文件,它是 Autoconf 的配置文件,定義了在編譯工程時需要使用哪些工具。我們也需要在這里定義系統(tǒng)環(huán)境需求,這樣 Autotools 可以檢測系統(tǒng)是否滿足要求。在 configure.ac 中,我們輸入:

AC_INIT([App Skeleton], [1], [philip.chimento@gmail.com])
AM_INIT_AUTOMAKE([-Wall foreign])
AC_CONFIG_FILES([Makefile])
AC_OUTPUT

這個文件中包含了可以被 Autoconf 擴展成腳本的各種宏。以 AC_ 開頭的是 Autoconf 自己的宏,以 AM_ 開頭的則屬于 Automake。宏的參數(shù)列表被包含在一對圓括號中,每個參數(shù)還被包含在一對方括號內(nèi)。方括號在這里表示“引用”,在 Autoconf 的手冊中有關(guān)于它的詳盡介紹,我們只需要記住一點:每個參數(shù)都要用方括號括起來。接下來我們一個一個介紹這些宏。

  • AC_INIT

    這是 Autoconf 的初始化宏,定義工程的名稱和版本號。第三個參數(shù)為可選參數(shù),是反饋 bug 的郵箱地址,你可以把它換成你自己的郵箱,不過這個示例程序的 bug 還是發(fā)到我的郵箱比較好。

  • AM_INIT_AUTOMAKE

    這個宏告訴 Autoconf 我們將使用 Automake 工具(是的,我們是可以只用部分 Autotools 工具的)。這個宏也負(fù)責(zé)對 Automake 進(jìn)行初始化配置。-WallforeignAutomake 的選項,它們并不是分開的兩個參數(shù),所有的選項應(yīng)當(dāng)用空格分隔,然后包含到一個方括號中。

    -Wall 表示 Automake 工具將要求編譯器輸出編譯過程中遇到的所有警告,這與很多 C 編譯器的 -Wall 參數(shù)相似。foreign 表示 Automake 不遵循 GNU 標(biāo)準(zhǔn)構(gòu)建工程,所以它會忽略諸如缺少 README 文件之類的問題。如果你要構(gòu)建一個正式的應(yīng)用,以可能需要移除這個選項,然后添加一些便于用戶了解應(yīng)用的文件。

    譯者注:移除 foreign 表示我們須按照 GNU 標(biāo)準(zhǔn)生成一些文件,主要包括項目根目錄下的 NEWSAUTHORREADMEChangeLog,可以用 touch NEWS AUTHOR README ChangeLog 命令來完成。

  • AC_CONFIG_FILES

    在這個宏中我們列出執(zhí)行配置工程(configure)操作后需要輸出的文件。假如我們在列表中添加了名為 plerp 的文件,那么 Autoconf 就會去查找名為 plerp.in 的文件,然后將它轉(zhuǎn)換成 plerp。這項工作實質(zhì)上是將 plerp.in 中所有 @VARIABLE@ 位置替換成變量 VARIABLE 的內(nèi)容。到目前為止,我們還未親自設(shè)定任何變量,不過已經(jīng)有了一些由 AutoconfAutomake 內(nèi)部定義的變量。

    我們在這個宏中告訴 Autoconf 需要將 Makefile.in 轉(zhuǎn)換成 Makefile,那么 Makefile.in 又在哪里呢?答案是當(dāng)我們運行 Automake 時,它將把 Automake.am 轉(zhuǎn)換成 Automake.in。我們將在下一步完成這個工作。

  • AC_OUTPUT

    這個宏用于使 Autoconf 生成上述所有文件。

我們現(xiàn)在需要“引導(dǎo)(bootstrap)”程序(即將項目從混沌狀態(tài)初始化至編譯系統(tǒng)可工作的狀態(tài))。Autoreconf 程序會幫我們完成這項工作,它會運行包括 AutoconfAutomake 在內(nèi)的諸多程序,為項目配置好編譯環(huán)境。在終端中輸入:

autoreconf -i
configure.ac:2: installing `./install.sh'
configure.ac:2: installing `./missing'

終端中會打印出被創(chuàng)建的文件的信息(這項安裝工作是由 -i 選項完成的,如果這些文件已經(jīng)被創(chuàng)建,那么我們只需輸入 autoreconf 即可)。不過,當(dāng)我們?yōu)g覽目錄時會發(fā)現(xiàn),新增的文件不僅僅是終端提到的幾個,Makefile.inaclocal.m4configure 以及一個 autom4te.cache 都會在執(zhí)行命令時被創(chuàng)建。

關(guān)于引導(dǎo)

其實,如果有人想從這里開始自行編譯你的程序,他/她已經(jīng)用不到 Autoconf 或者 Automake 了 —— shellMake 足矣。一個可供分發(fā)的源碼包通常都配備了編譯過程所需的各種文件,你不需要再被 Autotools 搞得痛不欲生。但如果項目源代碼是從倉庫中獲取的,它就有可能還未被引導(dǎo),這是因為維護(hù)者通常假定我們這些屌炸天的開發(fā)者們?yōu)榱藨?yīng)對五花八門的開發(fā)環(huán)境已經(jīng)在自己的電腦上安裝了眾多的編譯工具。如果你下載的源代碼符合這種情況,可以嘗試用 autoreconf -i 自行引導(dǎo)。有時候項目會提供一個名為 autogen.shbootstrap 的文件幫助我們完成這項工作 —— 尤其是引導(dǎo)過程中需要完成一些額外工作時。如果存在這些文件,直接運行它就好了。

現(xiàn)在編譯系統(tǒng)已經(jīng)初始化完畢,我們可以開始常規(guī)的編譯過程:

./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
configure: creating ./config.status
config.status: creating Makefile
make
make: Nothing to be done for `all'.

當(dāng)然 make 目前無事可做。我們沒有代碼文件,Makefile.am 也是空的。不過,如果你查看生成的 Makefile 文件,它卻并非一無所有:我的系統(tǒng)報告它有 14 KB。雖然我們的項目還未正式開始,我們已經(jīng)有了一個靈活的編譯系統(tǒng)。

為了展示系統(tǒng)的靈活性,我們輸入 make dist,當(dāng)前目錄就會出現(xiàn)一個名為 app-skeleton-1.tar.gz 的文件。這是個源代碼的 tarball 歸檔文件,可用于分發(fā)。即使用戶的設(shè)備中沒有 Autotools 也可以下載這個包進(jìn)行編譯,因為他們需要的是 configureMakefile 文件,這些已經(jīng)預(yù)先打包了。

我們還可以做些別的事情,比如清理項目的目錄。如果想查閱全部 make target 指令的話,可以去看看 Make manual


文章許可協(xié)議:Attribution-NonCommercial-ShareAlike 3.0 Unported

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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