解剖 Nginx·自動腳本篇(4)工具型腳本系列
- Author: Poechant
- Blog: blog.CSDN.net/Poechant
- Email: zhongchao.ustc#gmail.com (#->@)
- Date: March 12th, 2012
- Copyright © 柳大·Poechant
目錄
-
auto/have 向自動配置頭文件追加可用宏定義(
objs/ngx_auto_config.h
) -
auto/nohave 向自動配置頭文件追加不可用宏定義(
objs/ngx_auto_config.h
) -
auto/define 向自動配置腳本追加 K-V 宏定義(
objs/ngx_auto_config.h
),表示“設置了 K,其值爲 V” -
auto/have_headers 向自動頭頭文件(
objs/ngx_auto_header.h
) - auto/feature
- auto/types/sizeof 生成測試程序並檢測指定類型的大小
- auto/types/typedef
- 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
- 主要功能:向自動配置頭文件中標示指定參數的值
-
處理變量:
have
和value
-
作用對象:
-
作用對象:
$NGX_AUTO_CONFIG_H
變量所表示的自動生成頭文件。 -
默認對象:
objs/ngx_auto_config.h
cat << END >> $NGX_AUTO_CONFIG_H #ifndef $have #define $have $value #endif END
-
作用對象:
-
示例:
如果have
值爲SOME_FLAG
,value
值爲1234
,則引用該腳本而運行後,objs/ngx_auto_config.h
中將追加如下內容:
#ifndef SOME_FLAG
#define SOME_FLAG 1234
#endif
4 auto/have_headers
- 主要功能:向自動頭頭文件中標示指定參數存在
-
處理變量:
have
和value
-
作用對象:
-
作用對象:
$NGX_AUTO_HEADERS_H
變量所表示的自動生成頭文件。 -
默認對象:
objs/ngx_auto_headers.h
cat << END >> $NGX_AUTO_HEADERS_H #ifndef $have #define $have 1 #endif END
-
作用對象:
-
注意:
auto/have_headers
與auto/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_n
和ngx_c
兩個變量嗎?在auto/feature
中的第一句是:
echo $ngx_n "checking for $ngx_feature ...$ngx_c"
就是echo
一句checking
for $ngx_feature
,然後換行。當然存在ngx_n
和ngx_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_incs
和ngx_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_run
是bug
,則與上一種情況類似。
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