本文同步自游戏人生
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,知道自己这几天在做什么。
最近又是两点左右睡。脑子里有个家伙告诉我这样不好;另一个家伙告诉我他还不困;还一个家伙告诉我明天还要上班。
我去你大爷的!