回顧
上一篇文章我們?cè)敿?xì)的分析了auto/feature腳本的作用,該腳本的主要作用是測(cè)試宿主系統(tǒng)是否支持某個(gè)特性。

下面我們分析上圖中最后一個(gè)腳本文件
auto/include。
auto/include 腳本
測(cè)試當(dāng)前的宿主操作系統(tǒng)中是否存在某個(gè)頭文件。
輸入?yún)?shù)
ngx_include: 待測(cè)試的頭文件
輸出參數(shù)
ngx_found: 表示是否存在該頭文件,如果為yes表示存在該頭文件。
若為no,表示不存在。
功能
測(cè)試當(dāng)前的宿主操作系統(tǒng)中是否存在某個(gè)頭文件。
示例
下面是一個(gè)示例。
這個(gè)例子用于測(cè)試當(dāng)前的操作系統(tǒng)中是否包含 unistd.h頭文件。
ngx_include="unistd.h"; . auto/include
腳本內(nèi)容
echo $ngx_n "checking for $ngx_include ...$ngx_c"
cat << END >> $NGX_AUTOCONF_ERR
----------------------------------------
checking for $ngx_include
END
ngx_found=no
cat << END > $NGX_AUTOTEST.c
$NGX_INCLUDE_SYS_PARAM_H
#include <$ngx_include>
int main() {
return 0;
}
END
ngx_test="$CC -o $NGX_AUTOTEST $NGX_AUTOTEST.c"
eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1"
if [ -x $NGX_AUTOTEST ]; then
ngx_found=yes
echo " found"
ngx_name=`echo $ngx_include \
| tr abcdefghijklmnopqrstuvwxyz/. ABCDEFGHIJKLMNOPQRSTUVWXYZ__`
have=NGX_HAVE_$ngx_name . auto/have_headers
eval "NGX_INCLUDE_$ngx_name='#include <$ngx_include>'"
#STUB
eval "NGX_$ngx_name='#include <$ngx_include>'"
else
echo " not found"
echo "----------" >> $NGX_AUTOCONF_ERR
cat $NGX_AUTOTEST.c >> $NGX_AUTOCONF_ERR
echo "----------" >> $NGX_AUTOCONF_ERR
echo $ngx_test >> $NGX_AUTOCONF_ERR
echo "----------" >> $NGX_AUTOCONF_ERR
fi
rm $NGX_AUTOTEST*
腳本分析
我們以示例中測(cè)試unistd.h的代碼分析這個(gè)腳本。
1).向終端和NGX_AUTOCONF_ERR中輸出測(cè)試信息
echo $ngx_n "checking for $ngx_include ...$ngx_c"
cat << END >> $NGX_AUTOCONF_ERR
----------------------------------------
checking for $ngx_include
END
我們之前分析的幾乎所有腳本文件的第一步都是這個(gè)功能。主要是方便查找錯(cuò)誤使用。
2). 初始化一些變量
ngx_found=no
上面初始化一個(gè)ngx_found,這個(gè)變量表示的是當(dāng)前測(cè)試的頭文件是否存在。默認(rèn)設(shè)置為no.
3).生成自動(dòng)測(cè)試文件
cat << END > $NGX_AUTOTEST.c
$NGX_INCLUDE_SYS_PARAM_H
#include <$ngx_include>
int main() {
return 0;
}
END
根據(jù)傳進(jìn)來(lái)的入?yún)?code>ngx_include參數(shù)生成自動(dòng)測(cè)試程序。
本例中生成的測(cè)試程序如下:
#include <unistd.h>
int main() {
return 0;
}
4).編譯自動(dòng)測(cè)試程序
ngx_test="$CC -o $NGX_AUTOTEST $NGX_AUTOTEST.c"
eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1"
上面的腳本把第3)步生成的自動(dòng)測(cè)試程序進(jìn)行編譯。編譯后的可執(zhí)行文件為objs/autotest.
5). 執(zhí)行自動(dòng)測(cè)試程序并處理相應(yīng)的邏輯
if [ -x $NGX_AUTOTEST ]; then
ngx_found=yes
echo " found"
ngx_name=`echo $ngx_include \
| tr abcdefghijklmnopqrstuvwxyz/. ABCDEFGHIJKLMNOPQRSTUVWXYZ__`
have=NGX_HAVE_$ngx_name . auto/have_headers
eval "NGX_INCLUDE_$ngx_name='#include <$ngx_include>'"
#STUB
eval "NGX_$ngx_name='#include <$ngx_include>'"
else
echo " not found"
echo "----------" >> $NGX_AUTOCONF_ERR
cat $NGX_AUTOTEST.c >> $NGX_AUTOCONF_ERR
echo "----------" >> $NGX_AUTOCONF_ERR
echo $ngx_test >> $NGX_AUTOCONF_ERR
echo "----------" >> $NGX_AUTOCONF_ERR
fi
我們分析一下上面的腳本。
①. 如果自動(dòng)測(cè)試程序不能執(zhí)行,那么會(huì)執(zhí)行下面的else邏輯。
echo " not found"
echo "----------" >> $NGX_AUTOCONF_ERR
cat $NGX_AUTOTEST.c >> $NGX_AUTOCONF_ERR
echo "----------" >> $NGX_AUTOCONF_ERR
echo $ngx_test >> $NGX_AUTOCONF_ERR
echo "----------" >> $NGX_AUTOCONF_ERR
這部分腳本和我們之前分析的錯(cuò)誤處理基本上都一樣。都是保存錯(cuò)誤現(xiàn)場(chǎng),便于查找錯(cuò)誤。
②.如果自動(dòng)測(cè)試程序可執(zhí)行
首先把ngx_found設(shè)置為yes,表示當(dāng)前操作系統(tǒng)包含unistd.h頭文件。
設(shè)置ngx_name變量。這個(gè)變量的生成規(guī)則也比較簡(jiǎn)單,管道符后面的tr命令是把ngx_include中的小寫(xiě)字母替換成對(duì)應(yīng)的大寫(xiě)字母,把小數(shù)點(diǎn).替換為下劃線(xiàn)_。所以這里的ngx_name變量的值就會(huì)被設(shè)置為UNISTD_H.
③. 向NGX_AUTO_HEADERS_H添加宏定義
在上面的第②.步中,生成了一個(gè)ngx_name變量。緊接該腳本調(diào)用auto/have_headers(我們之前分析過(guò)該腳本,不懂得朋友可以看看之前的文章)向NGX_AUTO_HEADERS_H中增加一個(gè)宏定義。
#define NGX_HAVE_UNISTD_H 1;
通過(guò)這個(gè)宏定義,說(shuō)明了當(dāng)前操作系統(tǒng)包含此頭文件。
④. 緊接著的兩個(gè)eval語(yǔ)句生成了另外兩個(gè)輸出變量。
eval "NGX_INCLUDE_$ngx_name='#include <$ngx_include>'"
#STUB
eval "NGX_$ngx_name='#include <$ngx_include>'"
這兩個(gè)變量分別是:
NGX_INCLUDE_UNISTD_H="#include <unistd.h>"
NGX_UNISTD_H="#include <unistd.h>"
我們?cè)谇懊娣治鲞^(guò)的一些腳本中,在生成自動(dòng)測(cè)試程序的時(shí)候就會(huì)使用到這兩個(gè)變量?,F(xiàn)在我們知道這兩個(gè)變量是怎么來(lái)的吧?
6). 刪除臨時(shí)文件
rm $NGX_AUTOTEST*
總結(jié)
我們通過(guò)unistd.h的例子詳細(xì)的分析了auto/include腳本的功能。這個(gè)腳本的作用就是測(cè)試在當(dāng)前的宿主系統(tǒng)上面是否含有某個(gè)頭文件。在測(cè)試成功之后,會(huì)輸出若干變量,這樣就可以在其他腳本中使用到這些變量。
到現(xiàn)在為止,我們已經(jīng)把開(kāi)篇圖中的所有腳本已經(jīng)全部分析過(guò)了。后面的文章我們會(huì)接著分析nginx的源碼,敬請(qǐng)期待。順便關(guān)注我的個(gè)公眾號(hào)(Nginx源碼分析),第一時(shí)間接收最新文章。
后面的文章我們會(huì)接著分析nginx的源碼,敬請(qǐng)期待。順便關(guān)注我的個(gè)公眾號(hào)(Nginx源碼分析)。