我们在分析configure脚本的过程中,发现里面定义了很多工具型的脚本。这里我们统一的来讲述一下nginx工具型脚本。
参看:http://blog.csdn.net/poechant/article/details/7347046
1. auto/have脚本
脚本内容如下:
(1) 主要功能
向自动配置头文件中标示有指定的参数的宏定义。
(2) 作用对象
$NGX_AUTO_CONFIG_H
变量所表示的自动生成头文件,默认为objs/ngx_auto_config.h
(3) 示例
如果have值为SOME_FLAG
,则引用该脚本而运行后,objs/ngx_auto_config.h头文件中将追加如下内容:
2. auto/nohave脚本
与auto/have类似,这里就不做进一步介绍:
(1) 主要功能
向自动配置头文件中标示没有指定的参数的宏定义。
(2) 作用对象
$NGX_AUTO_CONFIG_H
变量所表示的自动生成头文件,默认为objs/ngx_auto_config.h
(3) 示例
如果have值为SOME_FLAG
,则引用该脚本而运行后,objs/ngx_auto_config.h头文件中将追加如下内容:
3. auto/define脚本
脚本内容如下:
(1) 主要功能
向自动配置头文件中标示指定参数的值.
(2) 作用对象
$NGX_AUTO_CONFIG_H
变量所表示的自动生成头文件,默认为objs/ngx_auto_config.h
(3) 示例
如果have值为SOME_FLAG
,value值为1234,则引用该脚本而运行后,objs/ngx_auto_config.h头文件中将追加如下内容:
脚本内容如下:
(1) 主要功能
向自动头文件中标示指定参数存在.
(2) 作用对象
$NGX_AUTO_HEADERS_H
变量所表示的自动生成头文件,默认为objs/ngx_auto_headers.h。
(注:与auto/have的不同主要在于此)
(3) 示例
如果have值为SOME_HEADER
,则引用该脚本而运行后,objs/ngx_auto_headers.h头文件中将追加如下内容:
5. auto/feature脚本
脚本内容如下:
5.1 脚本分析
我们首先来分析一下整个脚本的工作过程。
(1) 格式化提示信息
还记得我们在auto/init脚本分析
的文章中介绍过ngx_n和ngx_c两个变量,其实主要是防止换行。 在auto/feature中有如下:
其实就是打印出一句: checking for $ngx_feature
…,然后换行。当然存在$ngx_n
和$ngx_c
都为空的情况,此时就真的会换行了。
(2) 文件中生成信息提示
然后向NGX_AUTOCONF_ERR
表示的文件添加自动配置错误信息。该文件是在auto/init文件中初始化的,其值为:
NGX_AUTOCONF_ERR=$NGX_OBJS/autoconf.err
默认情况下为objs/autoconf.err
(3) 初始化相关变量
上述首先初始化ngx_found为no; 接着判断$ngx_feature_name
长度是否为0,不为0的话则将$ngx_feature_name
转换成大写保存在ngx_have_feature变量中; 接着再判断$ngx_feature_path
长度是否为0,不为0的话则在$ngx_feature_path
中的每一个路径前加上 -I 选项,将结果保存在ngx_feature_inc_path变量中。
(4) 生成feature测试程序
$NGX_AUTOTEST
是在auto/init脚本中初始化为$NGX_OBJS/autotest
的,默认为objs/autotest。加上后缀名则为objs/autotest.c。
其中$ngx_feature_incs
和 $ngx_feature_test
都算是auto/feature脚本的参数。
$NGX_INCLUDE_UNISTD_H
似乎没有地方定义
(5) 编译feature测试程序
首先ngx_test变量保存编译命令,然后再执行eval,使用ngx_test变量保存的编译命令编译feature测试程序,并将编译输出写到$NGX_AUTOCONF_ERR
中。
上述eval命令中首先将标准输出(stdout)重定向到了$NGX_AUTOCONF_ERR
文件中,接着将标准错误(stderr)重定向到了标准输出(stdout), 因此最后标准错误也会重定向到$NGX_AUTOCONF_ERR
文件中。
ngx_test编译命令中:$CC_TEST_FLAGS
、$CC_AUX_FLAGS
、$NGX_TEST_LD_OPT
一般与编译器相关,我们后续会介绍。
(6) 执行测试程序
首先判断$NGX_AUTOTEST
(即autotest)文件是否存在并且是可执行的,根据条件是否成立分如下两种情况:
I ) 文件存在且可执行
根据$ngx_feature_run的值不同又可以分成如下几种情况:
执行如下指令:
执行$NGX_AUTOTEST
(即autotest),然后将标准输出以及标准错误都写到autoconf.err中。如果执行autotest返回成功,且$ngx_feature_name
长度不为0,则调用auto/have脚本向ngx_auto_config.h头文件写入$ngx_have_feature
特征; 如果执行autotest失败,则打印相应的提示。
执行如下指令:
执行$NGX_AUTOTEST
(即autotest),然后将标准输出以及标准错误都写到autoconf.err中。如果执行autotest返回成功,则向 ngx_auto_config.h头文件中写入$ngx_feature_name
宏定义,该宏定义的值为执行autotest的结果。
执行如下指令:
看到与$ngx_feature_run值为yes
刚好相反。
执行如下指令:
直接不执行$NGX_AUTOTEST
,判断$ngx_feature_name
长度是否为0,如果非0则调用auto/have脚本向ngx_auto_config.h头文件中写入$ngx_have_feature
特征。
II ) 文件不存在或不可执行
执行如下部分,将相应信息写到$NGX_AUTOCONF_ERR
(即autoconf.err)文件中:
5.2 主要功能
auto/feature脚本主要用于检测当前系统是否具有某项特性,如果有相应的特性,则通过ngx_found=yes返回,否则通过ngx_found=no返回。
5.3 处理变量
主要处理的变量有:
5.4 示例
(1) 测试当前系统是否具有-pipe特性
(2) 检查当前编译器是否支持gcc可变参数宏
5.5 删除测试程序
执行如下命令删除测试程序: