#
编译器行为测试
测试 说明
AC_C_BIGENDIAN 如果按高字节在前存储字,定义WORDS_BIGENDIAN
AC_C_CONST 如果编译器不完全支持const声明,定义const为空
AC_C_INLINE
如果编译器不支持关键字inline,__inline__或__inline,定义inline为空
AC_C_CHAR_UNSIGNED 如果char是无符号数,定义CHAR_UNSIGNED
AC_C_LONG_DOUBLE 如果主机编译器支持长双精度类型,定义
HAVE_LONG_DOUBLE
AC_C_CHECK_SIZEOF
把输出变量SIZEOF_UCtype定义为C或C++预定义type类型的大小值(type[, cross-size])
系统服务测试
测试
说明
AC_SYS_INTERPRETER
根据脚本是否以#!/bin/sh为提示符来设置shell变量ac_cv_sys_interpreter为yes或no.
AC_PATH_X 找到X
Window头文件和库文件
所在的路径,并设置shell变量x_includes和x_libraries为适当路径值,如果没有找到路径,则设置no_x
AC_SYS_LONG_FILE_NAMES
如果系统支持长于14个字符的文件名,定义 HAVE_LONG_FILE_NAMES
AC_SYS_RESTARTABLE_SYSCALLS
如果系统调用会重启信号中断,定义 HAVE_RESTARTABLE_SYSCALLS
UNIX变体测试宏
测试 说明
AC_AIX
如果宿主系统是AIX,定义_ALL_SOURCE
AC_DYNIX_SEQ
已废弃--用AC_FUNC_GETMNTENT代替
AC_IRIX_SUN 已废弃--用AC_FUNC_GETMNTENT代替
AC_ISC_POSIX
定义_POSIX_SOURCE以允许使用POSIX特性
AC_MINIX
在MINIX系统上定义_MINIX和_POSIX_SOURCE以允许使用POSIX特性
AC_SCO_INTL 已废弃--被AC_FUNC_STRFTIME代替
AC_XENIX_DIR
已废弃--被AC_HEADER_DIRENT代替
AC_TRY_CPP(includes
[,action_if_true[,action_if_false]])
这个宏把includes文件名传给预处理程序,如果预处理程序处理成功则执行shell命令action_if_true,反之执行action_if_false.
AC_EGREP_HEADER(pattern,header,action_if_found
\
[,action_if_not_found])
这个宏可以用来在头文件header中查找egrep的表达式pattern,如果找到pattern,则执行shell命令action_if_found,反之执行action_if_not_found.
AC_EGREP_CPP(pattern,program,[action_if_found
\
[,action_if_not_found]])
用预处理程序对C源代码program进行处理以查找egrep的表达式pattern,如果找到pattern,则执行shell命令action_if_found,反之执行action_if_not_found.
AC_TRY_COMPILE(includes,function_body,[action_if_found
\
[,action_if_not_found]])
这个宏查找C或C++编译器的某个语法特性.编译器将编译包含includes中的头文件并使用function_body中定义的函数的测试程序,如果
编译成功,则执行shell命令action_if_found,反之执行action_if_not_found.这个宏不执行链接,可以用
AC_TRY_LINK来测试链接情况.
AC_TRY_LINK(includes,function_body,[,action_if_found
\
[,action_if_not_found]])
这个宏在AC_TRY_COMPILE之后增加链接测试.编译器将编译并链接其中包含includes中的头文件并使用function_body中定义
的函数的测试程序,如果链接成功,则执行shell命令action_if_found,反之执行action_if_not_found.
AC_TRY_RUN(program,[action_if_true[,action_if_false
\
[,action_if_cross_compiling]]])
这个宏测试宿主系统的运行时行为.编译,链接和执行C程序program,如果program,如果program返回0,则执行shell命令
action_if_true,否则执行action_if_false.如果程序要编译为在另一类型的系统上运行,则用
action_if_cross_compiling代替action_if_found.
AC_CHECK_PROG
测试在当前路径下是否在指定程序program.
AC_CHECK_FUNC
测试指定函数是否在C的链接函数库中存在.
AC_CHECK_HEADER
测试指定头文件是否存在
AC_CHECK_TYPE
如果指定的类型没有被定义,设置一个默认值.
test -z "$LDFLAGS" && LDFLAGS="-I/usr/include"
AC_SUBST(LBFLAGS)
dnl Tests for UNIX
variants
dnl
AC_CANONICAL_HOST
AC_CANONICAL_HOST报告从GNU观点看到的宿主机类型.它输出cpu-company-system形式的系统
名称.例如,笔者的一个系统上,AC_CANONICAL_HOST报告其类型为i686-unknown-linux.
dnl
Tests for
programs
dnl
AC_PROG_CC
AC_PROG_LEX
AC_PROG_AWK
AC_PROG_YACC
AC_CHECK_PROG(SHELL,bash,/bin/bash,/bin/sh)
这一代码段按顺序判断并设置了编译器,词法分析器lexer,awk,yacc以及本地shell.
dnl
Tests for libraries
dnl
AC_CHECK_LIB(socket,
socket)
AC_CHECK_LIB(resolv,res_init,[echo"res_init() not in
libresolv"],
[echo "res_init() found int libresolv"])
"Test for
libraries"的这一代码段展示了怎么为autoconf的宏编写自定义的命令.
dnl Tests for header
files
dnl
AC_CHECK_HEADER(killer.h)
AC_CHECK_HEADERS([resolv.h
temio.h curses.h sys/time.h fcntl.h \
sys/fcntl.
memory.h])
AC_DECL_SYS_SIGLIST
AC_HEADER_STDC
以"\"结尾的一行说明了多参数续行的正确方式.前面已经介绍过,使用字符"\"告诉m4和shell需要续行,并且用m4的引用符号把整个参数括起来.
dnl
Tests for
typedefs
dnl
AC_TYPE_GETGROUPS
AC_TYPE_SIZE_T
AC_TYPE_PID_T
dnl
Tests for structures
AC_HEADER_TIME
AC_STRUCT_TIMEZONE
dnl Tests
of compiler
behavior
dnl
AC_C_BIGENDIAN
AC_C_INLINE
AC_CHECK_SIZEOF(int,
32)
AC_C_BIGENDIAN宏将产生一个警告,因为调用AC_TRY_RUN时没有设置默认值以允许交叉编译,可以忽略这个警告.
dnl
Tests for library
functions
dnl
AC_FUNC_GETLOADAVG
AC_FUNC_MMAP
AC_FUNC_UTIME_NULL
AC_FUNC_VFORK
dnl
Tests of system
services
dnl
AC_SYS_INTERPRETER
AC_PATH_X
AC_SYS_RESTARTABLE_SYSCALL
AC_SYS_RESTARTABLE_SYSCALLS宏将产生一个警告,因为调用AC_TRY_RUN时没有默认值允许交叉编译,可以忽略这个警告.
dnl
Tests in this section exercise a few of `autoconf' ''s generic
macros
dnl
dnl First, let's see if we have a usable void pointer
type
dnl
AC_MSG_CHECKING(for a usable void pointer
type)
现在情况开始变得有趣起来.基本上,普通宏允许你通过编写自己的宏对autoconf进行扩展.例如,AC_MSG_CHECKING在屏幕上打印字符串"checking",随后是一个空格以及传入的参数
AC_TRY_COMPILE(
[ ],
[ char *ptr;
void *xmalloc();
ptr = (char *)
xmalloc(1);
],
[AC_DEFINE(HAVE_VOID_POINTER)
AC_MSG_RESULT(usable void pointer]
)
留意AC_TRY_COMPILE宏.autoconf能够把C代码嵌入到一个C程序框架中,并把这个程序写入已生成的configure脚本中,以便在
运行configure时编译这个程序;然后,configure捕获编译器的输出并查找错误.AC_DEFINE
(HAVE_VOID_POINTER)产生了一个名为HAVE_VOID_POINTER的预处理器符号(必须将它放置在./acconfig.h中,
因为它并不在其他地方存在).如果编译成功,configure把"#define HAVE_VOID_POINTER
1"写入到config.h中并且在屏幕上打印"usable void pointer";如果编译失败则在config.h中写入"/*
#undef HAVE_VOID_POINTER */,并显示"no usable void
pointer".在你自己的源代码文件中,只需按如下的方式测试这个预处理符号:
#ifdef HAVE_VOID_POINTER
/* do
something */
#else
/* do something else */
#endif
dnl Now,
let's exercises the preprocessor
dnl
AC_TRY_CPP(math.h, echo 'found
math.h', echo 'no math.h - deep doo
doo!)
如果configure找到了头文件math.h,它会在屏幕上显示"found math.h";否则它通知用户出现了一个问题.
dnl
Next, we test the linker
dnl
AC_TRY_LINK([#ifndef
HAVE_UNISTD_H
#include <signal.h>
#endif],
[char *ret =
*(sys_siglist + 1);],
[AC_DEFINE(HAVE_SYS_SIGLIST), AC_MSG_RESULT(got
sys_siglist)],
[AC_MSG_RESULT(no
sys_siglist)])
这一段代码测试连接器.同样,因为HAVE_SYS_SIGLIST不是一个标准预处理器符合,你必须在./acconfig.h中声明它.
dnl
Finally, set a default value for a ridiculous
type
dnl
AC_CHECK_TYPE(short_short_t, unsigned
short)
最后的测试只检查一种(希望的)不存在C数据类型.如果确实没有,则将short_short_t定义为unsigned
short.读者可以到config.h中查找与short_short_t相关的#define指令来确认这个测试的结果.
dnl Autoconfigure script for bogusapp
dnl Kurt Wall
<kwall@kurtwerks.com>
dnl
dnl Process this file with 'autoconf'
to produce a 'configure'
script
第一个代码段是标准的autoconfig.in文件头,指出了这个configure.in脚本隶属于什么软件包,联系信息(通常是软件包的维护者)以及重新生成配置脚本的说明.
AC_INIT(bogusapp.c)
AC_CONFIG_HEADER(config.h)
接下来的两行调用了前面介绍过的AC_INIT函数,并且在源文件树的根目录下创建了一个名为config.in的头文件,其中只包含从实际的头文件中提
取的预处理符号.主要在源代码中包含这个头文件并使用其中的相关符合,实际的程序就能在每个可能的系统上平滑无缝地编译.autoconf根据名为
config.h.in中包含了程序需要的所有#define指令.
怎么创建config.h.in?幸运的是,autoconf自带了一个名为autoheader的shell脚本,这个脚本使用起来很方便.该脚本能生
成config.h.in.autoheader通过读入configure.in,作为autoconf软件一部分的acconfig.h文件和位于源
代码树根路径下用于保存预处理符号的acconfig.h文件,生成config.h.in文件.在你开始抱怨又要创建另一个文件之前,告诉你一个好消
息,./acconfig.h只需包含在别处没有定义的预处理符号.更好地是,这些符号值都能为空.这个文件中只需包含可以被autoconf和
autoheader读取和使用的合法定义的C风格预处理符号.要创建config.h.in,在创建了你的config.in,在创建了你的
config.in文件之后在源代码目录下执行autoheader.下面的代码段是用于bogusapp的acconfig.h文件.
/*
Define this 1 if you compiler allows a (void *) function return */
#define
HAVE_VOID_POINTER 0
/* Define this 1 if your C compiler has a
short_short_t type */
#define short_short_t 0
/* Define this 1 if your
signal handling library support sys_siglist */
#define HAVE_SYS_SIGLIST 0
Class.forName(props.getProperty("driver"));
String url =
props.getProperty("url");
Connection con = DriverManager.getConnection(url,
props);
// showWarnings(con.getWarnings());
initLanguage(con);
return
con;
上面的Connection类的方法getWarnings检索调用这个Connection对象的第一个警告.如果有多个可以用getNextWarning方法得到.
public
void showWarnings(SQLWarning w) {
while (w != null)
{
System.out.println(w.getMessage());
w =
w.getNextWarning();
}
}
private void initLanguage(Connection con)
throws SQLException {
Statement stmt =
con.createStatement();
stmt.executeUpdate("set LANGUAGE
'us_english'");
stmt.close();
}
上面函数显示了一个比较简单的调用语句的方法.
这里是使用的属性文件注册.属性文件如下:
--------------------------------------------------------------------
#属性文件connection.properties.tmpl
#
#
The URL of the server to which you want to
connect
#
driver=net.sourceforge.jtds.jdbc.Driver
url=jdbc:jtds:sqlserver://localhost/dbname
USER=XXXX
PASSWORD=YYYY
SERVERNAME=localhost
PORTNUMBER=1433
DATABASENAME=dbname
XAEMULATION=true
#
#
TDS Version
#
#
# Use this for MS SQL Server
6.5+
#
#TDS=4.2
#
# Use this for Sybase
10+
#
#TDS=5.0
#
# Use this for MS SQL Server
7.0+
#
#TDS=7.0
#
# Use this for MS SQL Server 2000
(default)
#
TDS=8.0
--------------------------------------------------------------------
读入属性文件如下:
String
CONNECTION_PROPERTIES = "conf/connection.properties";
File propFile = new
File(fileName);
if (!propFile.exists()) {
fail("Connection properties
not found (" + propFile + ").");
}
try {
Properties props = new
Properties();
props.load(new FileInputStream(propFile));
return
props;
}
catch (IOException e) {
throw new
RuntimeException(e.getMessage());
}
这里是fail函数是使用了junit的fail方法,表示测试失败.
private void disconnect() throws Exception {
if (con != null)
{
con.close();
con = null;
}
}
protected void connect()
throws Exception {
disconnect();
con =
getConnection();
}
上面是一般写法.
public Connection getConnection()
throws Exception
{
Class.forName(props.getProperty("driver"));
String url =
props.getProperty("url");
Connection con =
DriverManager.getConnection(url,
props);
// showWarnings(con.getWarnings());
initLanguage(con);
return
con;
}
diff命令比较两个不同的文件或不同目录下的两个同名文件.在使用diff时,可以用选项来定制输出格式.patch程序将读取diff的输出和所比较
文件中的一个来重新生成另一个.diff手册的作者写道:"如果你认为diff是通过从一个文件中减去另一个来生成这两个文件的差别文件,那就可以认为
patch是使用这个差别文件和其中的一个源文件来生成另一个源文件".
diff命令的一般语法为:
diff
[option] srcfile
dstfile
diff在运行时试图找到在srcfile和dstfile里都一样的很多连续行,在碰到srcfile和dstfile里不一样的行时运行被打打断,这些有差别的行称为块(hunk).
diff的命令行选项合参数
选项
描述
-a 将所有的文件看作文本,既使文件看起来像是二进制的也不例外,并且进行逐行比较
-b
忽略块中空白数目的改变
-B 忽略插入或删除空行造成的改变
-c
产生"上下文"(context)格式的输出
-C[num] 产生"上下文"(context)格式的输出,显示块前后num行的内容,如果不指定num的值,则显示块前后3行的内容
-H
修改diff处理大文件的方式
-i 忽略大小写,同样对待大写和小写字母
-I
regexp 忽略插入或删除与正则表达式regexp匹配的行
-l 将输出结果通过pr命令处理加上页码
-p
显示出现块的C函数
-q 只报告文件是否不同;不输出差别
-r 比较目录时,进行递归比较
-s
报告两个文件相同(默认的行为是不报告相同的文件)
-t 输出时tab扩展为空白
-u
产生"统一"(unified)格式的输出
-U[num] 产生"统一"(unified)格式的输出,显示块前后num行的内容,如果不指定num的值,则显示块前后3行的内容
-v
打印diff的版本号
-w 逐行比较时忽略空白
-W cols 如果产生并排格式的输出(参见-y)
,让输出的每一列有cols个字符宽
-x pattern 当比较目录时,忽略匹配模式pattern的任何文件和子目录
-y
产生并排格式的输出
hello.c #include <stdio.h> int main(void) { char msg[ ] =
"Hello Linux programmer!"; puts(msg); printf("Here you are, using
diff.\n");
return 0; }
howdy.c #include
<stdio.h> #include <stdlib.h> int main(void) { char
msg[ ] = "Hello, linux programmer, from
howdy.c"; puts(msg); printf("howdy.c says, 'Here you are using
diff.'\n"); exit(EXIT_SUCCESS); } 使用diff的基本语法产生的输出(在下面"理解正规输出格式"部分所介绍的为正规格式)是: $diff
hello.c howdy.c la2 > #include <stdlib.h> 5c6 < char
msg[ ] = "Hello, Linux programmer!"; --- > char msg[ ] = "Hello,
Linux programmer, from howdy.c!"; 8c9 < printf("Here you are, using
diff.\n"); --- > printf("howdy.c says, 'Here you are, using
diff.'\n"); 10c11 < return 0; --- >
exit(EXIT_SUCCESS); diff能够产生几种输出格式,包括正规(normal,也是diff默认的市场格式),上下文(context),统一(unified)以及并排(side-by-side)4种.
|