本文同步自游戲人生
Writen by Fox(yulefox.at.gmail.com)
從接觸和使用make以來,前前后后寫了不少M(fèi)akefile(添添減減、修修補(bǔ)補(bǔ),累計(jì)上千行是有的),今天在重新整理代碼的組織結(jié)構(gòu)之后,突然就想:我為什么不使用Autotools呢?
在開始體驗(yàn)功能強(qiáng)大的Autotools之前,簡單(詳細(xì))回憶總結(jié)一下我使用make的經(jīng)歷和思考的過程,反省一下看看自己在接觸這些新鮮事物的時(shí)候到底走了多少彎路。
o Cygwin
今年3月份,拜Kevin Lynx所賜,每次對(duì)Linu淺嘗輒止的我終于下決心接觸了Cygwin環(huán)境,并一發(fā)不可收拾。
剛開始的時(shí)候,就像大學(xué)剛接觸編程那樣,寫“hello,
world”,在終端用gcc命令直接編譯,然后開始寫最簡單的只有一個(gè)all的Makefile。因?yàn)镋macs、GCC、make對(duì)我來說都是嶄新的
工具,后面重心就不是放在寫代碼上了,而是急于掌握他們,以求達(dá)到在Windows下的開發(fā)效率。
去年11月底,當(dāng)時(shí)還沒有開始用Cygwin,就買了一本《Managing Projects with GNU Make》,此時(shí)也算物盡其用了。慢慢開始使用variables、macros、phony targets、functions,按步就班的系統(tǒng)學(xué)習(xí)應(yīng)用。
o Ubuntu
磨磨蹭蹭過了半年,其間因?yàn)槊χ厴I(yè),對(duì)Cygwin和Emacs、GCC、make也算比較熟悉了。
今年10月份,開始使用Ubuntu,剛開始在Windows下用wubi安裝,很快就直接用新的硬盤分區(qū)物理安裝,并隨著Ubuntu 9.10的發(fā)布,升級(jí)到了9.10。
這前后寫Makefile最大的區(qū)別就是,之前純粹是為了寫而寫,之后是為了用而寫。
隨著整個(gè)代碼結(jié)構(gòu)的不斷膨脹和修改,Makefile也不斷的變化。
Makefile自身的最大變化是從之前的因?yàn)榫帉戝e(cuò)誤、通用性差而不斷修改,演變到最后代碼增減不會(huì)影響Makefile,只是為了增加tags、優(yōu)化結(jié)構(gòu)而改動(dòng)。
經(jīng)歷了這個(gè)過程后,對(duì)于Makefile的結(jié)構(gòu)就比較熟悉了,而且可以從其他使用automake的項(xiàng)目的Makefile中學(xué)習(xí)借鑒了。
之所以想到使用autotools,是因?yàn)榻佑|的很多開源項(xiàng)目的代碼都使用了這一組工具。
對(duì)于用戶而言,一般的項(xiàng)目編譯安裝的過程:
o bootstrap:檢測(cè)autoconf、automake、libtool及其版本并完成初始化,生成configure;
o configure:檢測(cè)系統(tǒng)平臺(tái)及軟硬件環(huán)境,確定適用本地環(huán)境的編譯策略,生成Makefiles;
o make:編譯、鏈接;
o make install:安裝;
o ldconfig:配置環(huán)境變量。
對(duì)于開發(fā)者而言,則需要通過autoconf、automake為用戶組織起上面的過程:

- Autoconf 流程
對(duì)于這一流程,我的方法是照葫蘆畫瓢,參考OGRE等項(xiàng)目的相關(guān)文件和工具的GNU文檔。
寫個(gè)Hello, Kitty。
操作的流程和期間出現(xiàn)的幾個(gè)問題總結(jié)一下:
o cd project_dir:轉(zhuǎn)到項(xiàng)目目錄;
o emacs Hello.cpp
#include <iostream>
int main(int argc, char** argv)
{
std::cout << "Hello, Kitty!" << std::endl;
return 0;
}
o autoscan:生成configure.scan
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.64])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AC_CONFIG_SRCDIR([Hello.cpp])
AC_CONFIG_HEADERS([config.h])
# Checks for programs.
AC_PROG_CXX
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.
AC_OUTPUT
o mv configure.scan configure.in:改名;
O emacs configure.in:編輯configure.in
AC_PREREQ([2.64])
# 這個(gè)是自動(dòng)生成的,因?yàn)榇a中沒有相關(guān)初始化信息,這里手動(dòng)修改一下,非必要
AC_INIT([CgFox], [0.0.1], [http://www.yulefox.com])
# 這個(gè)是必須的,否則無法生成aclocal.m4
AM_INIT_AUTOMAKE([CgFox], 0.0.1)
AC_CONFIG_SRCDIR([Hello.cpp])
o aclocal:生成aclocal.m4(太長了,還沒去仔細(xì)了解)和autom4te.cache;
o autoconf:生成configure(也很長,先不看);
o automake --add-missing。
……
本來想等明天(今天)弄完了再詳細(xì)整理一下。不過我沒有打算把這個(gè)東西搞成一篇教程。記下來更多的只是為了給自己留下一個(gè)lable,知道自己這幾天在做什么。
最近又是兩點(diǎn)左右睡。腦子里有個(gè)家伙告訴我這樣不好;另一個(gè)家伙告訴我他還不困;還一個(gè)家伙告訴我明天還要上班。
我去你大爺?shù)模?/p>