zoukankan      html  css  js  c++  java
  • 解剖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*
    
  • 相关阅读:
    Oracle常用命令大全(很有用,做笔记)
    表格驱动编程在代码中的应用
    mac 利用svn下载远程代码出现Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo.
    FAILURE: Build failed with an exception.
    There is an internal error in the React performance measurement code.Did not expect componentDidMount timer to start while render timer is still in progress for another instance
    react native TypeError network request failed
    Android向系统相册中插入图片,相册中会出现两张 一样的图片(只是图片大小不一致)
    react-native Unrecognized font family ‘Lonicons’;
    react-native SyntaxError xxxxx/xx.js:Unexpected token (23:24)
    Application MyTest has not been registered. This is either due to a require() error during initialization or failure to call AppRegistry.registerComponent.
  • 原文地址:https://www.cnblogs.com/breg/p/4043708.html
Copyright © 2011-2022 走看看