原文地址: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)行初始化配置。-Wall
和foreign
是Automake
的選項,它們并不是分開的兩個參數(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)生成一些文件,主要包括項目根目錄下的NEWS
、AUTHOR
、README
和ChangeLog
,可以用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)有了一些由Autoconf
和Automake
內(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
程序會幫我們完成這項工作,它會運行包括 Autoconf
、Automake
在內(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.in
、aclocal.m4
、configure
以及一個 autom4te.cache
都會在執(zhí)行命令時被創(chuàng)建。
關(guān)于引導(dǎo)
其實,如果有人想從這里開始自行編譯你的程序,他/她已經(jīng)用不到
Autoconf
或者Automake
了 ——shell
和Make
足矣。一個可供分發(fā)的源碼包通常都配備了編譯過程所需的各種文件,你不需要再被Autotools
搞得痛不欲生。但如果項目源代碼是從倉庫中獲取的,它就有可能還未被引導(dǎo),這是因為維護(hù)者通常假定我們這些屌炸天的開發(fā)者們?yōu)榱藨?yīng)對五花八門的開發(fā)環(huán)境已經(jīng)在自己的電腦上安裝了眾多的編譯工具。如果你下載的源代碼符合這種情況,可以嘗試用autoreconf -i
自行引導(dǎo)。有時候項目會提供一個名為autogen.sh
或bootstrap
的文件幫助我們完成這項工作 —— 尤其是引導(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)行編譯,因為他們需要的是 configure
和 Makefile
文件,這些已經(jīng)預(yù)先打包了。
我們還可以做些別的事情,比如清理項目的目錄。如果想查閱全部 make target
指令的話,可以去看看 Make manual
。
文章許可協(xié)議:Attribution-NonCommercial-ShareAlike 3.0 Unported