解剖Nginx·自動指令碼篇(7)型別相關指令碼系列

鍾超發表於2012-03-16

解剖 Nginx·自動指令碼篇(7)型別相關指令碼系列

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

1 auto/types/sizeof

該指令碼的功能,是通過測試程式獲知給定的ngx_type的大小。

1.1 顯示提示資訊

echo $ngx_n "checking for $ngx_type size ...$ngx_c"

cat << END >> $NGX_AUTOCONF_ERR

----------------------------------------
checking for $ngx_type size

END

1.2 生成計算ngx_type的測試程式

cat << END > $NGX_AUTOTEST.c

#include <sys/types.h>
#include <sys/time.h>
$NGX_INCLUDE_UNISTD_H
#include <signal.h>
#include <sys/resource.h>
$NGX_INCLUDE_INTTYPES_H
$NGX_INCLUDE_AUTO_CONFIG_H

int main() {
    printf("%d", sizeof($ngx_type));
    return 0;
}

END

1.3 編譯測試程式

首先生成編譯的命令。

ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS \
      -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT $ngx_feature_libs"

注意-o $NGX_AUTOTEST是生成可執行檔案,然後執行編譯。

eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1"

1.4 執行測試程式,得到ngx_size

如果NGX_AUTOTEST檔案存在且可執行,則設定ngx_size大小。

ngx_size=
if [ -x $NGX_AUTOTEST ]; then
    ngx_size=`$NGX_AUTOTEST`
    echo " $ngx_size bytes"
fi

1.5 刪除NGX_AUTOTEST測試程式可執行檔案

rm -f $NGX_AUTOTEST

1.6 設定整數最大值

分別處理 32 位系統的資料大小和 64 位系統的資料大小,設定整數最大值。其他情況作為錯誤處理。

case $ngx_size in
    4)
        if [ "$ngx_type"="long" ]; then
            ngx_max_value=2147483647L
        else
            ngx_max_value=2147483647
        fi

        ngx_max_len='(sizeof("-2147483648") - 1)'
    ;;

    8)
        if [ "$ngx_type"="long long" ]; then
            ngx_max_value=9223372036854775807LL
        else
            ngx_max_value=9223372036854775807L
        fi

        ngx_max_len='(sizeof("-9223372036854775808") - 1)'
    ;;

    *)
        echo
        echo "$0: error: can not detect $ngx_type size"

        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

        exit 1
esac

2 auto/types/typedef

通過兩個迴圈,分別處理ngx_typengx_types。向objs/ngx_auto_config.h檔案寫入typedef定義。

2.1 生成測試程式

cat << END > $NGX_AUTOTEST.c

#include <sys/types.h>
#include <signal.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <netinet/in.h>
$NGX_INCLUDE_INTTYPES_H

int main() {
    $ngx_try i = 0;
    return 0;
}

END

2.2 編譯測試程式

ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS \
          -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT $ngx_feature_libs"

eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1"

2.3 設定ngx_found

if [ -x $NGX_AUTOTEST ]; then
    if [ $ngx_try = $ngx_type ]; then
        echo " found"
        ngx_found=yes
    else
        echo ", $ngx_try used"
        ngx_found=$ngx_try
    fi
fi

2.4 刪除測試程式可執行檔案

rm -f $NGX_AUTOTEST

2.5 異常情況

if [ $ngx_found = no ]; then
    echo $ngx_n " $ngx_try not found$ngx_c"

    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

else
    break
fi

到此迴圈就結束了。然後:

if [ $ngx_found = no ]; then
    echo
    echo "$0: error: can not define $ngx_type"

    exit 1
fi

2.6 將typedef語句寫入objs/ngx_auto_config.h

ngx_found是原型別,ngx_type是別名型別。

if [ $ngx_found != yes ]; then
    echo "typedef $ngx_found  $ngx_type;"   >> $NGX_AUTO_CONFIG_H
fi

3 auto/types/value

這與auto/define有些類似,但auto/define表示“設定了 K 值,其值為 V”,與“沒有設定 K 值”相對。而auto/types/value是設定任意引數和其值。

cat << END >> $NGX_AUTO_CONFIG_H

#ifndef $ngx_param
#define $ngx_param  $ngx_value
#endif

END

4 auto/types/uintptr_t

4.1 提示

echo $ngx_n "checking for uintptr_t ...$ngx_c"
echo >> $NGX_ERR
echo "checking for uintptr_t" >> $NGX_ERR

4.2 生成測試程式

cat << END > $NGX_AUTOTEST.c

#include <sys/types.h>
$NGX_INTTYPES_H

int main() {
    uintptr_t i = 0;
    return 0;
}

END

4.3 編譯測試程式

found=no

eval "$CC -o $NGX_AUTOTEST $NGX_AUTOTEST.c >> $NGX_ERR 2>&1"

if [ -x $NGX_AUTOTEST ]; then
    echo " uintptr_t found"
    found=yes
else
    echo $ngx_n " uintptr_t not found" $ngx_c
fi

4.4 刪除測試程式可執行檔案

rm $NGX_AUTOTEST*

4.5 無可執行檔案時的處理

if [ $found = no ]; then
    found="uint`expr 8 \* $ngx_ptr_size`_t"
    echo ", $found used"

    echo "typedef $found  uintptr_t;"                   >> $NGX_AUTO_CONFIG_H
    echo "typedef $found  intptr_t;" | sed -e 's/u//g'  >> $NGX_AUTO_CONFIG_H
fi

-

轉載請註明來自“柳大·Poechant的CSDN部落格”:blog.CSDN.net/Poechant

-

相關文章