GNU Autotools 使用小结

前段时间试着用了用Autotools,当时觉得不错想写一篇小的记录的,结果忙呀忙呀就拖到现在了……暑假里想重新写一篇,结果居然已经通通忘光了……是故现在决定速度动工,谨防以后自己又忘了……
本文也是一篇较好的Autotools教学文,市面上的版本不是太片面就是长到难以静心看下去……这篇会包括头文件的处理,简单的库文件检测,制作静态库等,对于一般的DIYer应该够用了吧~
又及:我假定您是一个基础的*nix用户,对gcc的CLI使用较纯熟,或者退而求其次……至少要懂得Wiki,Google或者RTFM……

感谢
http://www.gnu.org/software/automake/manual/html_node/index.html
http://www.gnu.org/software/autoconf/manual/html_node/index.html
http://www.freesoftwaremagazine.com/books/autotools_a_guide_to_autoconf_automake_libtool
在我困惑的时候提供解答,并遵守GFDL1.3 || cc-by-sa2.0,少量撷取了图片资源。
本文遵循 GFDL1.3 && cc-by-sa3.0 发布。

首先上三幅流程图:



看不太懂没关系,这些只是要你对autotools的运作流程有个大概的印象。前面提到的诸多User-provided data files中,只有configure.ac和Makefile.am是要自己手工写成的。后者包含了tarball的编译顺序,前者包含预检测./configure的检查要求。(本文中,前者将利用autoscan的自动补全功能改写而成)

简单的说,GNU Autotools的使用步骤
生成时:
1.在各个目录中写出Makefile.am
2.利用autoscan获得configure.scan作为模板
3.改写configure.scan,重命名为configure.ac
4.依次运行aclocale,autoheader,autoconf,获得configure脚本
5.运行automake (automake -a)获得Makefile.in文件
测试时:
6.尝试./configure,检查输出的返回值有否和预期相悖之处,若有,查看config.in文件,跳回第3步
7.尝试make,检查error和warning,检查输出的返回值有否和预期相悖之处,若有,跳回第1步
8.尝试make distcheck,检查是否有文件找不到的报错,若有,则为Makefile.am错误,跳回第1步
9.运行一次autoreconf,touch所有配置文件时间,记录到Changelog中
10.再次make distcheck,确保无误
11.复制至其他计算机(不同发行版最佳),尝试编译一次,检查兼容性和configure依赖脚本工作良好
12.发布

以下是一个例子和具体的操作过程。
$ENV = 2.6.32 x86_64 GNU/Linux, make 3.81, autoconf 2.65, automake 1.11.1, m4 1.4.13, perl 5.10.1


lunarshaddow@lunarshaddow-laptop:~/test$ ls -R
.:
include  lib  Makefile.am  src

./include:
foo.h  Makefile.am

./lib:
Makefile.am  test.cpp  test.h

./src:
foo.cpp  main.cpp  Makefile.am

tarball可以在我的网盘下载,如果想自己一步一步体验的可以删掉除了源文件外的其他一切文件自己尝试,不过强烈推荐看一下源码的内容(总共只有不到50行),明白其中用到的各个功能
http://www.uushare.com/user/aflyhorse/file/3349455


切入正题。
首先,具体讲每个Makefile.am的写法(这个只能纯手工……)。

./Makefile.am

AUTOMAKE_OPTIONS = foreign -Wall -Werror
SUBDIRS = lib include src

首行表示编译选项。foreign指本发布包不是按照GNU规范的(否则automake将不胜其烦的要求AUTHOR,README,CHANGELOG等文件);-Wall和-Werror都是为gcc准备的,表示严格显示编译错误
SUBDIRS当然表示的是子文件夹,将按顺序编译,所以请先放库文件,最后放可执行文件

./lib/Makefile.am

noinst_LIBRARIES = libtest.a
libtest_a_SOURCES = test.cpp test.h

noinst_前缀表示不安装的(一般只有开发软件才会安装静态库),如果是要安装的,则用lib_前缀。动态库用_LTLIBRARIES表示,不过我还不会用libtool呢……
之后就是列举库的所需编译文件了

./include/Makefile.am

noinst_HEADERS = foo.h

这里表示不安装的头文件。在automake中,如果没有在Makefile.am中列举出来的文件在dist的时候是不会包含在tarball里的(额外的不相关文档用EXTRA_标记)。通常头文件应该被列举到对应的binary的$(binary)_SOURCES里去,但是这个特殊的仅有头文件的文件夹只能以这个形式编写Makefile
需要安装的头文件用include_前缀标示

./src/Makefile.am

bin_PROGRAMS = hello
hello_SOURCES = main.cpp foo.cpp ../include/foo.h ../lib/test.h
hello_LDADD = $(top_builddir)/lib/libtest.a -lm
hello_CPPFLAGS = -I$(top_srcdir)

bin_PROGRAMS表示我们应该生成的binary有以下几个(偷懒,只写了一个),$(binary)_SOURCES则列举需要的文件(和gcc命令行单个编译方式一样要包括头文件),$(binary)_LDADD说明额外的库
我们用到了cmath,是故要加上-lm命令,额外的再加上我们编译出的临时库文件
$(top_srcdir)和$(top_builddir)都是自解释的,额外指令可以放到$(binary)_CPPFLAGS里,比如对源文件顶层目录的包含


OK,Makefile写完,接下来
lunarshaddow@lunarshaddow-laptop:~/test$ autoscan
lunarshaddow@lunarshaddow-laptop:~/test$ vi configure.scan
lunarshaddow@lunarshaddow-laptop:~/test$ mv configure.scan configure.in
lunarshaddow@lunarshaddow-laptop:~/test$ cat configure.in

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.65])
AC_INIT([hello], [1.0.0], [http://hi.baidu.com/aflyhorse1990/])
AC_CONFIG_SRCDIR([lib/test.h])
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE

# Checks for programs.
AC_PROG_CXX
AC_PROG_CC
AC_PROG_RANLIB

# Checks for libraries.
# FIXME: Replace `main' with a function in `-lm':
AC_CHECK_LIB([m], [sqrt])

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.
AC_CHECK_FUNCS([sqrt])

AC_CONFIG_FILES([Makefile
include/Makefile
lib/Makefile
AC_OUTPUT

其中你要修改的就是AC_INIT中的安装包名和版本号,然后在此段最后加一句AM_INIT_AUTOMAKE来提供automake接口;之后是在第二段添加AC_PROG_RANLIB以提供静态库ar的检查机制。FIXME中,由于我用了libm.a(数学库)中的sqrt函数,需要把AC_CHECK_LIB后面的main换成sqrt。

lunarshaddow@lunarshaddow-laptop:~/test$ aclocal
lunarshaddow@lunarshaddow-laptop:~/test$ autoheader
lunarshaddow@lunarshaddow-laptop:~/test$ autoconf
lunarshaddow@lunarshaddow-laptop:~/test$ automake

此时,目录文件结构将如下所示:
lunarshaddow@lunarshaddow-laptop:~/test$ ls -R
.:
aclocal.m4      config.h.in   depcomp     lib          missing
autom4te.cache  configure     include     Makefile.am  src
autoscan.log    configure.ac  install-sh  Makefile.in

./autom4te.cache:
output.0  output.1  requests  traces.0  traces.1

./include:
foo.h  Makefile.am  Makefile.in

./lib:
Makefile.am  Makefile.in  test.cpp  test.h

./src:
foo.cpp  main.cpp  Makefile.am  Makefile.in

之后就可以./configure后make distcheck打包了,看了这么一长串的输出,是不是很有成就感呀~啊!唔……大牛请绕道或轻拍……伦家@$&(*#^Q*(#&q$&@#q#&(*#)_$w*(e#……

这是最后的tarball结构:
lunarshaddow@lunarshaddow-laptop:~/test/hello-1.0.0$ ls -R
.:
aclocal.m4   configure     depcomp  install-sh  Makefile.am  missing
config.h.in  configure.ac  include  lib         Makefile.in  src

./include:
foo.h  Makefile.am  Makefile.in

./lib:
Makefile.am  Makefile.in  test.cpp  test.h

./src:
foo.cpp  main.cpp  Makefile.am  Makefile.in
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值