解剖Nginx·自動指令碼篇(4)工具型指令碼系列
解剖 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
-
相關文章
- 精讀 Nginx·自動指令碼篇(4)工具型指令碼系列Nginx指令碼
- 解剖Nginx·自動指令碼篇(7)型別相關指令碼系列Nginx指令碼型別
- 解剖Nginx·自動指令碼篇(5)編譯器相關主指令碼Nginx指令碼編譯
- 解剖Nginx·自動指令碼篇(1)解析配置選項指令碼 auto/optionsNginx指令碼
- 解剖Nginx·自動指令碼篇(3)原始碼相關變數指令碼 auto/sourcesNginx指令碼原始碼變數
- 解剖Nginx·自動指令碼篇(2)設定初始變數指令碼 auto/initNginx指令碼變數
- 解剖Nginx·自動指令碼篇(6)編譯器名稱變數指令碼 auto/cc/nameNginx指令碼編譯變數
- 精讀Nginx·自動指令碼篇(5)編譯器相關主指令碼Nginx指令碼編譯
- 精讀 Nginx 原始碼·自動指令碼篇(3)原始碼相關變數指令碼 auto/sourcesNginx原始碼指令碼變數
- 精讀Nginx原始碼·自動指令碼篇(2)設定初始變數指令碼 auto/initNginx原始碼指令碼變數
- 自動配置php、mysql、nginx的指令碼PHPMySqlNginx指令碼
- 精讀Nginx原始碼·自動指令碼篇(1)如何讀取配置選項?Nginx原始碼指令碼
- 自動ftp指令碼FTP指令碼
- java 自動升級sql指令碼 flyway 工具JavaSQL指令碼
- Linux管理指令碼之自動執行指令碼Linux指令碼
- specjvm自動化指令碼JVM指令碼
- 自動備份指令碼指令碼
- docker指令碼自動化Docker指令碼
- LNMP自動部署指令碼LNMP指令碼
- awr自動收集指令碼指令碼
- 自動化RMAN指令碼指令碼
- 自動化指令碼安裝mysql shell指令碼範例指令碼MySql
- CentOS7 nginx啟動指令碼CentOSNginx指令碼
- ssh自動輸入密碼指令碼 切換目錄指令碼密碼指令碼
- nginx重啟指令碼Nginx指令碼
- Nginx 重啟指令碼Nginx指令碼
- Ubuntu自動啟動配置指令碼Ubuntu指令碼
- 網路卡自動啟動指令碼指令碼
- Dockerfile---指令碼自動化Docker指令碼
- Linux自啟動指令碼Linux指令碼
- Ceph 自動reweight指令碼指令碼
- hadoop自動提交指令碼Hadoop指令碼
- MySQL自動備份指令碼MySql指令碼
- 自動生成Statspack的指令碼指令碼
- vue自動化部署指令碼Vue指令碼
- windows下oracle自動啟動指令碼WindowsOracle指令碼
- iOS —— 兩套自動打包指令碼iOS指令碼
- 實現指令碼自動部署docker指令碼Docker