【ACCESS精品源码栏目提醒】:网学会员为广大网友收集整理了,【精品】Automake与Autoconf简介 - 人力资源,希望对大家有所帮助!
CVS Automake与Autoconf简介第一部分 CVS简介 cvs Concurrent Version System 是一个版本控制系统什么是版本控制系统呢简单的说它可以记录程序代码修改的过程有一个完整的历史记录 history 。
辟如说当你在修改程序代码的时候 不小心写出了一个 bug但是你可能很久以后才发现多出了这个 bug 这个时候cvs 就能很有效的帮助你找出到底是在哪一次的修改中出现了这个 bug。
也许你会说 那我每次都把程序保存起来 用tar 做好备份不就行了当然 你可以这样做 但是这太浪费空间了 cvs 在版本更改间 只储存不同的部分 这样就可以省下很多空间。
在另一个场合里 更能显示出 cvs 的好处 比如多人一起开发软件的时候。
cvs支持远程访问 用户可以对他要修改的文件加上正在编辑的标志 让别人知道他要修改这个文件了。
当然 一个较大的开发队伍一般还会需要一个 mailing list 用来沟通。
毕竟cvs 只是一个管理程序代码的工具 他并不扮演沟通的角色。
cvs的同类软件还有rcs和sccs。
RCS Revision Control System 可以从FSF获得。
SCCS Source Code Control System 由ATampT在SystemV中引入现在已经被加入X/Open标准 Unix 98 。
比起这些软件CVS的要优秀得多特别是在支持多人远程开发方面。
由于CVS出现较新所以使用上反而没有它们普及。
当然如果您熟悉rcs您会发现
学习cvs非常容易。
名词 repository 意为仓库。
在 cvs 里 它就是你真正存放各历史版本的地方。
pserver cvs 远程服务器cvs 有两种工作模式 一种是 local 一种是 remote。
一般通过inetd启动pserver。
CVSROOT 当使用 cvs 的时候 要设定 CVSROOT这个环境变量 或是用 -d 选项来指定该参数该参数指明你的仓库放在哪里。
本地 local cvs 首先 确定一个 cvsroot比如 export CVSROOTquot/home/joe/cvsroot/quot 建立该目录 mkdir /home/joe/cvsroot 接着运行cvs init cvs init cvs init 会帮你把 cvsroot 初始化。
接着 建立一个要放文件的目录 相当于一个Project mkdir /home/joe/cvsroot/cvsdoc cd /home/joe/work cvs checkout cvsdoc 或者简写为 cvs co cvsdoc 你会看到下面的信息 cvs checkout: Updating cvsdoc cvs checkout 会把当前最新的版本拷贝到你的当前目录下。
记住 不要自己建立 /home/joe/work/cvsdoc 该目录下还会有一些用于管理的 cvs 相关的信息。
接着 进入 cvsdoc 目录 编辑 cvs.doc 这个文件档案输入一些信息。
然后运行 cvs add cvs.txt cvs commit -m quotInitial revision.quot cvs add 就会把 cvs.txt 加入 cvs 维护的文件列表中去。
cvs commit 检查当前目录下所有的在文件
列表中的文件并把对他们的改动加入到仓库中。
-m 表示这次 commit 的 message一般说明此次修改的相关信息。
现在修改一下 cvs.txt并且在文件档案的最上面加上 Id 的字样。
改完之后 再 commit 一次 cvs commit -m quotAdding new stuff.quot 现在看看我们所做的修改 cvs log cvs.txt 可以看到 RCS file: /home/joe/cvsroot/cvsdoc/cvs.txtv Working file: cvs.txt head: 1.2 branch: locks: strict
access list: symbolic names: keyword substitution: kv total revisions: 2 selected revisions: 2 description: ---------------------------- revision 1.2 date: 2000/09/11 11:55:06 author: joe state: Exp lines: 2 -0 i ---------------------------- revision 1.1 date: 2000/09/11 11:52:32 author: joe state: Exp initial version 你会看到每次修改加进去的 message。
这对开发者特别是一个大的项目的开发者其帮助是不言而喻的。
cvs diff -r 1.1 -r 1.2 cvs.txt 可以看到 Index: cvs.txt RCS file: /home/joe/cvsroot/cvsdoc/cvs.txtv retrieving revision 1.1 retrieving revision 1.2 diff -r1.1 -r1.2 0a1 gt Id: cvs.txtv 1.2 2000/09/11 11:55:06 joe Exp 1a3 gt hehesencond time edit it 这样会显示 1.1 和 1.2 版的 diff 原本有 1.1 版的人 只需要用这个 patch 就可以了升级到1.2了 再编辑 cvs.txt 可以发现最上面的 Id 变长了 加了一代串文字 Id: cvs.txtv 1.2 2000/09/11 11:55:06 joe Exp 这显示这个版本的一些相关信息。
远程 remote cvs 如果我们要做一个比较大的项目上面讲的本地cvs服务就太简单了我们要让众多的人可以远程开发程序 比如我们要用cvs组织起我们的minigui项目。
检查 /etc/services 有没有这两行没有请加入 cvspserver 2401/tcp CVS network server cvspserver 2401/udp CVS network server 在 /etc/inetd.conf 加入 cvspserver stream tcp nowait root /usr/local/bin/cvs cvs --allow-root/home/minigui pserver mkdir /home/minigui 要是该设置生效请重启inetd。
添加用户anoncvs 这是要给匿名cvs 用户使用的帐号其组为nogroup。
新加一个名为 minigui的 group。
添加参与 minigui开发的用户的帐号 当然 把他们的 group 设为 minigui。
cvs -d /home/minigui init cd /root/minigui 这是原来已经存在的版本 现在我们要把它的东西放进 cvs 仓库里 比如我们把minigui的库minigui03放到仓库中 cd minigui03cvs import –m “the lib” minigui03 joe start 会看到cvs把一个个文件放到仓库中。
cvs import 的语法为 cvs import -m quotlog msgquot projname vendortag releasetag vendortag 和releasetag 一般不需要关心我们这里使用一个用户名和一个start 标志。
我们把其它相关的project也放到cvs仓库中 cd miniguiapps03 cvs import –m “the apps” miniguiapps03 joe start cd miniguiexec03 cvs import –m “the demos” miniguiexec03 joe start 这样我们就把minigui的一个cvs服务器建立好了。
注意 一个 user 要远程访问某些project 他必须拥有适当的权限。
比如minigui03这个目录应该属于组minigui且组可写。
才能使minigui组里的用户可以远程参与minigui库的开发。
现在试试看从远程访问 cvs 服务器。
首先 在你的机器上建立一个工作目录 譬如是 /home/joe/work cd /home/joe/work cvs -d :pserver:joewww.minigui.org:/home/minigui login cvs -d :pserver:joewww.minigui.org:/home/minigui co minigui03 cvs -d :pserver:joewww.minigui.org:/home/minigui co miniguiapps03 cvs -d :pserver:joewww.minigui.org:/home/minigui co miniguiexec03 cvs -d :pserver:joewww.minigui.org:/home/minigui logout 当你敲入login行时系统会提示你输入pass
word 打进去。
www.minigui.org是cvs服务器所在的机器。
该指定被执行后该 cvsroot :pserver:joewww.minigui.org:/home/minigui 和加密后的密码会被存在 /.cvspass 里。
底下几行取出各个project。
最后logout。
cd minigui03 做了一些修改后可以commit出去 cvs commit -m quotlittle changequot 上面是一般开发者的登陆方法对于匿名cvs 可以让其不需要输入口令即可
登陆但是不能让其commint。
这需要 1 将要开放的project设为全局可读写因为cvs服务器在操作时要在相应目录下设置读写琐即需要创建一些临时文件所以即使是check out 操作也需要目录可写。
2 为了让匿名用户只有check out权限可以在CVSROOT目录下建立一个readers文件其中每一行是一个用户这些用户只具有只读权限。
比如 anonymous anoncvs guest jbrowse 3. 利用passwd文件使匿名用户不能用其它方式登陆。
典型为 在文件CVSROOT/passwd 中 anoncvs:XR4EZcEs0szik 在文件/etc/passwd 中为 anoncvs::1729:105:Anonymous CVS User:/home/minigui:/bin/false CVSROOT/passwd文件是cvs提供的一个专用于存放cvs密码的文件。
它的典型格式为 joe:XR4EZcEs0szik:jane 表示cvs用户joe其实是内部用户jane其cvs密码加密后被存放在第二个字段这样就将cvs服务与系统的其它部分分离开来大大地提高了系统的安全性。
上面介绍的是使用需要严格的安全认证的pserver服务器如果您在局域网内开发程序则可以使用rsh或者ssh设置非常简单服务器端只要开放着rsh或ssh服务器客户端设置两个环境变量CVS_RSH与CVSROOT可以将它们的设置写入预处理脚本比如使用ssh连接 export CVS_RSHquotsshquot export CVSROOTquot:ext:joewww.minigui.org:/home/miniguiquot cvs co miniguiexec03 joe192.9.200.75s password: 输入密码就可以得到一份miniguiexec03的拷贝了。
总结 以上只是一个简介cvs还有很多高级功能如果您需要更详细的信息请看cvs 的info或者到gnu上下载html版本的manual。
第二部分 使用AutomakeAutoconf生成Makefile 在Unix上写过程序的人尤其是用 C 来开发程序的人一般都遇到过 Makefile用 make 来开发和编译程序的确很方便可是要写出一个Makefile就不那么简单了。
GNU Make 那份几百页的文件让许多人害怕。
当然现在关于make的
文档比较多不过写一个Makefile总是一件很烦人的事情GNU Autoconf 及 Automake 这两个软件就是帮助程序开发者轻松产生Makefile 文件的。
现在的GNU
软件如Apache MySQL Minigui等都是利用AutoconfAutomake实现自动编译的。
用户只要使用 “./configure” “make” “make install” 就可以把
程序安装到系统中。
简介 Makefile 基本上就是『目标』target 『关联』dependencies 和『动作』三者所组成的一系列规则。
而 make 就是根据 Makefile 的规则决定如何编译 compile 和连接 link 程序或者其它动作。
当然make 可做的不只是编译和连接程序例如 FreeBSD 的 port collection 中Makefile还可以做到自动下载远程程序解
压缩 extract 打补丁 patch设定然后编译安装到
系统中。
Makefile 基本结构虽然很简单但是妥善运用这些规则就可以变换出许多不同的花样。
却也因为这样许多人刚开始学写Makefile 时会觉得没有规范可以遵循每个人写出来的Makefile都不大一样不知道从哪里下手而且常常会受到开发环境的限制只要环境参数不同或者路径更改可能 Makefile 就得跟着修改。
虽然有GNU Makefile Conventions GNU Makefile惯例制订出一些在进行 GNU 程序
设计时写 Makefile 的一些标准和规范但是其内容很长而且很复杂并且经常作一些调整为了减轻程序开发人员维护Makefile 的负担就出现了Automake。
利用Automake编程者只需要写一些预先定义好的宏 macro提交给Automake处理就会产生一个可以供 Autoconf 使用的 Makefile.in文件。
再配合使用 Autoconf产生的自动配置文件 configure 即可产生一份符合 GNU Makefile 惯例的 Makeifle 了。
需要的软件 在开始使用 Automake 之前首先确认你的系统安装有如下软件 1. GNU Automake 2. GNU Autoconf 3. GNU m4 4. perl 5. GNU Libtool 如果你需要产生 shared library 最好也使用 GNU C/C 编译器 、GNU Make 以及其它 GNU 的工具程序来作为开发的环境这些工具都是属于 Open Source Software 不但
免费而且功能强大。
如果你是使用 Red Hat Linux 可以找到所有上述软件的 rpm 文件。
一个简单的例子 Automake 所产生的 Makefile 除了可以做到程序的编译和连接也可以用来生成
文档如 manual page info 文件等还可以有把
源码文件包装起来以供发布所以程序源代码所存放的目录结构最好符合GNU 的标准惯例接下来就用一个hello.c 来做为例子。
在
工作目录下建立一个新的子目录devel再在 devel 下建立一个quothelloquot 的子目录这个目录将 作为存放 hello这个程序及其相关文件的地方 mkdir develcd develmkdir hellocd hello 用编辑器写一个hello.c文件 include ltstdio.hgt int mainint argc char argv printf“Hello GNUn” return 0 接下来就要用 Autoconf 及 Automake 来产生 Makefile 文件了 1. 用 autoscan 产生一个 configure.in 的原型执行autoscan 后会产生一个configure.scan 的文件可以用它作为 configure.in文件的蓝本。
autoscan ls configure.scan hello.c 2. 编辑 configure.scan文件如下所示并且改名为configure.in dnl Process this file with Autoconf to produce a configure script. AC_INIThello.c AM_INIT_AUTOMAKEhello 1.0 dnl Checks for programs. AC_PROG_CC dnl Checks for libraries. dnl Checks for header files. dnl Checks for typedefs structures and compiler characteristics. dnl Checks for library functions. AC_OUTPUTMakefile 3. 执行 aclocal 和 Autoconf 分别会产生 aclocal.m4 及 configure 两个文件 aclocal Autoconf ls aclocal.m4 configure configure.in hello.c 4. 编辑 Makefile.am 文件内容如下 AUTOMAKE_OPTIONS foreign bin_PROGRAMS hello hello_SOURCES hello.c 5. 执行 Automake --add-missing Automake 会根据Makefile.am 文件产生一些文件包含最重要的Makefile.in Automake --add-missing Automake: configure.in: installing ./install-sh Automake: configure.in: installing ./mkinstalldirs Automake: configure.in: installing ./
missing 6. 最后执行 ./configure: ./configure creating cache ./config.cache checking for a BSD compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking whether make sets MAKE... yes checking for working aclocal... found checking for working Autoconf... found checking for working Automake... found checking for working autoheader... found checking for working makeinfo... found checking for gcc... gcc checking whether the C compiler gcc works... yes checking whether the C compiler gcc is a cross-compiler... no checking whether we are using GNU C... yes checking whether gcc accepts -g... yes updating cache ./config.cache creating ./config.status creating Makefile ls Makefile aclocal.m4 config.status hello.c mkinstalldirs Makefile.am config.cache configure install-sh Makefile.in config.log configure.in missing 现在你的目录下已经产生了一个 Makefile 文件输入make指令就可以编译 hello.c 了 make gcc -DPACKAGEquothelloquot -DVERSIONquot1.0quot -I. -I. -g -O2 -c hello.c gcc -g -O2 -o hello hello.o 你还可以试试 “make clean“”make install“”make dist“ rootlocalhost hello make clean test -z quothello quot rm -f hello rm -f .o core .core rootlocalhost hello make install gcc -DPACKAGEquothelloquot -DVERSIONquot1.0quot -I. -I. -g -O2 -c hello.c gcc -g -O2 -o hello hello.o make1: Entering directory /home/joe/devel/hello /bin/sh ./mkinstalldirs /usr/local/bin /usr/bin/install -c hello /usr/local/bin/hello make1: Nothing to be done for install-data-am. make1: Leaving directory /home/joe/devel/hello rootlocalhost hello make dist rm -rf hello-1.0 mkdir hello-1.0 chmod 777 hello-1.0 herecd . ampamp pwd top_distdircd hello-1.0 ampamp pwd distdircd hello-1.0 ampamp pwd cd . ampamp Automake --include-deps --build-dirhere --srcdir-name. --output-dirtop_distdir --foreign Makefile chmod -R ar hello-1.0 GZIP--best gtar chozf hello-1.0.tar.gz hello-1.0 rm -rf hello-1.0 一切工作得很好 当然在make install时由于需要向系统目录拷贝文件您需要有root权限。
更进一步 上述产生Makefile 的过程和以往自行编写的方式非常不一样使用 Automake 只需用到一些已经定义好的宏就可以了。
我们把宏及目标 target写在Makefile.am 文件内Automake 读入 Makefile.am 文件后会把这一串已经定义好的宏展开并产生相对应的 Makefile.in 文件然后再由configure这个 shell script 根据 Makefile.in 产生合适的Makefile。
具体流程如下所示 代码 --gt autoscan --gt configure.scan --gt configure.in configure.in --. .------gt Autoconf -----gt configure --- aclocal.m4 -- ---. acsite.m4 --- --gt autoheader -gt config.h.in acconfig.h ----. ----- config.h.top -- config.h.bot -- Makefile.am -- Autoconf -------gt Makefile.in .-------------gt config.cache configure -------------------------gt config.log config.h.in -. v .-gt config.h -. --gt config.status - --gt make Makefile.in --- -gt Makefile --- 上图表示在整个过程中要使用的文件及产生出来的文件有星号 代表可执行文件。
在此示例中可由 Autoconf 及 Automake 工具所产生的额外文件有 configure.scan、aclocal.m4、configure、Makefile.in需要加入设置的有configure.in 及 Makefile.am。
开发者要书写的文件集中为confiugre.in和Makefile.am在minigui项目中我们把一系列的命令集中到一个批处理文件中autogen.sh: /bin/sh aclocal autoheader Automake --add-missing Autoconf 只要执行该批处理文件结合configure.in和Makefile.am就可以生成需要的Makefile了。
编辑 configure.in 文件 Autoconf 是用来产生 configure文件的工具。
configure 是一个 shell script它可以自动设定一些编译参数使程序能够条件编译以符合各种不同平台的Unix 系统。
Autoconf会读取configure.in 文件然后产生configure 这个 shell script。
configure.in 文件内容是一系列GNU m4 的宏这些宏经Autoconf处理后会变成检查系统特性的shell scripts。
configure.in文件中宏的顺序并没有特别的规定但是每一个configure.in 文件必须在所有其它宏前加入 AC_INIT 宏然后在所有其它宏的最后加上 AC_OUTPUT宏。
一般可先用 autoscan 扫描原始文件以产生一个 configure.scan 文件再对 configure.scan 做些修改成 configure.in 文件。
在例子中所用到的宏如下 dnl 这个宏后面的内容不会被处理可以视为注释 AC_INITFILE 该宏用来检查
源代码所在路径autoscan 会自动产生一般无须修改它。
AM_INIT_AUTOMAKEPACKAGEVERSION 这个是使用 Automake 所必备的宏PACKAGE 是所要产生软件的名称VERSION 是版本编号。
AC_PROG_CC 检查系统可用的C编译器若源代码是用C写的就需要这个宏。
AC_OUTPUTFILE 设置 configure 所要产生的文件若是Makefile configure 便会把它检查出来的结果填充到Makefile.in 文件后产生合适的 Makefile。
实际上在使用 Automake 时还需要一些其他的宏这些额外的宏我们用 aclocal来帮助产生。
执行 aclocal会产生aclocal.m4 文件如果没有特别的用途不需要修改它用 aclocal 所产生的宏会告诉 Automake如何动作。
有了 configure.in 及 aclocal.m4两个文件以后便可以执行 Autoconf来产生 configure 文件了。
编辑Makefile.am 文件 接下来要编辑Makefile.am 文件Automake 会根据 configure.in 中的宏并在perl的帮助下把Makefile.am 转成 Makefile.in 文件。
Makefile.am 文件定义所要产生的目标 AUTOMA.