該指令碼的功能,是通過測試程式獲知給定的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_type
和ngx_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...