解剖Nginx·自动脚本篇(4)工具型脚本系列
目录
- auto/have 向自动配置头文件追加可用宏定义(
objs/ngx_auto_config.h) - auto/nohave 向自动配置头文件追加不可用宏定义(
objs/ngx_auto_config.h) - auto/define 向自动配置脚本追加 K-V 宏定义(
objs/ngx_auto_config.h),表示“设置了 K,其值为 V” - auto/have_headers 向自动头头文件(
objs/ngx_auto_header.h) - auto/feature
- auto/types/sizeof 生成测试程序并检测指定类型的大小
- auto/types/typedef
- auto/types/value
1 auto/have
- 主要功能:向自动配置头文件中标示有指定的参数的宏定义。
- 处理变量:
$have 作用对象:
- 作用对象:
$NGX_AUTO_CONFIG_H变量所表示的自动生成头文件。 - 默认对象:
objs/ngx_auto_config.h
cat << END >> $NGX_AUTO_CONFIG_H
#ifndef $have
#define $have 1
#endif
END
- 作用对象:
示例:
如果have值为SOME_FLAG,则引用该脚本而运行后,objs/ngx_auto_config.h中将追加如下内容:
#ifndef SOME_FLAG
#define SOME_FLAG 1
#endif
2 auto/nohave
与auto/have脚本类似。
- 主要功能:向自动配置头文件中标示没有指定的参数的宏定义。
- 处理变量:
$have 作用对象:
- 作用对象:
$NGX_AUTO_CONFIG_H变量所表示的自动生成头文件。 - 默认对象:
objs/ngx_auto_config.h
cat << END >> $NGX_AUTO_CONFIG_H
#ifndef $have
#define $have 0
#endif
END
- 作用对象:
示例:
如果have值为SOME_FLAG,则引用该脚本而运行后,objs/ngx_auto_config.h中将追加如下内容:
#ifndef SOME_FLAG
#define SOME_FLAG 0
#endif
3 auto/define
- 主要功能:向自动配置头文件中标示指定参数的值
- 处理变量:
have和value 作用对象:
- 作用对象:
$NGX_AUTO_CONFIG_H变量所表示的自动生成头文件。 - 默认对象:
objs/ngx_auto_config.h
cat << END >> $NGX_AUTO_CONFIG_H
#ifndef $have
#define $have $value
#endif
END
- 作用对象:
示例:
如果have值为SOME_FLAG,value值为1234,则引用该脚本而运行后,objs/ngx_auto_config.h中将追加如下内容:
#ifndef SOME_FLAG
#define SOME_FLAG 1234
#endif
4 auto/have_headers
- 主要功能:向自动头头文件中标示指定参数存在
- 处理变量:
have和value 作用对象:
- 作用对象:
$NGX_AUTO_HEADERS_H变量所表示的自动生成头文件。 - 默认对象:
objs/ngx_auto_headers.h
cat << END >> $NGX_AUTO_HEADERS_H
#ifndef $have
#define $have 1
#endif
END
- 作用对象:
注意:
auto/have_headers与auto/have的不同,前者是向objs/ngx_auto_config.h写,后者是向objs/ngx_auto_headers.h写。
5 auto/feature
- 主要功能:
- 处理变量:
$ngx_n$ngx_feature$ngx_cngx_feature_name$ngx_feature_path$ngx_feature_inc_path$ngx_temp$ngx_feature_incs$ngx_feature_test$ngx_feature_libs$ngx_have_feature
- 作用对象:
- 作用对象:
- 默认对象:
5.1 输出检查提示
还记得在《精读Nginx源码·自动脚本篇(2)设置初始变量脚本 auto/init》一文中关于ngx_n和ngx_c两个变量吗?在auto/feature中的第一句是:
echo $ngx_n "checking for $ngx_feature ...$ngx_c"
就是echo一句checking for $ngx_feature,然后换行。当然存在ngx_n和ngx_c都为空的情况,这时真就没有主动换行了。
然后向NGX_AUTOCONF_ERR表示的文件添加自动配置错误信息。该文件是在auto/init文件中初始化的(参见《精读Nginx源码·自动脚本篇(2)设置初始变量脚本 auto/init》),其值为NGX_AUTOCONF_ERR=$NGX_OBJS/autoconf.err,默认情况下为objs/autoconf.err。
5.2 初始化ngx_found
ngx_found=no
5.3 初始化ngx_have_feature
if test -n "$ngx_feature_name"; then
ngx_have_feature=`echo $ngx_feature_name \
| tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`
fi
test -n是测试参数的长度是否为 0。那么如果ngx_feature_name为空,则不会执行if内的语句,否则将把ngx_have_feature命名为ngx_feature_name的大写版(tr命令将小写全部改为大写)。
5.4 初始化ngx_feature_inc_path
if test -n "$ngx_feature_path"; then
for ngx_temp in $ngx_feature_path; do
ngx_feature_inc_path="$ngx_feature_inc_path -I $ngx_temp"
done
fi
test -n是测试参数的长度是否为 0。如果ngx_feature_path为/path/to/one /path/to/two /path/to/three,则ngx_feature_inc_path将被置为-I /path/to/one -I /path/to/two -I /path/to/three。
5.5 生成自动测试程序
自动测试源码文件是在auto/init脚本中初始化为$NGX_OBJS/autotest的,默认为objs/autotest。加上后缀名则为objs/autotest.c
cat << END > $NGX_AUTOTEST.c
#include <sys/types.h>
$NGX_INCLUDE_UNISTD_H
$ngx_feature_incs
int main() {
$ngx_feature_test;
return 0;
}
END
其中ngx_feature_incs和ngx_feature_test算是auto/feature脚本的参数。
5.6 编译自动测试程序
CC是在脚本auto/options中初始化的, 为CC=${CC:-gcc}。该段代码的功能是生成编译命令。
ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS $ngx_feature_inc_path \
-o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_TEST_LD_OPT $ngx_feature_libs"
ngx_feature_inc_path=
运行测试程序。
eval "/bin/sh -c \"$ngx_test\" >> $NGX_AUTOCONF_ERR 2>&1"
5.7 根据ngx_feature_run处理
这一段稍长,下面逐步解释:
Bash 编程中所有布尔表达式都是用中括号括起来的。-x参数表示Test if file exists and is executable。所以如果NGX_AUTOTEST表示的文件存在则执行then。
if [ -x $NGX_AUTOTEST ]; then
case "$ngx_feature_run" in
如果ngx_feature_run的值为yes,由于-c,则将NGX_AUTOTEST文件的内容当做命令执行,其输出到标准输出及错误输出的结果都被重定向到NGX_AUTOCONF_ERR中。
yes)
# /bin/sh is used to intercept "Killed" or "Abort trap" messages
if /bin/sh -c $NGX_AUTOTEST >> $NGX_AUTOCONF_ERR 2>&1; then
echo " found"
ngx_found=yes
如果ngx_feature_name长度不为零,则have设置为$ngx_have_feature的值,并引用auto/have脚本向objs/ngx_auto_config.h写入宏定义。
if test -n "$ngx_feature_name"; then
have=$ngx_have_feature . auto/have
fi
如果NGX_AUTOTEST表示的值为空或者表示的命令执行错误,则执行else:
else
echo " found but is not working"
fi
;;
如果ngx_feature_run的值为value,则执行NGX_AUTOTEST所表示的命令。
value)
# /bin/sh is used to intercept "Killed" or "Abort trap" messages
if /bin/sh -c $NGX_AUTOTEST >> $NGX_AUTOCONF_ERR 2>&1; then
echo " found"
ngx_found=yes
想objs/ngx_auto_config.h文件写入:
cat << END >> $NGX_AUTO_CONFIG_H
#ifndef $ngx_feature_name
#define $ngx_feature_name `$NGX_AUTOTEST`
#endif
END
else
echo " found but is not working"
fi
;;
如果ngx_feature_run是bug,则与上一种情况类似。
bug)
# /bin/sh is used to intercept "Killed" or "Abort trap" messages
if /bin/sh -c $NGX_AUTOTEST >> $NGX_AUTOCONF_ERR 2>&1; then
echo " not found"
else
echo " found"
ngx_found=yes
if test -n "$ngx_feature_name"; then
have=$ngx_have_feature . auto/have
fi
fi
;;
如果是其他情况,则若ngx_feature_name不为空则将ngx_have_feature相关的宏写入objs/ngx_auto_config.h职工。
*)
echo " found"
ngx_found=yes
if test -n "$ngx_feature_name"; then
have=$ngx_have_feature . auto/have
fi
;;
esac
如果NGX_AUTOTEST表示的文件不存在或不可执行,则执行下面的else中的几句echo。
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
5.8 删除NGX_AUTOSET测试程序可执行文件
rm $NGX_AUTOTEST*
解剖Nginx·自动脚本篇(4)工具型脚本系列的更多相关文章
- 解剖Nginx·自动脚本篇(5)编译器相关主脚本
在 Nginx 的自动脚本中,auto/cc目录下的所有脚本都是用于编译器相关配置使用的.Nginx的出色跨平台性(Linux.Darwin.Solaris.Win32 等)就有这些脚本的贡献.该目录 ...
- 解剖Nginx·自动脚本篇(3)源码相关变量脚本 auto/sources
在configure脚本中,运行完auto/options和auto/init脚本后,接下来就运行auto/soures脚本.这个脚本是为编译做准备的. 目录 核心模块 事件模块 OpenSSL 模块 ...
- 解剖Nginx·自动脚本篇(2)设置初始变量脚本 auto/init
在configure中运行完auto/options脚本后,接着运行auto/init脚本,其中所做的工作如下. 1 Makefile文件名变量 默认情况下是: objs/Makefile 代码如下: ...
- 解剖Nginx·自动脚本篇(1)解析配置选项脚本 auto/options
在安装Nginx之前(即运行make脚本之前),首先是进行安装的配置准备,包括环境检查及生成文件.这些工作是由自动脚本完成的.和绝大多数软件一样,Nginx的自动脚本的入口,同样是名为configur ...
- 解剖Nginx·自动脚本篇(6)编译器名称变量脚本 auto/cc/name
回顾变量 CC 最初是在auto/options脚本中初始化的: CC=${CC:-gcc} 1 C Compiler 的 feature Windows 平台的编译器叫做MSVC,其他平台的都统称为 ...
- 解剖Nginx·自动脚本篇(7)类型相关脚本系列
1 auto/types/sizeof 该脚本的功能,是通过测试程序获知给定的ngx_type的大小. 1.1 显示提示信息 echo $ngx_n "checking for $ngx_t ...
- 解剖Nginx·模块开发篇(2)ngx_http_hello_world_module 模块基本结构定义
elloWorld 是一个典型的 location 模块.什么是 location 模块?在 Nginx 中,根据作用域,有 main 模块.server 模块.location 模块. 1 模块定义 ...
- 解剖Nginx·模块开发篇(1)跑起你的 Hello World 模块!
1 学习 Nginx 模块开发需要有哪些准备? 需要的预备知识不多,有如下几点: 有过一些 C 语言的编程经历: 知道 Nginx 是干嘛的,并有过编写或改写 Nginx 的配置文件的经历. OK,就 ...
- 解剖Nginx·模块开发篇(5)解读内置非默认模块 ngx_http_stub_status_module
1 Background ngx_http_stub_status_module 是一个 Nginx 的内置 HTTP 模块,该模块可以提供 Nginx 的状态信息.默认情况下这个模块是不被编译进来的 ...
随机推荐
- 原生 Javascript 编写五子棋
原文地址:原生 Javascript 编写五子棋 博客地址:http://www.extlight.com 一.背景 近一个月没写 Javascript 代码,有点生疏.正好浏览网页时弹出五子棋的游戏 ...
- Linux VPS上DenyHosts阻止SSH暴力攻击
2009年07月23日 下午 | 作者:VPS侦探 现在的互联网非常不安全,很多人没事就拿一些扫描机扫描ssh端口,然后试图连接ssh端口进行暴力破解(穷举扫描),所以建议vps主机的空间,尽量设置复 ...
- 在64位的UBUBTU 服务器 ***
前言: 安装/重装系统,U盘启动盘不稳定,建议使用USB-CDROM启动 如果是重装系统,要记录好硬盘的信息和职能: fdisk -l lsblk blkid /etc/fstab mkfs.ext3 ...
- (转)jdbc 调用 sql server 的存储过程时“该语句没有返回结果集”的解决方法
本文转载自:http://hedyn.iteye.com/blog/856040 在JDBC中调用SQL Server中的存储过程时出现如下异常: com.microsoft.sqlserver.jd ...
- rtmp 推送h264 + aac 的数据
相关源码下载: http://download.csdn.net/detail/keepingstudying/8340431 需要libfaac,librtmp 的支持, 1.帧的划分 1.1 H. ...
- struts2学习(5)拦截器简介以及例子执行过程
一.拦截器简介: 二.Struts2预定义拦截器&拦截器栈 在执行action之前和之后,拦截器进行了操作: 比如struts-default.xml中就有很多预定义的拦截器: 拦截器栈: ...
- spring扩展点之一:BeanFactoryPostProcessor和BeanPostProcessor
一.BeanFactoryPostProcessor和BeanPostProcessor的区别 BeanFactoryPostProcessor和BeanPostProcessor都是spring初始 ...
- js中Number()、parseInt()和parseFloat()的区别
一:Number() 如果是Boolean值,true和false值将分别被转换为1和0. 如果是数字值,只是简单的传入和返回. 如果是null值,返回0. 如果是undefined,返回NaN. 如 ...
- 新浪微博Oauth2.0授权 获取Access Token
新浪微博开放平台提供了丰富的API接口,利用这些接口,开发者能够开发出独具特色的微博应用.但是,大部分接口都需要用户授权给应用,应用利用授权得到的Access Token来调用相应的接口来获取内容. ...
- 完美解决 开机无法启动 提示0xc000000e
注:昨天装系统碰到这个问题,这个方法说的较详细,我的是WIN7系统,开机提示引导文件错误,代码为0xc000000e 无法进入系统,使用PE进入后,在运行里输入CMD,然后按下文红字开始操作 完美解决 ...