解剖Nginx·自動腳本篇(4)工具型腳本系列

解剖 Nginx·自動腳本篇(4)工具型腳本系列

  • Author: Poechant
  • Blog: blog.CSDN.net/Poechant
  • Email: zhongchao.ustc#gmail.com (#->@)
  • Date: March 12th, 2012
  • Copyright © 柳大·Poechant

目錄

  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*

-

轉載請註明來自“鍾超的CSDN博客”:Blog.CSDN.net/Poechant

發佈了9 篇原創文章 · 獲贊 1 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章