接上一章,此文我们来解析auto/options脚本。此脚本主要用来设定配置选项。
参看:
1) http://blog.csdn.net/poechant/article/details/7327206
2) http://man.linuxde.net/sed
1. auto/options脚本
在分析脚本之前,我们这里贴出其源代码:
(1) 变量定义
我们注意到在auto/options脚本的最开始定义了很多变量,有些设定了初始值,有些则没有。其他变量都很稀疏平常,但是我们注意到有如下一个比较特别:
则句话的含义为如果CC
变量没有定义,则CC
定义为cc;否则为CC
定义的变量值。
(2) 解析参数选项
接着在auto/options中,有如下一段:
这段实际上是处理./configure携带的参数选项,for循环每次对应一个参数选项option。要注意的是for循环体上面有一个全局的opt变量。这个循环体内第一个语句是最重要的:
它的实际作用是匹配configure的参数选项(把匹配到的第一部分作为参数1,匹配到的第二部分作为参数2)。因此,通过循环该语句后,最后opt的值就是一个由空格分隔的参数列表。参看:正则表达式括号、中括号、大括号的区别小结
接下来是:
其含义是将value赋值为参数选项值。如果该选项不符合匹配-*=*
,则将value值设置为””.
再接着是匹配各参数选项:
各匹配的分支语句中进行配置变量的赋值。这些变量在auto/options脚本的最开始处赋予默认值。其中那些模块配置变量被赋予YES
的表示默认开启,赋予NO
的表示默认关闭。但他们开启与否是由这个auto/options中的case-esac语句来决定的。
还有一些安装相关的选项变量也在这里被赋值,比如:
- prefix参数值被赋予NGX_PREFIX
- sbin-path参数值被赋予NGX_SBIN_PATH
- conf-path参数值被赋予NGX_CONF_PATH
- error-log-path参数值被赋予NGX_ERROR_LOG_PATH
- pid-path参数值被赋予NGX_PID_PATH
- lock-path参数值被赋予NGX_LOCK_PATH
如果option并不符合预设的这些匹配,也就是用户使用configure脚本的时候携带的参数错误,则auto/options会匹配该语句:
从而提示用户参数错误,并使脚本退出运行。经过多次循环,for-do-done就结束。
处理完所有option后,opt就如我们上面提到的,成为由空格分隔的配置项值,并被赋给NGX_CONFIGURE变量:
再看下面这句:
默认情况下,$help
变量值在初始化时就为no. 如果configure选项中指定了help参数,则$help
参数为yes,则会运行cat命令,显示大段的帮助信息,然后退出。
5. 是否关闭HTTP功能
默认情况下HTTP的一些基本功能是被开启的,如果用户指定了--without-http
参数,则变量HTTP会被赋值为NO,则下面这段代码会被被执行:
6.是否指定运行于Windows平台
如果显示指定了--crossbuild
参数,则变量NGX_PLATFORM会被赋予当前for-do-done循环中的$value
值,也就是--crossbuild
的参数值,一般考虑在Windows平台使用时才会用到,看下面的语句:
如果指定了--crossbuild=win32
,则NGX_WINE就会被赋值了。
7. nginx配置文件路径
在加载configure的参数时,如果没有指定--config-path
参数,则$NGX_CONF_PATH
变量是没有值的,下面的语句会为NGX_CONF_PATH赋予conf/nginx.conf的缺省值。不过觉得完全可以再auto/options开始处和其他参数一样先指定NGX_CONF_PATH的默认值。
上面如果指定参数--conf-path
=/home/michael/nginx/conf/nginx.conf,则NGX_CONF_PREFIX的值就是/home/michael/nginx/conf.
8. 错误日志文件路径
如果指定了参数--error-log-path
,则NGX_ERROR_LOG_PATH变量的值会被指定。根据下面的语句,如果指定的是stderr则将NGX_ERROR_LOG_PATH修改为空,即不需要错误日志文件。如果不是标准输出,且其值为空,则设置为缺省logs/error.log。
9. HTTP相关路径
10. Perl模块
如果指定了--with-perl_modules_path
参数,则NGX_PERL_MODULES变量被设定。如果NGX_PERL_MODULES变量未设定值或者值为一个绝对路径,那么不做任何处理;而如果指定的是一个相对路径,则最后设定为$NGX_PREFIX/$NGX_PERL_MODULES
。