📄 使用autotools进行项目管理 - mark zhong's blog.htm
字号:
<TBODY>
<TR>
<TD height=157>/* config.h.in. Generated automatically from
configure.in by autoheader. */
<P>/* Name of package */<BR>#undef PACKAGE</P>
<P>/* Version number of package */<BR>#undef
VERSION</P></TD></TR></TBODY></TABLE><BR>现在要手工添加一个文件了Makefile.am:<BR>
<TABLE width="75%" bgColor=#999999 border=0>
<TBODY>
<TR>
<TD>AUTOMAKE_OPTIONS = foreign <BR>bin_PROGRMAS =
hello<BR>hello_SOURCES = hello.cpp</TD></TR></TBODY></TABLE><BR>运行automake
-add-missing,目录下会生成Makefile.in。<BR>运行autoconf,
目录下会生成configure脚本。<BR>所有工作现在就已经做完了。试试运行一下:<BR>./configure<BR>make<BR>make
install<BR>是不是非常专业,非常酷? <BR><BR><BR>2.分析<BR><BR>2.1
分析configu.in<BR><BR>在上面的实战中我们修改了configure.in(这个文件能完成我们大部分跨平台的设置和检查,也可以定制编译及链接时的行为)和手工创建了Makefile.am。<BR><BR>configure.in文件必须在开始所有工作之前调用AC_INIT宏,并且在结束所有工作后调用AC_OUTPUT宏。而事实上,也只有这两个宏是configure.in文件所必须的。AC_INIT语法如下:<BR> <SPAN
class=style5>AC_INIT(unique_file_in_source_dir)</SPAN><BR>unique_file_in_source_dir是在源代码目录下的一个文件,对AC_INIT的调用在所产生的配置脚本文件中生成一条shell命令,通过检查unique_file_source_dir是否存在来验证当前目录是否正确。<BR><BR>AC_OUTPUT创建名为Makefile或其它名字的输出文件,其语法如下:<BR> <SPAN
class=style5>AC_OUTPUT([file...[, extra_cmds[, init_cmds]]])
</SPAN><BR>其中file是用空格分隔的输出文件列表,通过复制file.in到file来生成这些文件。extra_cmds是一个命令列表,附加在config.status之后,在重新生成配置脚本时会用到它,init_cmds也将插入到config.status中,但其位置在extra_cmds之前。<BR>configure.in文件的结构大致如下:<BR>
<TABLE width=200 bgColor=#999999 border=0>
<TBODY>
<TR>
<TD>AC_INIT<BR> 测试程序<BR> 测试函数库<BR> 测试头文件<BR> 测试类型定义<BR>
测试结构<BR> 测试编译器行为<BR> 测试库函数<BR>
测试系统调用<BR>AC_OUTPUT</TD></TR></TBODY></TABLE><BR>以上顺序并不是必须的。例如函数库的存在与否直接影响到是否包含相应的头文件,所以对头文件的检查要放在检查完函数库之后。在configure.in文件中,通常每一个宏调用应该占据单独的一行,这是因为多数autoconf宏都需要一个新行来结束命令。在使用宏读取或设置环境变量时,可以把这些变量当作一个宏而放在同一行上。<BR><BR>一个多参数的宏调用可以超过每宏一行的规则。这时应该使用'\'来续行并且用m4所能识别的括号[]来括起所有参数,示例如下:<BR>
AC_CHECK_HEADERS([unistd.h termios.h termio.h sgtty.h \<BR>
sys/timer.h ]) <BR> AC_CHECK_HEADERS(unistd.h termios.h termio.h sgtty.h
sys/<BR> timer.h
)<BR>两种定义方式是等价的。第二个例子是把整个宏写在同一行内。<BR><BR>在configure.in的第一行是一句注释<BR> <SPAN
class=style5>dnl Process this file with autoconf to produce a configure
script.</SPAN><BR>dnl是m4的注释符号。也可以使用#做为注释符号<BR><BR>2.2
分析Makefile.am<BR><BR>automake会把Makefile.am按configure.in中的定义生成Makefile.in。
<BR><SPAN
class=style5>AUTOMAKE_OPTIONS</SPAN><BR> 设置automake的选项。automake主要是帮助软件开发人员维护软件的配套文档,在执行automake时,会检查目录下是否存在标准软件文档中应具备的文件,例如:"NEWS"、"INSTALL"、"ChangeLog"等。设为foreign时,则不进行检查。<BR><SPAN
class=style5>bin_PROGRAMS</SPAN><BR> 定义你要生成的可执行文档名。如果要生成多个可执行文档,每个文档名用空格分隔。<BR><SPAN
class=style5>hello_SOURCES</SPAN><BR>
定义hello这个可执行文档的源程序和要依赖的头文件等相关文件。如果有多个可执行文档,则每个可执行文档都要有相对应的filename_SORUCES。<BR><BR>如果在你的目录树,源代码放在./src
/
子目录下,则使用SUBDIRS宏,来指定子目录,在子目录中要放一个通常的Makefile.am文件。<BR><BR>三、autotools使用进阶<BR>3.1 几个常用的autoconf宏<BR>AC_PROG_CC
<BR> 决定使用哪个C编译器,并设置输出变量CC<BR>AC_PROG_CXX <BR>
决定使用哪个C++编译器,并设置输出变量CC<BR>AC_PROG_CC_C_O <BR> 决定编译器是否接受-c或-o选项,如果不接受,定义
NO_MINUS_C_MINUS_O<BR>AC_CHECK_LIB(lib,function[,action_if_found[,action_if_no_found,[,other_libs]]])
<BR> 通过把一个C程序链接到函数库lib来判断在lib库中是否存在指定的函数。在测 <BR>
试成功时执行shell命令section_if_found或者在action_if_found为空时,在输<BR>
出变量LIB中添加-llib。action_if_not_found把other_libs选项传给link命令。<BR>
这个函数是测试宏中最常用的一个。<BR>AC_HEADER_STDC<BR> 如果系统支持ANSI/ISO
C头文件,定义STDC_HEADERS。<BR>AC_HEADER_SYS_WAIT<BR>
如果系统有POSIX兼容的头文件sys/wait.h,定义输出变量HAVE_SYS_WAIT<BR>AC_HEADER_DIRENT<BR>
顺序检查头dirent.h、sysdir/ndir.h、sys/dir.h和ndir.h中是否定义了DIR,并<BR>
根据结果定义HAVE_DIRENT_H、HAVE_SYS_NDIR_H、<BR>
HAVE_SYS_DIR_H、或HAVE_NDIR_H<BR>3.2 一个进阶的例子<BR>
<P>四、更详细的autoconf的参考(部分宏的介绍) 五、参考 <BR>????</P><BR>
<P align=right><A
href="http://www.free-think.org/mark/article/0001/items/index.html">...更多</A></P></TD></TR></TBODY></TABLE>
<P>
<HR>
<CENTER><A href="http://www.free-think.org/mark/article/0001/index.html">主页</A>
| <A title="Visit Free Think Org" href="http://www.free-think.org/">Free Think
Org </A>| <A href="http://udbi.free-think.org/">UDBI</A> | <A
href="mailto:mark@free-think.org">联系我</A> | <A
href="http://wsvf.free-think.org/">WJian HomePage</A><BR><FONT
size=1>网页内容仅为个人意见</FONT><FONT size=1>.<BR>? 1999-2004 Mark Zhong 版权所有.
保留所有权利</FONT><BR><BR></CENTER><BR><BR>本文引用通告地址:
http://blog.csdn.net/zgzjw/services/trackbacks/27052.aspx <BR>[<A
href="javascript:StorePage()">点击此处收藏本文</A>] </DIV>
<DIV class=postFoot>发表于 2004年06月26日 10:59 AM </DIV></DIV><LINK
href="http://blog.csdn.net/zgzjw/Services/Pingback.aspx" rel=pingback><!--
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<rdf:Description
rdf:about="http://blog.csdn.net/zgzjw/archive/2004/06/26/27052.aspx"
dc:identifier="http://blog.csdn.net/zgzjw/archive/2004/06/26/27052.aspx"
dc:title="使用autotools进行项目管理"
trackback:ping="http://blog.csdn.net/zgzjw/services/trackbacks/27052.aspx" />
</rdf:RDF>
-->
<SCRIPT language=JavaScript
src="使用autotools进行项目管理 - mark zhong's blog.files/BlogJudgeShow.htm"
type=text/javascript></SCRIPT>
<BR>
<DIV id=comments>
<H3></H3>
<DIV class=post>
<DIV class=postTitle><A href="http://www.jj-jj.cc/"
target=_blank>尖锐湿疣</A> 发表于<SPAN>2004-12-31 3:57 AM</SPAN> </DIV>
<DIV class=postText>Pretty cool! Thank you! <BR></DIV></DIV><BR></DIV>
<DIV class=moreinfo>
<TABLE class=comments id=CommentForm cellSpacing=1 cellPadding=1 border=0>
<TBODY>
<TR>
<TD width=75></TD>
<TD></TD>
<TD></TD></TR>
<TR>
<TD width=75>大名</TD>
<TD><INPUT id=PostComment.ascx_tbName style="WIDTH: 300px" size=40
name=PostComment.ascx:tbName></TD>
<TD><SPAN id=PostComment.ascx_RequiredFieldValidator2
style="VISIBILITY: hidden; COLOR: red" initialvalue=""
evaluationfunction="RequiredFieldValidatorEvaluateIsValid"
errormessage="请输入名字"
controltovalidate="PostComment.ascx_tbName">请输入名字</SPAN></TD></TR>
<TR>
<TD>网址</TD>
<TD><INPUT id=PostComment.ascx_tbUrl style="WIDTH: 300px" size=40
name=PostComment.ascx:tbUrl></TD>
<TD></TD></TR>
<TR>
<TD>验证码</TD>
<TD><INPUT id=PostComment.ascx_ValidationKey style="WIDTH: 150px"
name=PostComment.ascx:ValidationKey> <IMG
src="使用autotools进行项目管理 - mark zhong's blog.files/VKImage.htm"
align=absMiddle> </TD></TR>
<TR>
<TD colSpan=3>评论 <SPAN id=PostComment.ascx_RequiredFieldValidator3
style="VISIBILITY: hidden; COLOR: red" initialvalue=""
evaluationfunction="RequiredFieldValidatorEvaluateIsValid"
errormessage="请输入评论"
controltovalidate="PostComment.ascx_tbComment">请输入评论</SPAN><BR><TEXTAREA id=PostComment.ascx_tbComment style="WIDTH: 400px; HEIGHT: 193px" name=PostComment.ascx:tbComment rows=10 cols=50></TEXTAREA></TD></TR>
<TR>
<TD colSpan=3><INPUT id=PostComment.ascx_chkRemember type=checkbox
name=PostComment.ascx:chkRemember><LABEL
for=PostComment.ascx_chkRemember>记住我</LABEL></TD></TR>
<TR>
<TD><INPUT language=javascript id=PostComment.ascx_btnSubmit onclick="if (typeof(Page_ClientValidate) == 'function') Page_ClientValidate(); " type=submit value=确定 name=PostComment.ascx:btnSubmit></TD>
<TD colSpan=2><SPAN id=PostComment.ascx_Message
style="COLOR: red"></SPAN></TD></TR></TBODY></TABLE></DIV>
<DIV class=spacer> </DIV></DIV>
<DIV class=footer>Powered by: <BR><A id=Footer1_Hyperlink2
href="http://scottwater.com/blog" name=Hyperlink1><IMG alt=""
src="使用autotools进行项目管理 - mark zhong's blog.files/100x30_Logo.gif" border=0></A>
<A id=Footer1_Hyperlink3 href="http://asp.net/" name=Hyperlink1><IMG alt=""
src="使用autotools进行项目管理 - mark zhong's blog.files/PoweredByAsp.Net.gif"
border=0></A> <BR>Copyright © zgzjw
<P></P></DIV>
<SCRIPT language=javascript type=text/javascript>
<!--
var Page_Validators = new Array(document.all["PostComment.ascx_RequiredFieldValidator2"], document.all["PostComment.ascx_RequiredFieldValidator3"]);
// -->
</SCRIPT>
<SCRIPT language=javascript type=text/javascript>
<!--
var Page_ValidationActive = false;
if (typeof(clientInformation) != "undefined" && clientInformation.appName.indexOf("Explorer") != -1) {
if ((typeof(Page_ValidationVer) != "undefined") && (Page_ValidationVer == "125"))
ValidatorOnLoad();
}
function ValidatorOnSubmit() {
if (Page_ValidationActive) {
return ValidatorCommonOnSubmit();
}
return true;
}
// -->
</SCRIPT>
</FORM></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -