configure分析之 auto/options脚本

微信公众号:郑尔多斯
关注可了解更多的Nginx知识。任何问题或建议,请公众号留言;
关注公众号,有趣有内涵的文章第一时间送达!

开篇

nginxconfigure脚本在编译nginx的过程中是非常重要的,它完成了各个编译参数的配置,路径的配置等功能。从本文开始,分析一下configure脚本的工作过程。
首先,我们看一下configure脚本的构成,如下图所示:
congifure脚本概览
我们会分析每个过程,从而详细理解configure过程中到底发生了什么。

脚本分析

我们先看一下configure脚本的源码,如下:

################## nginx/auto/configure  #######################

//执行auto/options文件中的命令,行中的“.”表示在当前的sh环境中执行auto/options
//文件中的命令(与source命令效果一样)不同于sh命令会导致创建子进程,由于configure
//文件中命令与options的命令都在同一sh环境下,所以变量在两个文件中都是彼此可见的
. auto/options     //置变量,并将之置空
. auto/init          //初始化一些变量诸如:NGX_AUTO_HEADERS_H=$NGX_OBJS/ngx_auto_headers.h
. auto/sources     //设置核心模块、平台代码对应的源文件
  
test -d $NGX_OBJS || mkdir -p $NGX_OBJS
  
echo > $NGX_AUTO_HEADERS_H
echo > $NGX_AUTOCONF_ERR
  
echo "#define NGX_CONFIGURE \"$NGX_CONFIGURE\"" > $NGX_AUTO_CONFIG_H
  
if [ $NGX_DEBUG = YES ]; then
    have=NGX_DEBUG . auto/have     #设置NGX_DEBUG=1
fi
  
.....
  
. auto/cc/conf     //检查编译器相关选项
  
if [ "$NGX_PLATFORM" != win32 ]; then
    . auto/headers     //检查相关头文件,并将结果输出到ngx_auto_headers.h文件中
fi
  
. auto/os/conf     //检查系统平台所需的函数
  
if [ "$NGX_PLATFORM" != win32 ]; then
    . auto/unix     #检查unix环境下一些文件、函数
fi    
  
. auto/threads
  
//统计要编译到nginx中的模块信息,创建并初始化ngx_module_t *ngx_modules[]和
//char *ngx_module_names[]两个数组中(这两个数组在init_cycle中被调用)存放
//到之前创建的nginx/objs/ngx_modules.c文件中
. auto/modules    
. auto/lib/conf
  
.......
  
//定义变量NGX_SBIN_PATH的值为"\"$NGX_SBIN_PATH\""
have=NGX_SBIN_PATH value="\"$NGX_SBIN_PATH\"" . auto/define  
have=NGX_CONF_PATH value="\"$NGX_CONF_PATH\"" . auto/define
have=NGX_PID_PATH value="\"$NGX_PID_PATH\"" . auto/define

auto/options脚本

从上面可以看出来,configure调用了 auto/options 脚本,从名字可以看出来,这个脚本的作用就是处理传递给 configure脚本的各个参数,比如 ./configure --with-http_gzip_static_module --prefix=/usr/nginx/ ,那么 auto/option 脚本就会处理 configure后面的参数,本节我们就分析一下这个脚本的具体作用。

该文件的开始部分是初始化一些变量,没啥可以分析的。最重要的部分就是下面的for循环部分,这部分负责处理configure的配置参数。我们着重分析这部分代码:

// for 后面只有变量的时候,相当于 for var in $*,即相当于把传给文件的所有参数都传了过去
for option
do
    opt="$opt `echo $option | sed -e \"s/\(--[^=]*=\)\(.* .*\)/\1'\2'/\"`"
 
    case "$option" in
// 这里会判断如果 $option是以"-"开头,并且中间有"="的话,
// 比如例子中的 --prefix=/usr/nginx/,那么sed命令会把等号"="之前的所有字符都替换为空,
// 然后剩下的部分赋值给 value变量。所以上面的语句最后value=/usr/nginx/
        -*=*) value=`echo "$option" | sed -e 's/[-_a-zA-Z0-9]*=//'` ;;
           *) value="" ;;
    esac
 // 这里根据 $option 的值来进行不同的判断,我们例子中的
// 选项会触发下面的 --prefix=* 以及 --with-http_gzip_static_module,
// 从而分别设置不同的变量,这些变量在后面会使用
    case "$option" in
        --help)                          help=yes                   ;;
 
        --prefix=)                       NGX_PREFIX="!"             ;;
        --prefix=*)                      NGX_PREFIX="$value"        ;;
        --with-http_gzip_static_module)  HTTP_GZIP_STATIC=YES       ;;
        *)
            echo "$0: error: invalid option \"$option\""
            exit 1
        ;;
    esac
done

然后,auto/options 后面紧跟着的脚本是输出帮助信息的,如果我们执行 ./configure --help,那么 help变量就会被设置为yes,那么就会执行下面的输出信息,纯文本输出,没有什么可说的。

然后接着:

if [ $HTTP = NO ]; then
    HTTP_CHARSET=NO
    HTTP_GZIP=NO
    HTTP_SSI=NO
    HTTP_USERID=NO
    HTTP_ACCESS=NO
    HTTP_STATUS=NO
    HTTP_REWRITE=NO
    HTTP_PROXY=NO
    HTTP_FASTCGI=NO
fi

这里会根据 HTTP 变量的值进行一些初始化操作,当我们在执行configure脚本的时候,若传递的参数是 --without-http,那么 HTTP变量就会设置为 NO,那么就执行上面的一些初始化代码,但是我并没有发现有人用过这个选项。我们使用nginx就是作为一个HTTP服务器的,为啥要 --without-http呢?难道是作为邮件服务器吗?

剩下的部分内容就是一些变量的初始化了,很简单,大家看一下就明白。
后续的文章会分析其他文件的代码,敬请关注

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值