📄 cvs, automake与autoconf简介.htm
字号:
-------> Makefile.in <BR><BR>.------------->
config.cache <BR>configure*
------------+-------------> config.log <BR>|
<BR>[config.h.in] -. v .-> [config.h] -.
<BR>+--> config.status* -+ +--> make*
<BR>Makefile.in ---' `-> Makefile ---'
<BR><BR>上图表示在整个过程中要使用的文件及产生出来的文件,有星号 (*)
代表可执行文件。在此示例中可由 Autoconf 及 Automake 工具所产生的额外文件有
configure.scan、aclocal.m4、configure、Makefile.in,需要加入设置的有configure.in
及 Makefile.am。
开发者要书写的文件集中为confiugre.in和Makefile.am,在minigui项目中,我们把一系列的命令集中到一个批处理文件中:autogen.sh:
<BR><BR>#!/bin/sh <BR>aclocal <BR>autoheader
<BR>Automake --add-missing <BR>Autoconf
<BR><BR>只要执行该批处理文件,结合configure.in和Makefile.am,就可以生成需要的Makefile了。
<BR><BR>编辑 configure.in 文件 <BR>Autoconf 是用来产生
'configure'文件的工具。'configure' 是一个 shell
script,它可以自动设定一些编译参数使程序能够条件编译以符合各种不同平台的Unix
系统。Autoconf会读取configure.in 文件然后产生'configure' 这个
shell script。 <BR><BR>configure.in 文件内容是一系列GNU m4
的宏,这些宏经Autoconf处理后会变成检查系统特性的shell scripts。
configure.in文件中宏的顺序并没有特别的规定,但是每一个configure.in
文件必须在所有其它宏前加入 AC_INIT 宏,然后在所有其它宏的最后加上
AC_OUTPUT宏。一般可先用 autoscan 扫描原始文件以产生一个
configure.scan 文件,再对 configure.scan 做些修改成
configure.in 文件。在例子中所用到的宏如下: <BR><BR>dnl
<BR>这个宏后面的内容不会被处理,可以视为注释 <BR><BR>AC_INIT(FILE)
<BR>该宏用来检查源代码所在路径,autoscan 会自动产生,一般无须修改它。
<BR><BR>AM_INIT_AUTOMAKE(PACKAGE,VERSION)
<BR>这个是使用 Automake 所必备的宏,PACKAGE
是所要产生软件的名称,VERSION 是版本编号。 <BR><BR>AC_PROG_CC
<BR>检查系统可用的C编译器,若源代码是用C写的就需要这个宏。
<BR><BR>AC_OUTPUT(FILE) <BR>设置 configure
所要产生的文件,若是Makefile ,configure
便会把它检查出来的结果填充到Makefile.in 文件后产生合适的 Makefile。
<BR><BR>实际上,在使用 Automake 时,还需要一些其他的宏,这些额外的宏我们用
aclocal来帮助产生。执行 aclocal会产生aclocal.m4
文件,如果没有特别的用途,不需要修改它,用 aclocal 所产生的宏会告诉
Automake如何动作。 <BR><BR>有了 configure.in 及
aclocal.m4两个文件以后,便可以执行 Autoconf来产生 configure 文件了。
<BR><BR>编辑Makefile.am 文件 <BR>接下来要编辑Makefile.am
文件,Automake 会根据 configure.in
中的宏并在perl的帮助下把Makefile.am 转成 Makefile.in 文件。
Makefile.am 文件定义所要产生的目标: <BR><BR>AUTOMAKE_OPTIONS
<BR>设置 Automake 的选项。Automake 主要是帮助开发 GNU
软件的人员来维护软件,所以在执行Automake 时,会检查目录下是否存在标准 GNU
软件中应具备的文件,例如 'NEWS'、'AUTHOR'、 <BR>'ChangeLog'
等文件。设置为foreign 时,Automake 会改用一般软件的标准来检查。
<BR><BR>bin_PROGRAMS
<BR>定义要产生的执行文件名。如果要产生多个执行文件,每个文件名用空白符隔开。
<BR><BR>hello_SOURCES <BR>定义 'hello'
这个执行程序所需要的原始文件。如果 'hello'这个程序是由多个原始文件所产生,
<BR>必須把它所用到的所有原始文件都列出来,以空白符隔开。假设 'hello' 还需要
'hello.c'、'main.c'、'hello.h' 三个文件的话,则定义
<BR>hello_SOURCES= hello.c main.c hello.h
<BR>如果定义多个执行文件,则对每个执行程序都要定义相对的filename_SOURCES。
<BR><BR>编辑好 Makefile.am 文件,就可以用 Automake
--add-missing来产生 Makefile.in。加上 --add-missing
选项来告诉
Automake顺便加入包装一个软件所必须的文件,如果你不使用该选项,Automake可能会抱怨缺少了什么文件。Automake产生出來的
Makefile.in 文件是完全符合 GNU Makefile 惯例的,只要执行
configure这个shell <BR>script 便可以产生合适的 Makefile 文件了。
<BR><BR>使用 Makefile <BR>利用 configure 所产生的
Makefile文件有几个预先设定的目标可供使用,这里只用几个简述如下: <BR><BR>make
all <BR>产生设定的目标,既范例中的可执行文件。只敲入make
也可以,此时会开始编译源代码,然后连接并产生执行文件。 <BR><BR>make clean
<BR>清除之前所编译的可执行文件及目标文件(object file, *.o)。
<BR><BR>make distclean <BR>除了清除可执行文件和目标文件以外,也把
configure 所产生的 Makefile 清除掉。 通常在发布软件前执行该命令。
<BR><BR>make install
<BR>将程序安装到系统中,若源码编译成功,且执行结果正确,便可以把程序安装到系统预先设定的执行文件存放路径中,若用
bin_PROGRAMS 宏的话,程序会被安装到 /usr/local/bin下。
<BR><BR>make dist <BR>将程序和相关的文档包装为一个压缩文档以供发布
(distribution) 。执行完在目录下会产生一个以
<BR>PACKAGE-VERSION.tar.gz 为名称的文件。PACKAGE 和
VERSION 这两个参数是根据 configure.in 文中
<BR>AM_INIT_AUTOMAKE(PACKAGE, VERSION)
的定义。在我们的例子中会产生 'hello-1.0.tar.gz' 的文件。
<BR><BR>make distcheck <BR>和 make dist
类似,但是加入检查包装以后的压缩文件是否正常,这个目标除了把程序和相关文档包装成 tar.gz
文件外,还会自动把这个压缩文件解开,执行 configure,并执行 make all
,确认编译无错误以后,方显示这个 tar.gz 文件已经准备好并可以发布了。当你看到:
<BR>==========================================
<BR>hello-1.0.tar.gz is ready for distribution
<BR>==========================================
<BR><BR>就可以放心地发布您的软件了,检查过关的套件,基本上可以给任何具备 GNU
开发环境的人去重新编译成功。 <BR>要注意的是,利用 Autoconf 及 Automake
所产生出來的软件套件是可以在没有安装 Autoconf 及 Automake 的环境使用的,因为
configure 是一个 shell script,它己被设计为可以在一般 Unix 的 sh
这个 shell 下执行。但是如果要修改 configure.in 及 Makefile.am
文件再产生新的 configure 及 Makefile.in 文件时就一定要有 Autoconf
及 Automake 了。 <BR><BR>相关资料
<BR>通常我们掌握了一些入门知识就可以开始实践了,在有新的需求时,参照相关的文档和别人的例子解决问题,在实践中不断提高。
<BR>Autoconf 和 Automake 功能十分强大,可以从它们附带的 info
文档中找到详细的使用说明。或者您喜欢html,可以从gun站点上下载hmtl版本。你也可以从许多现有的GNU
软件或 Open Source 软件如Minigui中找到相关的 configure.in 或
Makefile.am 文件,他们是学习 Autoconf 及 Automake
更多技巧的最佳范例。 <BR>
<P>
<TABLE cellSpacing=1 cellPadding=4 width="100%"
border=0>
<TBODY>
<TR>
<TD
class=sectiontableheader>评论</TD></TR></TBODY></TABLE></P>
<P>
<SCRIPT language=Javascript> function x () { return; } function ac_smilie(thesmile) { document.akocommentform.comment.value += " "+thesmile+" "; document.akocommentform.comment.focus(); } function validate(){ if (document.akocommentform.comment.value==''){ alert("请你发表至少一条评论."); } else { document.akocommentform.action = 'index.php'; document.akocommentform.submit(); } }function DoPrompt(action) { var revisedMessage; var currentMessage = document.akocommentform.comment.value; if (action == "url") { var thisURL = prompt("Enter the URL for the link you want to add.", "http://"); var thisTitle = prompt("Enter the web site title", "Page Title"); var urlBBCode = "[URL="+thisURL+"]"+thisTitle+"[/URL]"; revisedMessage = currentMessage+urlBBCode; document.akocommentform.comment.value=revisedMessage; document.akocommentform.comment.focus(); return; } if (action == "email") { var thisEmail = prompt("Enter the email address you want to add.", ""); var emailBBCode = "[EMAIL]"+thisEmail+"[/EMAIL]"; revisedMessage = currentMessage+emailBBCode; document.akocommentform.comment.value=revisedMessage; document.akocommentform.comment.focus(); return; } if (action == "bold") { var thisBold = prompt("Enter the text that you want to make bold.", ""); var boldBBCode = "[B]"+thisBold+"[/B]"; revisedMessage = currentMessage+boldBBCode; document.akocommentform.comment.value=revisedMessage; document.akocommentform.comment.focus(); return; } if (action == "italic") { var thisItal = prompt("Enter the text that you want to make italic.", ""); var italBBCode = "[I]"+thisItal+"[/I]"; revisedMessage = currentMessage+italBBCode; document.akocommentform.comment.value=revisedMessage; document.akocommentform.comment.focus(); return; } if (action == "underline") { var thisUndl = prompt("Enter the text that you want to be undelined.", ""); var undlBBCode = "[U]"+thisUndl+"[/U]"; revisedMessage = currentMessage+undlBBCode; document.akocommentform.comment.value=revisedMessage; document.akocommentform.comment.focus(); return; } if (action == "image") { var thisImage = prompt("Enter the URL for the image you want to display.", "http://"); var imageBBCode = "[IMG]"+thisImage+"[/IMG]"; revisedMessage = currentMessage+imageBBCode; document.akocommentform.comment.value=revisedMessage; document.akocommentform.comment.focus(); return; } if (action == "quote") { var quoteBBCode = "[QUOTE] [/QUOTE]"; revisedMessage = currentMessage+quoteBBCode; document.akocommentform.comment.value=revisedMessage; document.akocommentform.comment.focus(); return; } if (action == "code") { var codeBBCode = "[CODE] [/CODE]"; revisedMessage = currentMessage+codeBBCode; document.akocommentform.comment.value=revisedMessage; document.akocommentform.comment.focus(); return; } if (action == "listopen") { var liststartBBCode = "[LIST]"; revisedMessage = currentMessage+liststartBBCode; document.akocommentform.comment.value=revisedMessage; document.akocommentform.comment.focus(); return; } if (action == "listclose") { var listendBBCode = "[/LIST]"; revisedMessage = currentMessage+listendBBCode; document.akocommentform.comment.value=revisedMessage; document.akocommentform.comment.focus(); return; } if (action == "listitem") { var thisItem = prompt("Enter the new list item. Note that each list group must be preceeded by a List Close and must be ended with List Close.", ""); var itemBBCode = "[*]"+thisItem; revisedMessage = currentMessage+itemBBCode; document.akocommentform.comment.value=revisedMessage; document.akocommentform.comment.focus(); return; }}</SCRIPT>
<TABLE cellSpacing=1 cellPadding=4 width="100%"
align=center border=0>
<TBODY>
<TR>
<TD class=sectiontableheader
colSpan=2>发表评论</TD></TR>
<FORM name=akocommentform action=index.php
method=post target=_top><INPUT type=hidden
value=com_akocomment name=option><INPUT
type=hidden value=3 name=acitemid><INPUT
type=hidden value=168 name=contentid><INPUT
type=hidden value=entry name=func>
<TR class=sectiontableentry1>
<TD>昵称:</TD>
<TD>游客<INPUT type=hidden value=游客
name=acname></TD></TR>
<TR class=sectiontableentry1>
<TD>标题:</TD>
<TD><INPUT class=inputbox style="WIDTH: 75%"
name=title></TD></TR>
<TR class=sectiontableentry1>
<TD width=130>BBCode:</TD>
<TD><A onclick='DoPrompt("url");'
href="javascript:%20x()"><IMG alt="Web Address"
hspace=1
src="CVS, Automake与Autoconf简介.files/bburl.gif"
border=0></A><A onclick='DoPrompt("email");'
href="javascript:%20x()"><IMG
alt="Email Address" hspace=1
src="CVS, Automake与Autoconf简介.files/bbemail.gif"
border=0></A><A onclick='DoPrompt("bold");'
href="javascript:%20x()"><IMG alt="Bold Text"
hspace=1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -