在之前介紹event子產品的時候,講到init_cycle函數中對cycle進行了初始化,其中很重要一步操作就是講包含所有module資訊的數組拷貝到這個cycle對應的結構中(nginx/src/core/ngx_module.c),檔案中函數用到的包含module名稱的數組ngx_module_names在源碼中也沒找到定義、初始化。
由于nginx擁有豐富的功能選項,是以有經驗的使用者都會采用直接源碼編譯、安裝的方式。在編譯前,需要通過執行如下指令來完成源代碼的編譯。
cd <code>--with-pcre &&</code> <code><code> 打開nginx/auto/configure檔案,發現該檔案是一個shell腳本,并調用了一些其他檔案 </code></code>
################## nginx/auto/configure #######################
<code># Copyright (C) Igor Sysoev</code>
<code>LC_ALL=C</code>
<code> </code>
<code>#檔案中指令與options的指令都在同一sh環境下,是以變量在兩個檔案中都是彼此可見的</code>
<code>#設定變量,并将之置空</code>
<code>#初始化一些變量諸如:NGX_AUTO_HEADERS_H=$NGX_OBJS/ngx_auto_headers.h</code>
<code>#設定核心子產品、平台代碼對應的源檔案</code>
<code>-d $NGX_OBJS ||</code> <code> </code>
<code>echo</code> <code>echo</code> <code> </code>
<code>then</code>
<code>/have</code> <code> </code>
<code>. auto</code> <code> </code>
<code>"$NGX_PLATFORM"</code> <code> </code> <code>#檢查相關頭檔案,并将結果輸出到ngx_auto_headers.h檔案中</code>
<code>"$NGX_PLATFORM"</code> <code> </code> <code>#檢查unix環境下一些檔案、函數</code>
<code>. auto</code> <code>#統計要編譯到nginx中的子產品資訊,建立并初始化ngx_module_t *ngx_modules[]和</code>
<code>. auto</code> <code>/lib/conf</code>
<code>"\"$NGX_SBIN_PATH\""</code> <code>have=NGX_CONF_PATH value=</code> <code>/define</code>
<code><code> </code> </code>
<code><code>NGX_PCRE宏定義,這類的宏定義可以在nginx/objs/ngx_auto_config.h中看到,這個檔案是由have=$ngx_have_feature . auto/have這樣的語句生成的。 </code></code>
################ nginx/auto/have ##############
<code>#endif</code>
<code><code> 檔案中<<符号是來告知shell标準輸入來自一對分隔符(可以使字元串、數字等類型,隻要保證開頭和結尾的一緻)中間的内容;是以,have檔案中的指令就是利用cat将分隔符END之間的5行内容追加到$NGX_AUTO_CONFIG_H檔案中。效果如下: </code></code>
#ifndef NGX_PCRE
<code><code> 這就回答了第一個問題。 </code></code>
?
<code>modules=</code> <code>cat</code> <code>#include <ngx_config.h></code>
<code>$NGX_PRAGMA</code>
<code>mod</code> <code>do</code>
<code>"extern ngx_module_t $mod;"</code> <code> </code>
<code>>> $NGX_MODULES_C</code>
<code>" &$mod,"</code> <code> </code>
<code> </code> <code> </code>
<code>#定義并初始化char *ngx_module_names[]數組,然後輸出重定向到$NGX_MODULES_C</code>
<code>" \"$mod\","</code> <code> </code>
<code><code>nginx/auto/modules這個檔案生成的兩個數組用于cycle的初始化,是以如果開發者開發的子產品要添加到nginx中,一定要記得修改nginx/auto/modules這個檔案,否則是不會被編譯到nginx中的(當然不會生效啦)。</code></code>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<code>"poll()"</code>
<code>ngx_feature_incs=</code> <code>ngx_feature_libs=</code>
<code></code>
<code> </code> <code>pl.revents = 0;</code>
<code> </code> <code>return</code> <code>. auto</code> <code>#如果上述的測試結果表明該feature不可用,就将相應的宏設定為NONE</code>
<code>fi</code>
<code>?</code>
......
<code>cat</code> <code>#include <sys/types.h></code>
<code>$ngx_feature_test;</code>
<code>0;</code>
<code>END</code>
<code>ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS $ngx_feature_inc_path \</code>
<code>"/bin/sh -c \"$ngx_test\" >> $NGX_AUTOCONF_ERR 2>&1"</code>
<code>if</code> <code> </code> <code>case</code> <code> </code> <code> </code> <code>#執行對應的可執行程式,并重定向輸出</code>
<code>/bin/sh</code> <code> </code> <code>echo</code> <code>ngx_found=</code> <code> </code> <code>if</code> <code>"$ngx_feature_name"</code> <code> </code> <code> </code> <code> </code> <code>echo</code> <code>fi</code>
<code>......</code>