目录 auto/have 向自动配置头文件追加可用宏定义(objs/ngx_auto_config.h) auto/nohave 向自动配置头文件追加不可用宏定义(objs/ngx_auto_config.h) auto/define 向自动配置脚本追加 K-V 宏定义(objs/ngx_auto_config.h),表示“设置了 K,其值为 V” auto/have_headers 向自动头头文件(objs/ngx_auto_header.h) auto/feature auto/types/sizeof 生成测试程序并检测指定类型的大小 auto/types/typedef auto/types/value 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 输出检查提示还记得在《精读Nginx源码·自动脚本篇(2)设置初始变量脚本 auto/init》一文中关于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_foundngx_found=no 5.3 初始化ngx_have_featureif test -n "$ngx_feature_name"; then ngx_have_feature=`echo $ngx_feature_name | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ` fitest -n是测试参数的长度是否为 0。那么如果ngx_feature_name为空,则不会执行if内的语句,否则将把ngx_have_feature命名为ngx_feature_name的大写版(tr命令将小写全部改为大写)。
5.4 初始化ngx_feature_inc_pathif 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 fitest -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处理这一段稍长,下面逐步解释:
Bash 编程中所有布尔表达式都是用中括号括起来的。-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*