微信公众号:Nginx源码分析
关注可了解更多的Nginx
知识。任何问题或建议,请公众号留言;
关注公众号,有趣有内涵的文章第一时间送达!
辅助脚本
我们在前面的几篇文章中详细的分析了auto/options
,auto/init
,auto/sources
脚本源码,除此之外,nginx
还有一些其他的辅助脚本,用于完成一些特定的功能。我总结了一下在nginx
中遇到的辅助脚本,如下图所示:
我们本篇文章以及后续的两到三篇文章就详细的分析一下这些辅助脚本的功能。
本文详细分析上图中的前三个脚本。
auto/define脚本
功能
该脚本用于向NGX_AUTO_CONFIG_H
头文件中增加一个宏定义,并且设置这个宏的名称。
参数
have
:宏的名称
value
:宏的值
脚本内容
cat << END >> $NGX_AUTO_CONFIG_H
#ifndef $have
#define $have $value
#endif
END
示例
在configure
文件中,有如下的代码:
have=NGX_PREFIX value="\"$NGX_PREFIX/\"" . auto/define
这行脚本就是根据我们传递的NGX_PREFIX
的值,向头文件中增加内容,比如我们调用configure
的时候如下:
./configure --prefix=/usr/local/nginx
那么上面的语句就会变成:
have=NGX_PREFIX value="/usr/local/nginx" .auto/define
那么就会向NGX_AUTO_CONFIG_H
头文件中写入下面的内容:
#ifndef NGX_PREFIX
#define NGX_PREFIX "/usr/local/nginx"
#endif
就这样,通过auto/define
脚本,nginx
可以把我们的配置参数和c
的源码结合起来。反正对于我来说,第一个看到这样的形式,非常的新颖。
auto/have脚本
功能
和上面的auto/define
脚本类似,auto/have
也是向NGX_AUTO_CONFIG_H
头文件中增加一个宏定义,但是这里增加的宏的值都是1
,不会又自定义的值。
参数
have
:宏的名称
脚本内容
cat << END >> $NGX_AUTO_CONFIG_H
#ifndef $have
#define $have 1
#endif
END
示例
我们从configure
脚本中发现如下的内容:
if [ $NGX_DEBUG = YES ]; then
have=NGX_DEBUG . auto/have
fi
这里的意思就是,如果我们在configure
的时候设置了DEBUG
模式,那么就会向NGX_AUTO_CONFIG_H
头文件中增加如下代码:
#ifndef NGX_DEBUG
#define NGX_DEBUG 1
#endif
这就表明我们打开了DEBUG
模式。
auto/nohave
功能
和auto/have
的功能恰恰相反,auto/nohave
的功能如下:
如果NGX_AUTO_CONFIG_H
头文件中已经定义了一个宏,那么auto/nohave
就会通过把这个宏的值设置为0
从而取消这个宏定义。
参数
have
:宏的名称
脚本内容
cat << END >> $NGX_AUTO_CONFIG_H
#ifndef $have
#define $have 0
#endif
END
示例
在auto/modules
中有如下的代码:
if [ $HTTP != YES ]; then
have=NGX_CRYPT . auto/nohave
CRYPT_LIB=
fi
这里的判断很简单,如果HTTP
变量的值不是YES
的话,就向NGX_AUTO_CONFIG_H
文件中写入如下内容:
#ifdef HTTP
#define HTTP 0
#endif
这样,就相当于取消了HTTP
宏的定义。
auto/have_headers脚本
功能
和前面的auto/have
脚本类似,auto/have
是向NGX_AUTO_HEADERS_H
头文件中增加一个宏定义,增加的宏的值都是1
。
划重点了,它和auto_have
的不同之处在于,auto_have
是向NGX_AUTO_CONFIG_H
文件中增加的宏定义,而auto/have_headers
是向NGX_AUTO_CONFIG_H
中增加的宏定义。
参数
have
:宏的名称
脚本内容
cat << END >> $NGX_AUTO_HEADERS_H
#ifndef $have
#define $have 1
#endif
END
示例
在auto/os/linux
脚本中有如下的内容:
have=NGX_LINUX . auto/have_headers
显然这里是判断当前的操作系统类型的,如果是Linux
的话,就会向NGX_AUTO_HEADERS_H
中增加如下内容:
#ifndef NGX_LINUX
#define NGX_LINUX 1
#endif
总结
本文详细的分析了auto/define
, auto/have
, auto/nohave
三个辅助脚本的功能。下面总结一下:
auto/defnie: 定义一个宏,并且可以自定义这个宏的值。
auto/have: 如果一个宏之前没有被定义过,那么就定义该宏,并且把值设置为
1
,其实就是一个bool
标识,标识某个功能已经被打开,比如我们例子中的debug
功能。
auto/nohave: 它和
auto/have
脚本的功能恰恰相反。如果我们已经打开了某一个宏(比如nginx
默认打开的那些功能),现在我们取消这个宏的定义,也是一个bool
类型,表示我们关闭了某个功能。
auto/have_headers:
auto_have
是向NGX_AUTO_CONFIG_H
文件中增加的宏定义,而auto/have_headers
是向NGX_AUTO_CONFIG_H
中增加的宏定义,二者其他功能相同。
后面的文章我们会接着分析nginx
的其他辅助脚本,敬请期待。顺便关注我的个公众号(Nginx源码分析
)。