完颜宗贤干韦太后:用configure建立工具的学习

来源:百度文库 编辑:中财网 时间:2024/05/07 02:42:54
介绍:
就是使autoconf,automake,libtool,make很好的配合工作
目标:简化可移植程序的开发,简化以源代码形式分发的程序的建立
所需要的工具:autoconf,automake,libtool,gettext,m4,perl
建立:最好在单独的叫做object directory 里面运行configure,make,make install,这样有三个好处,建立过程中生成的文件不会使源代码目录混乱,删除建立了的文件时只要把此目录直接删掉就ok,可以在不用目录下用不同的配置选项建立来比较
Configure脚本支持很多选项,比如—witch , --enable , --prefix –exec-prefix 用来确定安装目录,--prefix 是机器独立的文件的安放位置,比如info文件,--exec-prefix 一般是 –prefix 的子目录,放机器相关的文件,比如可执行文件,一般情况下—prefix 是/usr/local,而–exec-prefix跟—prefix相同
开始:
要写三个文件,在用合适的工具生成额外的文件
写 configure.in:
必须首先写这样文件,它是autoconf的输入文件
里面必须写一些对于不同系统不同的的一些测试,比如是否存在某个特别的头文件或函数
比如在源代码中要调用gettimeofday函数,不是所有的系统都支持,于是通过在此文件中放置`AC_CHECK_FUNCS(gettimeofday)‘,运行configure脚本时,如果gettimeofday函数存在就会定义宏`HAVE_GETTIMEOFDAY‘,相反,如果没有,就不会定义了,于是可以在源代码中利用`#ifdef‘来测试这个宏是否定义了,就可以知道了这个函数是否存在了
对于已经存在的代码,可以利用autoscan程序来标识那些移植问题和要做的测试,参看autoscan的文档http://www.delorie.com/gnu/docs/autoconf/autoconf_4.html
另一个工具是ifnames,对已存在代码显示代码已经在用的所有预处理条件,在http://www.delorie.com/gnu/docs/autoconf/autoconf_5.html
每个此文件要包含一下宏
`AC_INIT‘    需一个参数,为包中的文件名,如 `AC_INIT(foo.c)‘
`AC_PREREQ(VERSION)‘  可选,用于指示autoconf的版本
`AM_INIT_AUTOMAKE‘    两个参数,包的名字,版本号,如 `AC_INIT(foo.c)‘
`AM_CONFIG_HEADER‘ 标出包含预处理宏的头文件名,默认为config.h, 我们就可以在源代码中`#include "config.h"‘了,此项可以可选的指定它的输入文件,如config.h.in,如 AM_CONFIG_HEADER(config.h:config.in)
`AM_MAINTAINER_MODE‘  `AC_EXEEXT‘  在Cygnus configure脚本中出现
`AC_PROG_CC‘  如果你写C代码,普通情况下你要用这个宏了,它定位到要用的C编译器,没有参数,当configure.in文件是用来对一个库,并且是用交叉编译器编译时就不用这个了
`AC_PROG_CXX‘  编译C++程序时,跟以上一样
`AM_PROG_LIBTOOL‘  当编写能够通过libtool连接到的共享库时要用到,默认下,所有的库都被编译成共享库,要改变默认值,就得在`AM_PROG_LIBTOOL‘之前用`AM_DISABLE_SHARED‘。  Configure选项`--enable-shared‘ and `--disable-shared‘用来干此事
AC_DEFINE(_GNU_SOURCE)‘  GUN包在其他特性测试前要包含这个,编译时这会定义了宏`_GNU_SOURCE‘,而这个宏会引导libc的头文件提供标准的GNU系统接口包括GNU扩展
`AC_OUTPUT‘  定义输出文件的清单,如`AC_OUTPUT(Makefile lib/Makefile)‘.
AC开头的宏是autoconf用的,AM开头的是automake或libtool提供的
写Makefile.am:
它是automake的输入文件
本文件中的automake命令很象Makefile文件中的变量赋值,automake能够认出特殊变量名来,自动添加make规则到输出
包中可能为每个目录都有一个Makefile.in文件,对于有子目录的文件,它的本文件中就得有   SUBDIRS = dir dir ...dir就是子目录名
对每一个Makefile.in,在configure.in中的AC_OUTPUT宏中必须有相应的Makefile
在Cygnus中的每个Makefile.am必须有AUTOMAKE_OPTIONS = cygnus,这就使automake变成Cygus模式
当在某个目录下要构建一个程序,那么在这个目录中的Makefile.in中要有
bin_PROGRAMS = program和program_SOURCES = file file ...
构建一个非共享库,则是
lib_LIBRARIES = libname.a和libname_a_SOURCES = file file ...
构建共享库的则是
lib_LTLIBRARIES = libname.la和libname_la_SOURCES = file file ...
上面出现在行中的字符串bin和lib不是随意的,他们参考到特殊的目录,在configure选项中`--bindir‘ and `--libdir‘指定了的,如果这些没指定,就基于`--prefix‘ or `--exec-prefix‘选项了
Makefile.in可能包含会出现在Makefile中的任何东西,automake还可以支持一些特定变量,比如条件
写acconfig.h::
当是要生成一个可移植的头文件时,比如在configure.in中用了AM_CONFIG_HEADER‘宏,那么就要写acconfig.h文件了,它必须包含下列行
* Name of package.  */
#undef PACKAGE

/* Version of package.  */
#undef VERSION
这个文件的意思不是很能看懂