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

2022-09-06 18:00:13 字數 4812 閱讀 3877

該指令碼的功能,是通過測試程式獲知給定的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 #include $ngx_include_unistd_h

#include #include $ngx_include_inttypes_h

$ngx_include_auto_config_h

int main()

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

fingx_max_len='(sizeof("-2147483648") - 1)'

;;8)

if [ "$ngx_type"="long long" ]; then

ngx_max_value=9223372036854775807ll

else

ngx_max_value=9223372036854775807l

fingx_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

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

2.1 生成測試程式

cat << end > $ngx_autotest.c

#include #include #include #include #include #include $ngx_include_inttypes_h

int main()

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

fifi

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

這與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.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 $ngx_inttypes_h

int main()

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

-

解剖Nginx 自動指令碼篇(5)編譯器相關主指令碼

在 nginx 的自動指令碼中,auto cc目錄下的所有指令碼都是用於編譯器相關配置使用的。nginx的出色跨平台性 linux darwin solaris win32 等 就有這些指令碼的貢獻。該目錄下包含如下指令碼 link變數為 link cc 有 include 編譯 輸出目標檔案 輸出...

nginx開機自動啟動指令碼

把以下指令碼儲存為nginx檔案放入 etc init.d nginx 然後可以通過 etc init.d nginx start 命令啟動nginx etc init.d nginx stop 命令停止nginx etc init.d nginx restart 命令重啟nginx 開機自動啟動n...

nginx開機自動啟動指令碼

把以下指令碼儲存為nginx檔案放入 etc init.d nginx 然後可以通過 etc init.d nginx start 命令啟動nginx etc init.d nginx stop 命令停止nginx etc init.d nginx restart 命令重啟nginx 開機自動啟動n...