微信公衆號:Nginx源碼分析
關注可瞭解更多的Nginx
知識。任何問題或建議,請公衆號留言;
關注公衆號,有趣有內涵的文章第一時間送達!nginx
上一篇文章咱們詳細的分析了auto/feature
腳本的做用,該腳本的主要做用是測試宿主系統是否支持某個特性。
web
auto/include
。
測試當前的宿主操做系統中是否存在某個頭文件。bash
ngx_include
: 待測試的頭文件微信
ngx_found
: 表示是否存在該頭文件,若是爲yes
表示存在該頭文件。
若爲no
,表示不存在。app
測試當前的宿主操做系統中是否存在某個頭文件。源碼分析
下面是一個示例。
這個例子用於測試當前的操做系統中是否包含 unistd.h
頭文件。測試
1ngx_include="unistd.h"; . auto/include
複製代碼
1echo $ngx_n "checking for $ngx_include ...$ngx_c"
2
3cat << END >> $NGX_AUTOCONF_ERR
4
5----------------------------------------
6checking for $ngx_include
7
8END
9
10
11ngx_found=no
12
13cat << END > $NGX_AUTOTEST.c
14
15$NGX_INCLUDE_SYS_PARAM_H
16#include <$ngx_include>
17
18int main() {
19 return 0;
20}
21
22END
23
24
25ngx_test="$CC -o $NGX_AUTOTEST $NGX_AUTOTEST.c"
26
27eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1"
28
29if [ -x $NGX_AUTOTEST ]; then
30
31 ngx_found=yes
32
33 echo " found"
34
35 ngx_name=`echo $ngx_include \
36 | tr abcdefghijklmnopqrstuvwxyz/. ABCDEFGHIJKLMNOPQRSTUVWXYZ__`
37
38
39 have=NGX_HAVE_$ngx_name . auto/have_headers
40
41 eval "NGX_INCLUDE_$ngx_name='#include <$ngx_include>'"
42
43 #STUB
44 eval "NGX_$ngx_name='#include <$ngx_include>'"
45
46else
47 echo " not found"
48
49 echo "----------" >> $NGX_AUTOCONF_ERR
50 cat $NGX_AUTOTEST.c >> $NGX_AUTOCONF_ERR
51 echo "----------" >> $NGX_AUTOCONF_ERR
52 echo $ngx_test >> $NGX_AUTOCONF_ERR
53 echo "----------" >> $NGX_AUTOCONF_ERR
54fi
55
56rm $NGX_AUTOTEST*
複製代碼
咱們以示例中測試unistd.h
的代碼分析這個腳本。ui
1).
向終端和NGX_AUTOCONF_ERR
中輸出測試信息spa
1echo $ngx_n "checking for $ngx_include ...$ngx_c"
2
3cat << END >> $NGX_AUTOCONF_ERR
4
5----------------------------------------
6checking for $ngx_include
7
8END
複製代碼
咱們以前分析的幾乎全部腳本文件的第一步都是這個功能。主要是方便查找錯誤使用。操作系統
2).
初始化一些變量
1ngx_found=no
複製代碼
上面初始化一個ngx_found
,這個變量表示的是當前測試的頭文件是否存在。默認設置爲no
.
3).
生成自動測試文件
1cat << END > $NGX_AUTOTEST.c
2
3$NGX_INCLUDE_SYS_PARAM_H
4#include <$ngx_include>
5
6int main() {
7 return 0;
8}
9
10END
複製代碼
根據傳進來的入參ngx_include
參數生成自動測試程序。
本例中生成的測試程序以下:
1#include <unistd.h>
2
3int main() {
4 return 0;
5}
複製代碼
4).
編譯自動測試程序
1ngx_test="$CC -o $NGX_AUTOTEST $NGX_AUTOTEST.c"
2
3eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1"
複製代碼
上面的腳本把第3)
步生成的自動測試程序進行編譯。編譯後的可執行文件爲objs/autotest
.
5).
執行自動測試程序並處理相應的邏輯
1if [ -x $NGX_AUTOTEST ]; then
2
3 ngx_found=yes
4
5 echo " found"
6
7 ngx_name=`echo $ngx_include \
8 | tr abcdefghijklmnopqrstuvwxyz/. ABCDEFGHIJKLMNOPQRSTUVWXYZ__`
9
10
11 have=NGX_HAVE_$ngx_name . auto/have_headers
12
13 eval "NGX_INCLUDE_$ngx_name='#include <$ngx_include>'"
14
15 #STUB
16 eval "NGX_$ngx_name='#include <$ngx_include>'"
17
18else
19 echo " not found"
20
21 echo "----------" >> $NGX_AUTOCONF_ERR
22 cat $NGX_AUTOTEST.c >> $NGX_AUTOCONF_ERR
23 echo "----------" >> $NGX_AUTOCONF_ERR
24 echo $ngx_test >> $NGX_AUTOCONF_ERR
25 echo "----------" >> $NGX_AUTOCONF_ERR
26fi
複製代碼
咱們分析一下上面的腳本。①.
若是自動測試程序不能執行,那麼會執行下面的else
邏輯。
1 echo " not found"
2
3 echo "----------" >> $NGX_AUTOCONF_ERR
4 cat $NGX_AUTOTEST.c >> $NGX_AUTOCONF_ERR
5 echo "----------" >> $NGX_AUTOCONF_ERR
6 echo $ngx_test >> $NGX_AUTOCONF_ERR
7 echo "----------" >> $NGX_AUTOCONF_ERR
複製代碼
這部分腳本和咱們以前分析的錯誤處理基本上都同樣。都是保存錯誤現場,便於查找錯誤。
②.
若是自動測試程序可執行
首先把ngx_found
設置爲yes
,表示當前操做系統包含unistd.h
頭文件。
設置ngx_name
變量。這個變量的生成規則也比較簡單,管道符後面的tr
命令是把ngx_include
中的小寫字母替換成對應的大寫字母,把小數點.
替換爲下劃線_
。因此這裏的ngx_name
變量的值就會被設置爲UNISTD_H
.
③.
向NGX_AUTO_HEADERS_H
添加宏定義
在上面的第②.
步中,生成了一個ngx_name
變量。緊接該腳本調用auto/have_headers
(咱們以前分析過該腳本,不懂得朋友能夠看看以前的文章)向NGX_AUTO_HEADERS_H
中增長一個宏定義。
1#define NGX_HAVE_UNISTD_H 1;
複製代碼
經過這個宏定義,說明了當前操做系統包含此頭文件。
④.
緊接着的兩個eval
語句生成了另外兩個輸出變量。
1 eval "NGX_INCLUDE_$ngx_name='#include <$ngx_include>'"
2
3 #STUB
4 eval "NGX_$ngx_name='#include <$ngx_include>'"
複製代碼
這兩個變量分別是:
1NGX_INCLUDE_UNISTD_H="#include <unistd.h>"
2NGX_UNISTD_H="#include <unistd.h>"
複製代碼
咱們在前面分析過的一些腳本中,在生成自動測試程序的時候就會使用到這兩個變量。如今咱們知道這兩個變量是怎麼來的吧?
6).
刪除臨時文件
1rm $NGX_AUTOTEST*
複製代碼
咱們經過unistd.h
的例子詳細的分析了auto/include
腳本的功能。這個腳本的做用就是測試在當前的宿主系統上面是否含有某個頭文件。在測試成功以後,會輸出若干變量,這樣就能夠在其餘腳本中使用到這些變量。
到如今爲止,咱們已經把開篇圖中的全部腳本已經所有分析過了。後面的文章咱們會接着分析nginx
的源碼,敬請期待。順便關注個人個公衆號(Nginx源碼分析
),第一時間接收最新文章。
後面的文章咱們會接着分析nginx
的源碼,敬請期待。順便關注個人個公衆號(Nginx源碼分析
)。