autotool总结

申明 :阅读autotool手册同时根据自己认识进行总结,文章内容以手册为主,结合部分其他资料以及自己的总结。



第一章 总体概览

1.1概述

        Autoconf是一个通过产生配置脚本来使源码包能够适配不同类unix系统的工具。

        Automake 是为了改善autoconf管理工程时,因为目录过多,依赖链管理过于复杂的问题。使代码管理更加简化。

       Libtool 是为了解决库的问题,不同系统对库的使用上差别很大,使用libtool生成的库文件能适配不同平台。


1.2 结构分析


        对使用autoconf生成配置脚本的流程进行说明下面被加载的程序以 *标注,配置文件使用[]标注。



1.3构成部件


autoconf

是一个产生可以自动配置源代码包,生成shell脚本的工具,以适应各种类UNIX系统的需要。autoconf 产生的配置脚本在运行时独立于autoconf ,因此使用这些脚本的用户不需要安装autoconf


autoheader

能够产生供configure脚本使用的C #define语句模板文件。


autom4te

对文件执行 GNU M4。其本质是一个缓冲管理,为autotool提供快速查找所需结构的接口


autoreconf

如果有多个autoconf产生的配置文件,autoreconf可以保存一些工作,它通过重复运行autoconf(以及在合适的地方运行autoheader)以重新产生autoconf配置脚本和配置头模板,这些文件保存在以当前目录为根的目录树中。


autoscan

程序可以用来为软件包创建configure.ac文件。autoscan在以命令行参数中指定的目录为根(如果未给定参数,则以当前目录为根)的目录树中检查源文件。它为通常的轻便问题搜索源文件,并且为那个包创建一个configure.scan文件,这个文件就是configure.ac的前身。


autoupdate

程序将一个调用autoconf 宏的旧名称的configure.ac, Makefile.in 文件中的宏更新为新的名称。


Ifnames

当为一个软件包写configure.ac 时,ifnames可以提供一些帮助。它打印包中那些在C预处理器中已经使用了的表示符。如果一个包已经设置成具有某些可移植属性,这个程序能够帮助指出它的配置应该如何检查。它可以用来填补由autoscan产生的configure.ac中的隔阂。


Automake

 使用Makefile.am生成Makefile.in,通过支持更高级的配置文件来简化原来的autoconf


Aclocal

原本autoconf并未考虑到后续支持像automake这样的扩展,因此使用


Aclocal

使autoconf支持automake对其的扩展


Libtoolize 

为工程使用libtool做准备


The Libtool C API—ltdl 

在不同平台上提供一个一直运行的共享对象管理,是为libtool功能能够正常运行提供支持


第二章 Autoconf


2.1 configure.ac


2.1.1简述

   编写Configure.ac 时可以利用autoscan扫描工程目录生成的模板进行改写。Configure.ac 是使用autotool的重要文件。此外可以使用ifname配合autoscan编写configure.ac.


2.2.2 configure.ac的内容


AC_INIT (package, version, [bug-report], [tarname], [url])

主要配置包的名字,版本号,bug提交地址,tarname, 以及一个网页链接。

 

AC_PREREQ (version)

用来设置支持该包需要的autotool最低版本

 

AC_COPYRIGHT (copyright-notice)

添加FSF copyright


AC_REVISION

设置copyright版本


AC_CONFIG_SRCDIR (unique-file-in-source-dir)

检查一个文件是否存在来确定当前目录是否正确

 

AC_CONFIG_AUX_DIR (dir)

设置autotool工具的目录

 

AC_REQUIRE_AUX_FILE (file)

用于注册辅助文件,针对第三方工具

 

AC_CONFIG_MACRO_DIR (dir)

指明获取本地autoconf 宏的目录


AC_OUTPUT

创建configure.status并加载他。在configure.ac的末尾调用它


AC_PROG_MAKE_SET

MAKE赋值,预定义的MAKE是空值。


AC_CONFIG_FILES

可以用来替代AC_OUTPUT,使用可参考下面的官方实例


Typical calls to AC_CONFIG_FILES look like this:

AC_CONFIG_FILES([Makefile src/Makefile man/Makefile X/Imakefile])

AC_CONFIG_FILES([autoconf], [chmod +x autoconf])

You can override an input file name by appending to file a colon-separated list of input files. Examples:

          AC_CONFIG_FILES([Makefile:boiler/top.mk:boiler/bot.mk]

                          [lib/Makefile:boiler/lib.mk])

 

   此外为了表现AC_CONFIG_FILES和AC_OUTPUT可以对照下面的例子


AC_OUTPUT([Makefile])

等价于

AC_CONFIG_FILES([Makefile])

AC_OUTPUT


2.2.configure的执行


2.2.1概述


     Configure对用户表现为更像一个执行者,实际上Configure是收集当前的信息,然后交给configure.status来处理。 使用autoconf后的工程编译与传统的Makefile不同点如下:

1.使用autoconf
./configure --prefix=/tmp (设置安装目录)
make
make install 

2.使用传统Makefile
     make
     make install 
      总体而言使用autoconf后工程编译前多了configure的步骤,结合1.2可以看出configure步骤主要是使用Makefile.in 和 config.h.in 生成Makefile和config.h, 这个过程后与传统Makefile一样。

autoconf在传统编译流程上加入了配置流程(./configure)时Makefile和config.h动态生成,这样能根据不同环境
和不同的用户输入来影响后面的编译。 下面就针对configure步骤详细分析

2.2.2 Makefile.in

   首先对Makefile.in进行分析,如下所示为Makefile.in示例, 可见和传统Mafile基本没有区别,唯一的区别在于多了对@val@的使用, @val@中间的val是来自configure的变量,Makfile.in 中可以使用这些由configure传下来的数据动态生成Makefile.这些变量是autoconf约定好的,下面就对这些变量就行说明。


     
2.2.2.1基本目录变量

srcdir

源文件顶层目录,这是能在configure加载时通过--srcdir参数设置的,默认工作目录为顶层构建目录。

 

ac_top_srcdir

源文件顶层目录, 默认工作目录为当前构建目录

 

ac_top_build_prefix

构建顶层目录,  默认工作目录为当前构建目录

 

ac_srcdir

当前源文件目录,  默认工作目录为当前构建目录

 

tmp

临时文件存放处


上面的信息区分可以对照下面取自官网的示例进行理解:



2.2.2.1预输出变量

CFLAGS

指定头文件(.h文件)的路径,如:CFLAGS=-I/usr/include -I/path/include。同样地,安装一个包时会在安装路径下建立一个include目录,当安装过程中出现问题时,试着把以前安装的包的include目录加入到该变量中来。默认被 AC_PROG_CC设置


CXXFLAGS

与CFLAG作用类似,针对C++


LDFLAGS

gcc 等编译器会用到的一些优化参数,也可以在里面指定库文件的位置。用法:LDFLAGS=-L/usr/lib -L/path/to/your/lib。每安装一个包都几乎一定的会在安装目录里建立一个lib目录。如果明明安装了某个包,而安装另一个包时,它愣是说找不到,可以抒那个包的lib路径加入的LDFALGS中试一下。


LIBS

告诉链接器要链接哪些库文件,如LIBS = -lpthread -liconv


DEFS

C编译器中-D选项传递的数据 . 如果 AC_CONFIG_HEADERS 被设置, configure 将把‘@DEFS@’ 替换为 -DHAVE_CONFIG_H 

等价于 .


abs_builddir
builder的绝对路径


top_builddir
当前代码树顶层的相对路径


abs_top_builddir
当前代码树顶层的绝对路径


srcdir
Makfile对应的源码的路径


abs_srcdir
srcdir的绝对路径


top_srcdir
源码顶层的绝对路径


abs_top_srcdir
源码顶层的相对路径


2.2.2.1 安装路径变量
bindir 
可执行文件安装路径


datadir
只读数据保存路径


datarootdir
只读数据保存的根文件夹


docdir
文档保存路径


divdir
DIV 格式文档保存路径


exec_prefix
构架依赖文件保存路径,默认和prefix相同。


htmldir
hcml文档保存路径


includedir
C头文件保存路径


infodir
info格式文档保存路径


libdir
库文件安装路径


libexecdir
其他程序运行时加载的可执行程序路径


localedir
locale-dependent but architecture-independent 数据的路径


localstatedir
可更改的本机数据保存路径


mandir

man手册安装路径


oldincludedir
非C头文件保存路径


pdfdir
PDF文档保存路径


prefix
所有文件的安装目录,如果exec_prefix被定义,则仅为构架无关文件的保存路径 


psdir
PostScript文档的保存路径


sbindir
管理员使用的可执行文件安装路径


sharedstatedir
可更改,用于共享的构架无关数据安装路径


sysconfdir
只读本机数据安装路径


2.3 autoconf的使用技巧

2.3.1 自动重构


The stamp- files are necessary because the timestamps of config.h.in and config.h are not changed if remaking them does not change their contents
 $(srcdir)/configure: configure.ac aclocal.m4
             cd '$(srcdir)' && autoconf
     
     # autoheader might not change config.h.in, so touch a stamp file.
     $(srcdir)/config.h.in: stamp-h.in
     $(srcdir)/stamp-h.in: configure.ac aclocal.m4
             cd '$(srcdir)' && autoheader
             echo timestamp > '$(srcdir)/stamp-h.in'
     
     config.h: stamp-h
     stamp-h: config.h.in config.status
             ./config.status
     
     Makefile: Makefile.in config.status
             ./config.status
     
     config.status: configure
             ./config.status --recheck


学习编写中。。。。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值