Nginx源碼分析之 -- auto/options文件

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

開篇

nginxconfigure腳本在編譯nginx的過程當中是很是重要的,它完成了各個編譯參數的配置,路徑的配置等功能。從本文開始,分析一下configure腳本的工做過程。
首先,咱們看一下configure腳本的構成,以下圖所示:
web

congifure腳本概覽
congifure腳本概覽

咱們會分析每一個過程,從而詳細理解 configure過程當中到底發生了什麼。

腳本分析

咱們先看一下configure腳本的源碼,以下:數組

 1################## nginx/auto/configure  #######################
2
3//執行auto/options文件中的命令,行中的「.」表示在當前的sh環境中執行auto/options
4//文件中的命令(與source命令效果同樣)不一樣於sh命令會致使建立子進程,因爲configure
5//文件中命令與options的命令都在同一sh環境下,因此變量在兩個文件中都是彼此可見的
6auto/options     //置變量,並將之置空
7auto/init          //初始化一些變量諸如:NGX_AUTO_HEADERS_H=$NGX_OBJS/ngx_auto_headers.h
8auto/sources     //設置核心模塊、平臺代碼對應的源文件
9
10test -d $NGX_OBJS || mkdir -p $NGX_OBJS
11
12echo > $NGX_AUTO_HEADERS_H
13echo > $NGX_AUTOCONF_ERR
14
15echo "#define NGX_CONFIGURE \"$NGX_CONFIGURE\"" > $NGX_AUTO_CONFIG_H
16
17if [ $NGX_DEBUG = YES ]; then
18    have=NGX_DEBUG . auto/have     #設置NGX_DEBUG=1
19fi
20
21.....
22
23auto/cc/conf     //檢查編譯器相關選項
24
25if [ "$NGX_PLATFORM" != win32 ]; then
26    . auto/headers     //檢查相關頭文件,並將結果輸出到ngx_auto_headers.h文件中
27fi
28
29auto/os/conf     //檢查系統平臺所需的函數
30
31if [ "$NGX_PLATFORM" != win32 ]; then
32    . auto/unix     #檢查unix環境下一些文件、函數
33fi    
34
35auto/threads
36
37//統計要編譯到nginx中的模塊信息,建立並初始化ngx_module_t *ngx_modules[]和
38//char *ngx_module_names[]兩個數組中(這兩個數組在init_cycle中被調用)存放
39//到以前建立的nginx/objs/ngx_modules.c文件中
40auto/modules    
41auto/lib/conf
42
43.......
44
45//定義變量NGX_SBIN_PATH的值爲"\"$NGX_SBIN_PATH\""
46have=NGX_SBIN_PATH value="\"$NGX_SBIN_PATH\"" . auto/define  
47have=NGX_CONF_PATH value="\"$NGX_CONF_PATH\"" . auto/define
48have=NGX_PID_PATH value="\"$NGX_PID_PATH\"" . auto/define
複製代碼

auto/options腳本

從上面能夠看出來,configure調用了 auto/options 腳本,從名字能夠看出來,這個腳本的做用就是處理傳遞給 configure腳本的各個參數,好比 ./configure --with-http_gzip_static_module --prefix=/usr/nginx/ ,那麼 auto/option 腳本就會處理 configure後面的參數,本節咱們就分析一下這個腳本的具體做用。服務器

該文件的開始部分是初始化一些變量,沒啥能夠分析的。最重要的部分就是下面的for循環部分,這部分負責處理configure的配置參數。咱們着重分析這部分代碼:微信

 1// for 後面只有變量的時候,至關於 for var in $*,即至關於把傳給文件的全部參數都傳了過去
2for option
3do
4    opt="$opt `echo $option | sed -e \"s/\(--[^=]*=\)\(.* .*\)/\1'\2'/\"`"
5
6    case "$option" in
7// 這裏會判斷若是 $option是以"-"開頭,而且中間有"="的話,
8// 好比例子中的 --prefix=/usr/nginx/,那麼sed命令會把等號"="以前的全部字符都替換爲空,
9// 而後剩下的部分賦值給 value變量。因此上面的語句最後value=/usr/nginx/
10        -*=*) value=`echo "$option" | sed -e 's/[-_a-zA-Z0-9]*=//'` ;;
11           *) value="" ;;
12    esac
13 // 這裏根據 $option 的值來進行不一樣的判斷,咱們例子中的
14// 選項會觸發下面的 --prefix=* 以及 --with-http_gzip_static_module,
15// 從而分別設置不一樣的變量,這些變量在後面會使用
16    case "$option" in
17        --help)                          help=yes                   ;;
18
19        --prefix=)                       NGX_PREFIX="!"             ;;
20        --prefix=*)                      NGX_PREFIX="$value"        ;;
21        --with-http_gzip_static_module)  HTTP_GZIP_STATIC=YES       ;;
22        *)
23            echo "$0: error: invalid option \"$option\""
24            exit 1
25        ;;
26    esac
27done
複製代碼

而後,auto/options 後面緊跟着的腳本是輸出幫助信息的,若是咱們執行 ./configure --help,那麼 help變量就會被設置爲yes,那麼就會執行下面的輸出信息,純文本輸出,沒有什麼可說的。app

而後接着:函數

 1--without-http)                  HTTP=NO  
2
3if [ $HTTP = NO ]; then
4    HTTP_CHARSET=NO
5    HTTP_GZIP=NO
6    HTTP_SSI=NO
7    HTTP_USERID=NO
8    HTTP_ACCESS=NO
9    HTTP_STATUS=NO
10    HTTP_REWRITE=NO
11    HTTP_PROXY=NO
12    HTTP_FASTCGI=NO
13fi
複製代碼

這裏會根據 HTTP 變量的值進行一些初始化操做,當咱們在執行configure腳本的時候,若傳遞的參數是 --without-http,那麼 HTTP變量就會設置爲 NO,那麼就執行上面的一些初始化代碼,可是我並無發現有人用過這個選項。咱們使用nginx就是做爲一個HTTP服務器的,爲啥要 --without-http呢?難道是做爲郵件服務器嗎?oop

剩下的部份內容就是一些變量的初始化了,很簡單,你們看一下就明白。
後續的文章會分析其餘文件的代碼,敬請關注
ui



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