天天看點

nginx源碼分析configure腳本詳解

     在之前介紹event子產品的時候,講到init_cycle函數中對cycle進行了初始化,其中很重要一步操作就是講包含所有module資訊的數組拷貝到這個cycle對應的結構中(nginx/src/core/ngx_module.c),檔案中函數用到的包含module名稱的數組ngx_module_names在源碼中也沒找到定義、初始化。

     由于nginx擁有豐富的功能選項,是以有經驗的使用者都會采用直接源碼編譯、安裝的方式。在編譯前,需要通過執行如下指令來完成源代碼的編譯。

cd <code>--with-pcre &amp;&amp;</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>     檔案中&lt;&lt;符号是來告知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 &lt;ngx_config.h&gt;</code>

<code>$NGX_PRAGMA</code>

<code>mod</code> <code>do</code>

<code>"extern ngx_module_t $mod;"</code>     <code> </code> 

<code>&gt;&gt; $NGX_MODULES_C</code>

<code>"  &amp;$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 &lt;sys/types.h&gt;</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\" &gt;&gt; $NGX_AUTOCONF_ERR 2&gt;&amp;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>

繼續閱讀