Nginx源碼分析之--auto/include腳本

微信公衆號:Nginx源碼分析
關注可瞭解更多的Nginx知識。任何問題或建議,請公衆號留言;
關注公衆號,有趣有內涵的文章第一時間送達!nginx

回顧

上一篇文章咱們詳細的分析了auto/feature腳本的做用,該腳本的主要做用是測試宿主系統是否支持某個特性。
web

輔助腳本
輔助腳本

下面咱們分析上圖中最後一個腳本文件 auto/include

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源碼分析)。



喜歡本文的朋友們,歡迎長按下圖關注訂閱號Nginx源碼分析,更多精彩內容第一時間送達
Nginx源碼分析
Nginx源碼分析
相關文章
相關標籤/搜索