分类: C/C++
2011-11-22 08:02:20
利用autoconf和automake等工具自动生成Makefile文件,基本步骤如下:
准备工程目录结构和程序
-执行autoscan 生成 configure.scan
- 编辑修改 configure.scan,重命名为 configure.ac 或 configure.in
- 依次执行aclocal; libtoolize; autoheader; autoconf 生成 'configure' 可执行文件
- 编写 Makefile.am
- 执行automake 生成 Makefile
- 完成。后面就可以 ./configure; make; make install; make dist; ...
下面首先以一个简单的例子来说明执行步骤(这里选helloworld程序)
进行之前,先安装相关程序,如果你是ubuntu系统,那么安装过程非常简单,只需执行几个命令就行
>sudo apt-get install autoconf
>sudo apt-get install automake
>sudo apt-get install libtool (添加动态库需要用到)
新建一个目录:helloworld,进入该目录,新建helloworld.c文件,并添加如下内容:
#include
int main(int argc, char** argv)
{
printf("Hello, Linux World!n");
return 0;
}
然后执行autoscan命令
>autoscan
然后将生成的configure.scan文件改名为configure.in,并且编辑它,按下面的内容修改,去掉无关的语句:
AC_PREREQ([2.61])->AC_PREREQ(2.61) //这个是标示版本,可以不修改,不影响
AC_INIT(...)->AC_INIT(hello, 1.0.0, gztt.ll@gmail.com) //定义生成可执行程序的名称,版本号以及bug提交地址
//如果需要调用静态库则添加AC_PROG_RANLIB,本例不需添加
//如果需要调用动态库则添加AC_PROG_LIBTOOL,本例不需添加
添加AM_INIT_AUTOMAKE(helloworld, 1.0) //原文件没有,需自行添加
AC_OUTPUT->AC_OUTPUT(Makefile) //定义在程序目录生成Makefile,如果需要生成多个Makefile也在此添加
修改保存后,执行aclocal,autoheader,autoconf命令
>aclocal
>autoheader
>autoconf
执行完后,在程序根目录下$(top_srcdir)新建Makefile.am,并编辑内容为:
AUTOMAKE_OPTIONS=foreign //如果不加这句,则需要增加NEWS,ChangeLog,AUTHORS,README文件
bin_PROGRAMS=helloworld //定义可执行程序,静态库用noinst_LIBRARIES,动态库用noinst_LTLIBRARIES
helloworld_SOURCES=helloworld.c //多个文件在后面添加
保存推出,执行automake命令,automake会根据你写的Makefile.am来自动生成Makefile.in。 Makefile.am中定义的宏和目标,会指导automake生成指定的代码。例如,宏bin_PROGRAMS将导致编译和连接的目标被生成。
>automake -a //或者>automake --add-missing
完成生成Makefile,可以执行下列命令来测试
>make 根据Makefile编译源代码,连接,生成目标文件,可执行文件。
>make clean 清除上次的make命令所产生的object文件(后缀为“.o”的文件)及可执行文件。
>make install 将编译成功的可执行文件安装到系统目录中,一般为/usr/local/bin目录。
>make dist 产生发布软件包文件(即distribution package)。这个命令将会将可执行文件及相关文件打包成一个tar.gz压缩的文件用来作为发布软件的软件包。它会在当前目录下生成一个名字类似 “PACKAGE-VERSION.tar.gz”的文件。PACKAGE和VERSION,是我们在configure.in中定义的 AM_INIT_AUTOMAKE(PACKAGE, VERSION)。
>make distcheck 生成发布软件包并对其进行测试检查,以确定发布包的正确性。这个操作将自动把压缩包文件解开,然后执行configure命令,并且执行make,来确认编译不出现错误,最后提示你软件包已经准备好,可以发布了。
make distclean
类似make clean,但同时也将configure生成的文件全部删除掉,包括Makefile。
通过上面的介绍,你应该可以很容易地生成一个你自己的符合GNU惯例的Makefile文件及对应的项目文件。如果你想写出更复杂的且符合惯例的 Makefile,你可以参考一些开放代码的项目中的configure.in和Makefile.am文件。