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

- Autoconf 流程
對于這一流程,我的方法是照葫蘆畫瓢,參考OGRE等項目的相關文件和工具的GNU文檔。
寫個Hello, Kitty。
操作的流程和期間出現的幾個問題總結一下:
o cd project_dir:轉到項目目錄;
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])
# 這個是自動生成的,因為代碼中沒有相關初始化信息,這里手動修改一下,非必要
AC_INIT([CgFox], [0.0.1], [http://www.yulefox.com])
# 這個是必須的,否則無法生成aclocal.m4
AM_INIT_AUTOMAKE([CgFox], 0.0.1)
AC_CONFIG_SRCDIR([Hello.cpp])
o aclocal:生成aclocal.m4(太長了,還沒去仔細了解)和autom4te.cache;
o autoconf:生成configure(也很長,先不看);
o automake --add-missing。
……
本來想等明天(今天)弄完了再詳細整理一下。不過我沒有打算把這個東西搞成一篇教程。記下來更多的只是為了給自己留下一個lable,知道自己這幾天在做什么。
最近又是兩點左右睡。腦子里有個家伙告訴我這樣不好;另一個家伙告訴我他還不困;還一個家伙告訴我明天還要上班。
我去你大爺的!