精读 Nginx·自动脚本篇(4)工具型脚本系列
作用对象: 示例: 如果 与 作用对象: 示例: 如果 作用对象: 示例: 如果 作用对象: 注意: 还记得在《精读Nginx源码·自动脚本篇(2)设置初始变量脚本 auto/init》一文中关于 就是 然后向 自动测试源码文件是在 其中 运行测试程序。 这一段稍长,下面逐步解释: Bash 编程中所有布尔表达式都是用中括号括起来的。 如果 如果 如果 如果 想 如果 如果是其他情况,则若 如果 - 转载请注明来自“钟超的****博客”:Blog.****.net/Poechant -精读 Nginx·自动脚本篇(4)工具型脚本系列
目录
objs/ngx_auto_config.h
)objs/ngx_auto_config.h
)objs/ngx_auto_config.h
),表示“设置了 K,其值为 V”objs/ngx_auto_header.h
)1 auto/have
$have
$NGX_AUTO_CONFIG_H
变量所表示的自动生成头文件。objs/ngx_auto_config.h
cat << END >> $NGX_AUTO_CONFIG_H
#ifndef $have
#define $have 1
#endif
END
have
值为SOME_FLAG
,则引用该脚本而运行后,objs/ngx_auto_config.h
中将追加如下内容:#ifndef SOME_FLAG
#define SOME_FLAG 1
#endif
2 auto/nohave
auto/have
脚本类似。
$have
$NGX_AUTO_CONFIG_H
变量所表示的自动生成头文件。objs/ngx_auto_config.h
cat << END >> $NGX_AUTO_CONFIG_H
#ifndef $have
#define $have 0
#endif
END
have
值为SOME_FLAG
,则引用该脚本而运行后,objs/ngx_auto_config.h
中将追加如下内容:#ifndef SOME_FLAG
#define SOME_FLAG 0
#endif
3 auto/define
have
和value
$NGX_AUTO_CONFIG_H
变量所表示的自动生成头文件。objs/ngx_auto_config.h
cat << END >> $NGX_AUTO_CONFIG_H
#ifndef $have
#define $have $value
#endif
END
have
值为SOME_FLAG
,value
值为1234
,则引用该脚本而运行后,objs/ngx_auto_config.h
中将追加如下内容:#ifndef SOME_FLAG
#define SOME_FLAG 1234
#endif
4 auto/have_headers
have
和value
$NGX_AUTO_HEADERS_H
变量所表示的自动生成头文件。objs/ngx_auto_headers.h
cat << END >> $NGX_AUTO_HEADERS_H
#ifndef $have
#define $have 1
#endif
END
auto/have_headers
与auto/have
的不同,前者是向objs/ngx_auto_config.h
写,后者是向objs/ngx_auto_headers.h
写。5 auto/feature
$ngx_n
$ngx_feature
$ngx_c
ngx_feature_name
$ngx_feature_path
$ngx_feature_inc_path
$ngx_temp
$ngx_feature_incs
$ngx_feature_test
$ngx_feature_libs
$ngx_have_feature
5.1 输出检查提示
ngx_n
和ngx_c
两个变量吗?在auto/feature
中的第一句是:echo $ngx_n "checking for $ngx_feature ...$ngx_c"
echo
一句checking for $ngx_feature
,然后换行。当然存在ngx_n
和ngx_c
都为空的情况,这时真就没有主动换行了。NGX_AUTOCONF_ERR
表示的文件添加自动配置错误信息。该文件是在auto/init
文件中初始化的(参见《精读Nginx源码·自动脚本篇(2)设置初始变量脚本 auto/init》),其值为NGX_AUTOCONF_ERR=$NGX_OBJS/autoconf.err
,默认情况下为objs/autoconf.err
。5.2 初始化
ngx_found
ngx_found=no
5.3 初始化
ngx_have_feature
if test -n "$ngx_feature_name"; then
ngx_have_feature=`echo $ngx_feature_name \
| tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`
fi
test -n
是测试参数的长度是否为 0。那么如果ngx_feature_name
为空,则不会执行if
内的语句,否则将把ngx_have_feature
命名为ngx_feature_name
的大写版(tr
命令将小写全部改为大写)。5.4 初始化
ngx_feature_inc_path
if test -n "$ngx_feature_path"; then
for ngx_temp in $ngx_feature_path; do
ngx_feature_inc_path="$ngx_feature_inc_path -I $ngx_temp"
done
fi
test -n
是测试参数的长度是否为 0。如果ngx_feature_path
为/path/to/one /path/to/two /path/to/three
,则ngx_feature_inc_path
将被置为-I /path/to/one -I /path/to/two -I /path/to/three
。5.5 生成自动测试程序
auto/init
脚本中初始化为$NGX_OBJS/autotest
的,默认为objs/autotest
。加上后缀名则为objs/autotest.c
cat << END > $NGX_AUTOTEST.c
#include <sys/types.h>
$NGX_INCLUDE_UNISTD_H
$ngx_feature_incs
int main() {
$ngx_feature_test;
return 0;
}
END
ngx_feature_incs
和ngx_feature_test
算是auto/feature
脚本的参数。5.6 编译自动测试程序
CC
是在脚本auto/options
中初始化的, 为CC=${CC:-gcc}
。该段代码的功能是生成编译命令。ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS $ngx_feature_inc_path \
-o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_TEST_LD_OPT $ngx_feature_libs"
ngx_feature_inc_path=
eval "/bin/sh -c \"$ngx_test\" >> $NGX_AUTOCONF_ERR 2>&1"
5.7 根据
ngx_feature_run
处理-x
参数表示Test if file exists and is executable
。所以如果NGX_AUTOTEST
表示的文件存在则执行then
。if [ -x $NGX_AUTOTEST ]; then
case "$ngx_feature_run" in
ngx_feature_run
的值为yes
,由于-c
,则将NGX_AUTOTEST
文件的内容当做命令执行,其输出到标准输出及错误输出的结果都被重定向到NGX_AUTOCONF_ERR
中。 yes)
# /bin/sh is used to intercept "Killed" or "Abort trap" messages
if /bin/sh -c $NGX_AUTOTEST >> $NGX_AUTOCONF_ERR 2>&1; then
echo " found"
ngx_found=yes
ngx_feature_name
长度不为零,则have
设置为$ngx_have_feature
的值,并引用auto/have
脚本向objs/ngx_auto_config.h
写入宏定义。 if test -n "$ngx_feature_name"; then
have=$ngx_have_feature . auto/have
fi
NGX_AUTOTEST
表示的值为空或者表示的命令执行错误,则执行else
: else
echo " found but is not working"
fi
;;
ngx_feature_run
的值为value
,则执行NGX_AUTOTEST
所表示的命令。 value)
# /bin/sh is used to intercept "Killed" or "Abort trap" messages
if /bin/sh -c $NGX_AUTOTEST >> $NGX_AUTOCONF_ERR 2>&1; then
echo " found"
ngx_found=yes
objs/ngx_auto_config.h
文件写入: cat << END >> $NGX_AUTO_CONFIG_H
#ifndef $ngx_feature_name
#define $ngx_feature_name `$NGX_AUTOTEST`
#endif
END
else
echo " found but is not working"
fi
;;
ngx_feature_run
是bug
,则与上一种情况类似。 bug)
# /bin/sh is used to intercept "Killed" or "Abort trap" messages
if /bin/sh -c $NGX_AUTOTEST >> $NGX_AUTOCONF_ERR 2>&1; then
echo " not found"
else
echo " found"
ngx_found=yes
if test -n "$ngx_feature_name"; then
have=$ngx_have_feature . auto/have
fi
fi
;;
ngx_feature_name
不为空则将ngx_have_feature
相关的宏写入objs/ngx_auto_config.h
职工。 *)
echo " found"
ngx_found=yes
if test -n "$ngx_feature_name"; then
have=$ngx_have_feature . auto/have
fi
;;
esac
NGX_AUTOTEST
表示的文件不存在或不可执行,则执行下面的else
中的几句echo
。else
echo " not found"
echo "----------" >> $NGX_AUTOCONF_ERR
cat $NGX_AUTOTEST.c >> $NGX_AUTOCONF_ERR
echo "----------" >> $NGX_AUTOCONF_ERR
echo $ngx_test >> $NGX_AUTOCONF_ERR
echo "----------" >> $NGX_AUTOCONF_ERR
fi
5.8 删除
NGX_AUTOSET
测试程序可执行文件rm $NGX_AUTOTEST*
上一篇: Mybatis介绍之缓存