• 解剖Nginx·自动脚本篇(4)工具型脚本系列


    目录

    1. auto/have 向自动配置头文件追加可用宏定义(objs/ngx_auto_config.h
    2. auto/nohave 向自动配置头文件追加不可用宏定义(objs/ngx_auto_config.h
    3. auto/define 向自动配置脚本追加 K-V 宏定义(objs/ngx_auto_config.h),表示“设置了 K,其值为 V”
    4. auto/have_headers 向自动头头文件(objs/ngx_auto_header.h
    5. auto/feature
    6. auto/types/sizeof 生成测试程序并检测指定类型的大小
    7. auto/types/typedef
    8. 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

    • 主要功能:向自动配置头文件中标示指定参数的值
    • 处理变量:havevalue
    • 作用对象:

      • 作用对象:$NGX_AUTO_CONFIG_H变量所表示的自动生成头文件。
      • 默认对象:objs/ngx_auto_config.h
        cat << END >> $NGX_AUTO_CONFIG_H
        #ifndef $have
        #define $have  $value
        #endif
        END
      
    • 示例:

    如果have值为SOME_FLAGvalue值为1234,则引用该脚本而运行后,objs/ngx_auto_config.h中将追加如下内容:

    #ifndef SOME_FLAG
    #define SOME_FLAG 1234
    #endif
    

    4 auto/have_headers

    • 主要功能:向自动头头文件中标示指定参数存在
    • 处理变量:havevalue
    • 作用对象:

      • 作用对象:$NGX_AUTO_HEADERS_H变量所表示的自动生成头文件。
      • 默认对象:objs/ngx_auto_headers.h
        cat << END >> $NGX_AUTO_HEADERS_H
        #ifndef $have
        #define $have  1
        #endif
        END
      
    • 注意:auto/have_headersauto/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_nngx_c两个变量吗?在auto/feature中的第一句是:

    echo $ngx_n "checking for $ngx_feature ...$ngx_c"
    

    就是echo一句checking for $ngx_feature,然后换行。当然存在ngx_nngx_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_incsngx_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_runbug,则与上一种情况类似。

            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*
    
  • 相关阅读:
    Java学习第十五章 之 Map、可变参数、Collections
    Java第十四章 之 List、Set
    Java学习第十三章 之 常用API
    通过shell终端上传下载文件
    javamail邮件发送
    linux防火墙添加例外端口shell脚本
    MySQL批量更新
    MySQL返回列名
    发现一个有意思的东西
    struts2,action方法自动执行两次
  • 原文地址:https://www.cnblogs.com/breg/p/4043708.html
Copyright © 2020-2023  润新知