CVSautomakeautoconf.docx
- 文档编号:28599558
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:18
- 大小:26.66KB
CVSautomakeautoconf.docx
《CVSautomakeautoconf.docx》由会员分享,可在线阅读,更多相关《CVSautomakeautoconf.docx(18页珍藏版)》请在冰豆网上搜索。
CVSautomakeautoconf
CVS,Automake与Autoconf简介
第一部分CVS简介
cvs(ConcurrentVersionSystem)是一个版本控制系统,什么是版本控制系统呢?
简单的说,它可以记录程序代码修改的过程,有一个完整的历史记录(history)。
辟如说,当你在修改程序代码的时候,不小心写出了一个bug,但是你可能很久以后才发现多出了这个bug,这个时候,cvs就能很有效的帮助你找出到底是在哪一次的修改中,出现了这个bug。
也许你会说,那我每次都把程序保存起来,用tar做好备份不就行了,当然,你可以这样做,但是这太浪费空间了!
cvs在版本更改间,只储存不同的部分,这样就可以省下很多空间。
在另一个场合里,更能显示出cvs的好处,比如多人一起开发软件的时候。
cvs支持远程访问,用户可以对他要修改的文件加上正在编辑的标志,让别人知道他要修改这个文件了。
当然,一个较大的开发队伍,一般还会需要一个mailinglist用来沟通。
毕竟cvs只是一个管理程序代码的工具,他并不扮演沟通的角色。
cvs的同类软件还有rcs和sccs。
RCS(RevisionControlSystem)可以从FSF获得。
SCCS(SourceCodeControlSystem)由AT&T在SystemV中引入,现在已经被加入X/Open标准(Unix98?
)。
比起这些软件,CVS的要优秀得多,特别是在支持多人远程开发方面。
由于CVS出现较新,所以使用上反而没有它们普及。
当然,如果您熟悉rcs,您会发现学习cvs非常容易。
名词
repository:
意为仓库。
在cvs里,它就是你真正存放各历史版本的地方。
pserver:
cvs远程服务器,cvs有两种工作模式,一种是local,一种是remote。
一般通过inetd启动pserver。
CVSROOT:
当使用cvs的时候,要设定CVSROOT这个环境变量,或是用-d选项来指定该参数,该参数指明你的仓库放在哪里。
本地(local)cvs
首先,确定一个cvsroot,比如:
exportCVSROOT="/home/joe/cvsroot/"建立该目录:
mkdir/home/joe/cvsroot
接着,运行cvsinit:
cvsinit
cvsinit会帮你把cvsroot初始化。
接着,建立一个要放文件的目录(相当于一个Project):
mkdir/home/joe/cvsroot/cvsdoc
cd/home/joe/work
cvscheckoutcvsdoc(或者简写为:
cvscocvsdoc)你会看到下面的信息:
cvscheckout:
Updatingcvsdoccvscheckout会把当前最新的版本拷贝到你的当前目录下。
记住,不要自己建立/home/joe/work/cvsdoc,该目录下还会有一些用于管理的cvs相关的信息。
接着,进入cvsdoc目录,编辑cvs.doc这个文件档案,输入一些信息。
然后,运行:
cvsaddcvs.txtcvscommit-m"Initialrevision."cvsadd就会把cvs.txt加入cvs维护的文件列表中去。
cvscommit检查当前目录下所有的在文件列表中的文件,并把对他们的改动加入到仓库中。
-m表示这次commit的message,一般说明此次修改的相关信息。
现在修改一下cvs.txt,并且,在文件档案的最上面加上$Id$的字样。
改完之后,再commit一次:
cvscommit-m"Addingnewstuff."
现在看看我们所做的修改:
cvslogcvs.txt
可以看到:
RCSfile:
/home/joe/cvsroot/cvsdoc/cvs.txt,v
Workingfile:
cvs.txt
head:
1.2
branch:
locks:
strict
accesslist:
symbolicnames:
keywordsubstitution:
kv
totalrevisions:
2;selectedrevisions:
2
description:
----------------------------
revision1.2
date:
2000/09/1111:
55:
06;author:
joe;state:
Exp;lines:
+2-0
i
----------------------------
revision1.1
date:
2000/09/1111:
52:
32;author:
joe;state:
Exp;
initialversion
==================================================================
你会看到每次修改加进去的message。
这对开发者,特别是一个大的项目的开发者,其帮助是不言而喻的。
cvsdiff-r1.1-r1.2cvs.txt
可以看到:
Index:
cvs.txt
==================================================================RCSfile:
/home/joe/cvsroot/cvsdoc/cvs.txt,v
retrievingrevision1.1
retrievingrevision1.2
diff-r1.1-r1.2
0a1
>$Id:
cvs.txt,v1.22000/09/1111:
55:
06joeExp$
1a3
>hehe,sencondtimeeditit!
这样会显示1.1和1.2版的diff,原本有1.1版的人,只需要用这个patch就可以了升级到1.2了!
再编辑cvs.txt,可以发现最上面的Id变长了?
加了一代串文字:
$Id:
cvs.txt,v1.22000/09/1111:
55:
06joeExp$这显示这个版本的一些相关信息。
远程(remote)cvs
如果我们要做一个比较大的项目,上面讲的本地cvs服务就太简单了,我们要让众多的人可以远程开发程序!
比如我们要用cvs组织起我们的minigui项目。
检查/etc/services有没有这两行,没有请加入:
cvspserver2401/tcp#CVSnetworkservercvspserver2401/udp#CVSnetworkserver
在/etc/inetd.conf加入:
cvspserverstreamtcpnowaitroot/usr/local/bin/cvscvs--allow-root=/home/miniguipserver
mkdir/home/minigui
要是该设置生效,请重启inetd。
添加用户anoncvs,这是要给匿名cvs用户使用的帐号,其组为nogroup。
新加一个名为minigui的group。
添加参与minigui开发的用户的帐号,当然,把他们的group设为minigui。
cvs-d/home/miniguiinit
cd/root/minigui,这是原来已经存在的版本,现在我们要把它的东西放进cvs仓库里:
比如,我们把minigui的库minigui03放到仓库中:
cdminigui03;cvsimport–m“thelib”minigui03joestart
会看到cvs把一个个文件放到仓库中。
cvsimport的语法为:
cvsimport-m"logmsg"projnamevendortagreleasetag
vendortag和releasetag一般不需要关心,我们这里使用一个用户名和一个start标志。
我们把其它相关的project也放到cvs仓库中:
cdminiguiapps03;cvsimport–m“theapps”miniguiapps03joestart
cdminiguiexec03;cvsimport–m“thedemos”miniguiexec03joestart
这样,我们就把minigui的一个cvs服务器建立好了。
注意,一个user要远程访问某些project,他必须拥有适当的权限。
比如,minigui03这个目录应该属于组minigui,且组可写。
才能使minigui组里的用户可以远程参与minigui库的开发。
现在试试看从远程访问cvs服务器。
首先,在你的机器上建立一个工作目录,譬如是/home/joe/work
cd/home/joe/work
cvs-d:
pserver:
joe@www.minigui.org:
/home/miniguilogin
cvs-d:
pserver:
joe@www.minigui.org:
/home/miniguicominigui03
cvs-d:
pserver:
joe@www.minigui.org:
/home/miniguicominiguiapps03
cvs-d:
pserver:
joe@www.minigui.org:
/home/miniguicominiguiexec03
cvs-d:
pserver:
joe@www.minigui.org:
/home/miniguilogout
当你敲入login行时,系统会提示你输入password,打进去。
www.minigui.org是cvs服务器所在的机器。
该指定被执行后,该cvsroot
(:
pserver:
joe@www.minigui.org:
/home/minigui)和加密后的密码会被存在~/.cvspass里。
底下几行取出各个project。
最后logout。
cdminigui03
做了一些修改后,可以commit出去:
cvscommit-m"littlechange"
上面是一般开发者的登陆方法,对于匿名cvs,可以让其不需要输入口令即可登陆,但是不能让其commint。
这需要:
1.将要开放的project设为全局可读写,因为cvs服务器在操作时要在相应目录下设置读写琐(即需要创建一些临时文件),所以即使是checkout操作,也需要目录可写。
2.为了让匿名用户只有checkout权限,可以在CVSROOT目录下建立一个readers文件,其中每一行是一个用户,这些用户只具有只读权限。
比如:
anonymous
anoncvs
guest
jbrowse
3.利用passwd文件,使匿名用户不能用其它方式登陆。
典型为:
在文件CVSROOT/passwd中:
anoncvs:
XR4EZcEs0szik
在文件/etc/passwd中为:
anoncvs:
!
:
1729:
105:
AnonymousCVSUser:
/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连接:
$exportCVS_RSH="ssh"
$exportCVSROOT=":
ext:
joe@www.minigui.org:
/home/minigui"
$cvscominiguiexec03
joe@192.9.200.75'spassword:
输入密码,就可以得到一份miniguiexec03的拷贝了。
总结
以上只是一个简介,cvs还有很多高级功能,如果您需要更详细的信息,请看cvs的info或者到gnu上下载html版本的manual。
第二部分使用Automake,Autoconf生成Makefile
在Unix上写过程序的人尤其是用C来开发程序的人一般都遇到过Makefile,用make来开发和编译程序的确很方便,可是要写出一个Makefile就不那么简单了。
GNUMake那份几百页的文件,让许多人害怕。
当然,现在关于make的文档比较多,不过写一个Makefile总是一件很烦人的事情,GNUAutoconf及Automake这两个软件就是帮助程序开发者轻松产生Makefile文件的。
现在的GNU软件如Apache,MySQLMinigui等都是利用Autoconf,Automake实现自动编译的。
用户只要使用“./configure”,“make”,“makeinstall”就可以把程序安裝到系统中。
简介
Makefile基本上就是『目标』(target),『关联』(dependencies)和『动作』三者所组成的一系列规则。
而make就是根据Makefile的规则决定如何编译(compile)和连接(link)程序或者其它动作。
当然,make可做的不只是编译和连接程序,例如FreeBSD的portcollection中,Makefile还可以做到自动下载远程程序,解压缩(extract),打补丁(patch),设定,然后编译,安装到系统中。
Makefile基本结构虽然很简单,但是妥善运用这些规则就可以变换出许多不同的花样。
却也因为这样,许多人刚开始学写Makefile时会觉得没有规范可以遵循,每个人写出来的Makefile都不大一样,不知道从哪里下手,而且常常会受到开发环境的限制,只要环境参数不同或者路径更改,可能Makefile就得跟着修改。
虽然有GNUMakefileConventions(GNUMakefile惯例)制订出一些在进行GNU程序设计时写Makefile的一些标准和规范,但是其内容很长而且很复杂,并且经常作一些调整,为了减轻程序开发人员维护Makefile的负担,就出现了Automake。
利用Automake,编程者只需要写一些预先定义好的宏(macro),提交给Automake处理,就会产生一个可以供Autoconf使用的Makefile.in文件。
再配合使用Autoconf产生的自动配置文件configure即可产生一份符合GNUMakefile惯例的Makeifle了。
需要的软件
在开始使用Automake之前,首先确认你的系统安装有如下软件:
1.GNUAutomake
2.GNUAutoconf
3.GNUm4
4.perl
5.GNULibtool(如果你需要产生sharedlibrary)
最好也使用GNUC/C++编译器、GNUMake以及其它GNU的工具程序来作为开发的环境,这些工具都是属于OpenSourceSoftware不但免费而且功能强大。
如果你是使用RedHatLinux可以找到所有上述软件的rpm文件。
一个简单的例子
Automake所产生的Makefile除了可以做到程序的编译和连接,也可以用来生成文档(如manualpage,info文件等),还可以有把源码文件包装起来以供发布,所以程序源代码所存放的目录结构最好符合GNU的标准惯例,接下来就用一个hello.c來做为例子。
在工作目录下建立一个新的子目录devel,再在devel下建立一个"hello"'的子目录,这个目录将
作为存放hello这个程序及其相关文件的地方:
%mkdirdevel;cddevel;mkdirhello;cdhello
用编辑器写一个hello.c文件,
#include
intmain(intargc,char**argv)
{
printf(“Hello,GNU!
\n”);
return0;
}
接下来就要用Autoconf及Automake來产生Makefile文件了,
1.用autoscan产生一个configure.in的原型,执行autoscan后会产生一个configure.scan的文件,可以用它作为configure.in文件的蓝本。
%autoscan
%ls
configure.scanhello.c
2.编辑configure.scan文件,如下所示,並且改名为configure.in
dnlProcessthisfilewithAutoconftoproduceaconfigurescript.
AC_INIT(hello.c)
AM_INIT_AUTOMAKE(hello,1.0)
dnlChecksforprograms.
AC_PROG_CC
dnlChecksforlibraries.
dnlChecksforheaderfiles.
dnlChecksfortypedefs,structures,andcompilercharacteristics.
dnlChecksforlibraryfunctions.
AC_OUTPUT(Makefile)
3.执行aclocal和Autoconf,分別会产生aclocal.m4及configure两个文件
%aclocal
%Autoconf
%ls
aclocal.m4configureconfigure.inhello.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
creatingcache./config.cache
checkingforaBSDcompatibleinstall.../usr/bin/install-c
checkingwhetherbuildenvironmentissane...yes
checkingwhethermakesets${MAKE}...yes
checkingforworkingaclocal...found
checkingforworkingAutoconf...found
checkingforworkingAutomake...found
checkingforworkingautoheader...found
checkingforworkingmakeinfo...found
checkingforgcc...gcc
checkingwhethertheCcompiler(gcc)works...yes
checkingwhethertheCcompiler(gcc)isacross-compiler...no
checkingwhetherweareusingGNUC...yes
checkingwhethergccaccepts-g...yes
updatingcache./config.cache
creating./config.status
creatingMakefile
$ls
Makefileaclocal.m4config.statushello.cmkinstalldirs
Makefile.amconfig.cacheconfigureinstall-sh
Makefile.inconfig.logconfigure.inmissing
現在你的目录下已经产生了一个Makefile文件,输入make指令就可以编译hello.c了!
%make
gcc-DPACKAGE=\"hello\"-DVERSION=\"1.0\"-I.-I.-g-O2-chello.c
gcc-g-O2-ohellohello.o
你还可以试试“makeclean“,”makeinstall“,”makedist“:
[root@localhosthello]#makeclean
test-z"hello"||rm-fhello
rm-f*.ocore*.core
[root@localhosthello]#makeinstall
gcc-DPACKAGE=\"hello\"-DVERSION=\"1.0\"-I.-I.-g-O2-chello.c
gcc-g-O2-ohellohello.o
make[1]:
Enteringdirectory`/home/joe/devel/hello'
/bin/sh./mkinstalldirs/usr/local/bin
/usr/bin/install-chello/usr/local/bin/hello
make[1]:
Nothingtobedonefor`install-data-am'.
make[1]:
Leavingdirec
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CVSautomakeautoconf