Nginx编译配置脚本最终篇 - configure脚本
Posted 彼 方
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx编译配置脚本最终篇 - configure脚本相关的知识,希望对你有一定的参考价值。
nginx编译配置脚本最终篇 - configure脚本
- 1、相关文章
- 2、前言
- 3、configure脚本详解
- 3.1、设置LC_ALL宏
- 3.2、调用auto/options脚本
- 3.3、调用auto/init脚本
- 3.4、调用auto/sources脚本
- 3.5、objs/目录相关内容
- 3.6、写入NGX_DEBUG宏到objs/ngx_auto_headers.h文件
- 3.7、设置与系统相关的几个变量
- 3.8、调用auto/cc/conf脚本
- 3.9、调用auto/headers脚本
- 3.10、调用auto/os/conf脚本
- 3.11、调用auto/unix脚本
- 3.12、调用auto/threads脚本
- 3.13、调用auto/modules脚本
- 3.14、调用auto/lib/conf脚本
- 3.15、设置NGX_PREFIX相关内容
- 3.16、往objs/ngx_auto_config.h文件中写入一系列路径相关的宏
- 3.17、设置与最终生成的Makefile相关的内容
- 3.18、一些其它的配置
- 4、总结
1、相关文章
由于学习本文需要Nginx
源码及搭建相关的编译环境,且本文与前面的文章有先后呼应关系,所以建议大家按以下文章顺序阅读
- CentOS 7使用源码编译安装Nginx,以及配置使用autoindex模块
- Nginx配置编译脚本篇(1)- 解析配置选项脚本auto/options
- Nginx编译配置脚本篇(2)- Makefile初始化脚本auto/init
- Nginx编译配置脚本篇(3)- 源码相关变量脚本auto/sources
- Nginx编译配置脚本篇(4)- 工具型脚本系列
- Nginx编译配置脚本篇(5)- 编译器相关脚本
- Nginx编译配置脚本篇(6)- 系统环境相关脚本
- Nginx编译配置脚本篇(7)- UNIX环境脚本auto/unix
- Nginx编译配置脚本篇(8)- 模块配置脚本auto/modules
- Nginx编译配置脚本篇(9)- 动态库配置脚本auto/lib/conf
- Nginx编译配置脚本篇(10)- Makefile相关脚本
2、前言
通过前面的10篇文章,我们了解了Nginx
源代码auto/
目录下的各个脚本的作用,这篇文章我们将介绍configure
脚本,看看它是如何通过使用auto/
目录下的各个脚本来完成一次完整的配置的。本篇也是介绍Nginx
编译配置脚本的最后一篇文章。
3、configure脚本详解
3.1、设置LC_ALL宏
这里设置LC_ALL
是为了清除所有本地化的设置,让命令能够正确运行。具体的大家可以参考一下这篇文章《LC_ALL=C的含义》
代码如下:
LC_ALL=C
export LC_ALL
3.2、调用auto/options脚本
本节对应这篇文章《Nginx配置编译脚本篇(1)- 解析配置选项脚本auto/options》
通过调用auto/options
脚本来对初始化一些配置选项,并对我们传入脚本的参数进行处理
代码如下:
. auto/options
3.3、调用auto/init脚本
本节对应这篇文章《Nginx编译配置脚本篇(2)- Makefile初始化脚本auto/init》
通过调用auto/init
脚本来初始化部分与Makefile
相关的变量,生成源代码根目录的Makefile
文件并往其中写入部分信息
代码如下:
. auto/init
3.4、调用auto/sources脚本
本节对应这篇文章《Nginx编译配置脚本篇(3)- 源码相关变量脚本auto/sources》
通过调用auto/sources
脚本来设置与objs/Makefile
文件的源码部分相关的一些变量,这些变量将在后续会进行转换写入到objs/Makefile
文件中
代码如下:
. auto/sources
3.5、objs/目录相关内容
从前面几个脚本中我们可以知道,NGX_OBJS
的默认值为objs
,NGX_AUTO_HEADERS_H
的默认值为objs/ngx_auto_headers.h
,NGX_AUTOCONF_ERR
的默认值为objs/autoconf.err
,则下面的代码的作用就是创建objs/
目录,然后在该目录下生成ngx_auto_headers.h
(存放部分开关宏的头文件)和autoconf.err
(配置错误信息的输出文件)文件,并往ngx_auto_headers.h
写入一个宏
代码如下:
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
3.6、写入NGX_DEBUG宏到objs/ngx_auto_headers.h文件
本节对应这篇文章《Nginx编译配置脚本篇(4)- 工具型脚本系列》
这里是根据NGX_DEBUG
变量的值来选择是否写入NGX_DEBUG
宏到objs/ngx_auto_headers.h
文件中,NGX_DEBUG
这个变量是在auto/options
脚本里设置的,默认为NO
代码如下:
if [ $NGX_DEBUG = YES ]; then
have=NGX_DEBUG . auto/have
fi
3.7、设置与系统相关的几个变量
NGX_PLATFORM
这个变量是在auto/options
脚本里设置的,默认为空。可以看到当NGX_PLATFORM
为空时,通过使用uname
命令来设置NGX_SYSTEM
、NGX_RELEASE
、NGX_MACHINE
的值,最后通过这几个参数来设置NGX_PLATFORM
,该值在后面会被多次用到,基本都是判断一下当前系统是不是Windows
,然后执行一些特殊配置之类的操作
代码如下:
if test -z "$NGX_PLATFORM"; then
echo "checking for OS"
NGX_SYSTEM=`uname -s 2>/dev/null`
NGX_RELEASE=`uname -r 2>/dev/null`
NGX_MACHINE=`uname -m 2>/dev/null`
echo " + $NGX_SYSTEM $NGX_RELEASE $NGX_MACHINE"
NGX_PLATFORM="$NGX_SYSTEM:$NGX_RELEASE:$NGX_MACHINE";
case "$NGX_SYSTEM" in
MINGW32_* | MINGW64_* | MSYS_*)
NGX_PLATFORM=win32
;;
esac
else
echo "building for $NGX_PLATFORM"
NGX_SYSTEM=$NGX_PLATFORM
fi
3.8、调用auto/cc/conf脚本
本节对应这篇文章《Nginx编译配置脚本篇(5)- 编译器相关脚本》
这里通过调用auto/cc/conf
脚本来设置编译器相关的信息
代码如下:
. auto/cc/conf
3.9、调用auto/headers脚本
本节对应这篇文章《Nginx编译配置脚本篇(4)- 工具型脚本系列》
代码如下:
if [ "$NGX_PLATFORM" != win32 ]; then
. auto/headers
fi
auto/headers
这个脚本之前没有讲过,里面的内容如下,可以看到里面又调用了auto/include
脚本
ngx_include="unistd.h"; . auto/include
ngx_include="inttypes.h"; . auto/include
ngx_include="limits.h"; . auto/include
ngx_include="sys/filio.h"; . auto/include
ngx_include="sys/param.h"; . auto/include
ngx_include="sys/mount.h"; . auto/include
ngx_include="sys/statvfs.h"; . auto/include
ngx_include="crypt.h"; . auto/include
auto/include
脚本的内容如下:
echo $ngx_n "checking for $ngx_include ...$ngx_c"
cat << END >> $NGX_AUTOCONF_ERR
----------------------------------------
checking for $ngx_include
END
ngx_found=no
cat << END > $NGX_AUTOTEST.c
$NGX_INCLUDE_SYS_PARAM_H
#include <$ngx_include>
int main(void) {
return 0;
}
END
ngx_test="$CC -o $NGX_AUTOTEST $NGX_AUTOTEST.c"
eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1"
if [ -x $NGX_AUTOTEST ]; then
ngx_found=yes
echo " found"
ngx_name=`echo $ngx_include \\
| tr abcdefghijklmnopqrstuvwxyz/. ABCDEFGHIJKLMNOPQRSTUVWXYZ__`
have=NGX_HAVE_$ngx_name . auto/have_headers
eval "NGX_INCLUDE_$ngx_name='#include <$ngx_include>'"
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
rm -rf $NGX_AUTOTEST*
可以看到这个脚本和auto/feature
比较像,也是生成一个测试文件,只不过这个比较简单一点,只是测试当前环境是否可以使用ngx_include
这个变量对应头文件,不行的话也是往objs/autoconf.err
写入错误信息,行的话就使用auto/have_headers
脚本往objs/ngx_auto_headers.h
文件中写入相关的宏
3.10、调用auto/os/conf脚本
本节对应这篇文章《Nginx编译配置脚本篇(6)- 系统环境相关脚本》
这里通过调用auto/os/conf
脚本来设置系统环境相关的信息
代码如下:
. auto/os/conf
3.11、调用auto/unix脚本
本节对应这篇文章《Nginx编译配置脚本篇(7)- UNIX环境脚本auto/unix》
这里通过调用auto/unix
脚本来配置UNIX
环境下的一些信息,下面的判断语句也是表明了在Windows
下配置是不会调用该脚本的
代码如下:
if [ "$NGX_PLATFORM" != win32 ]; then
. auto/unix
fi
3.12、调用auto/threads脚本
代码如下:
. auto/threads
这里调用auto/threads
脚本来设置与多线程相关的信息,auto/threads
内容如下:
if [ $USE_THREADS = YES ]; then
if [ "$NGX_PLATFORM" = win32 ]; then
cat << END
$0: --with-threads is not supported on Windows
END
exit 1
fi
have=NGX_THREADS . auto/have
CORE_DEPS="$CORE_DEPS $THREAD_POOL_DEPS"
CORE_SRCS="$CORE_SRCS $THREAD_POOL_SRCS"
CORE_LIBS="$CORE_LIBS -lpthread"
NGX_LIBPTHREAD="-lpthread"
fi
可以看到USE_THREADS
的值必须是YES
才会生效,并且Windows
下不允许设置这个。里面做的工作比较简单,将相关的宏、动态库信息添加到对应的变量中而已
3.13、调用auto/modules脚本
本节对应这篇文章《Nginx编译配置脚本篇(8)- 模块配置脚本auto/modules》
这里通过调用auto/modules
脚本来设置与模块相关的内容
代码如下:
. auto/modules
3.14、调用auto/lib/conf脚本
本节对应这篇文章《Nginx编译配置脚本篇(9)- 动态库配置脚本auto/lib/conf》
这里通过调用auto/lib/conf
脚本来设置与动态库相关的内容
代码如下:
. auto/lib/conf
3.15、设置NGX_PREFIX相关内容
这里是设置NGX_PREFIX
变量相关的内容,我们知道这个变量存储的值是我们最后Nginx
的安装路径,且这个值默认为空,当它为空时就在这里给他设置一个默认值/usr/local/nginx
,然后将NGX_PREFIX
写入objs/ngx_auto_config.h
文件中,宏的内容就是NGX_PREFIX
变量对应的值,也就是安装路径
代码如下:
case ".$NGX_PREFIX" in
.)
NGX_PREFIX=${NGX_PREFIX:-/usr/local/nginx}
have=NGX_PREFIX value="\\"$NGX_PREFIX/\\"" . auto/define
;;
.!)
NGX_PREFIX=
;;
*)
have=NGX_PREFIX value="\\"$NGX_PREFIX/\\"" . auto/define
;;
esac
3.16、往objs/ngx_auto_config.h文件中写入一系列路径相关的宏
可以看到这里往objs/ngx_auto_config.h
写入了各个路径相关的宏,这些变量的值都是在前面设置的
代码如下:
if [ ".$NGX_CONF_PREFIX" != "." ]; then
have=NGX_CONF_PREFIX value="\\"$NGX_CONF_PREFIX/\\"" . auto/define
fi
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
have=NGX_LOCK_PATH value="\\"$NGX_LOCK_PATH\\"" . auto/define
have=NGX_ERROR_LOG_PATH value="\\"$NGX_ERROR_LOG_PATH\\"" . auto/define
have=NGX_HTTP_LOG_PATH value="\\"$NGX_HTTP_LOG_PATH\\"" . auto/define
have=NGX_HTTP_CLIENT_TEMP_PATH value="\\"$NGX_HTTP_CLIENT_TEMP_PATH\\""
. auto/define
have=NGX_HTTP_PROXY_TEMP_PATH value="\\"$NGX_HTTP_PROXY_TEMP_PATH\\""
. auto/define
have=NGX_HTTP_FASTCGI_TEMP_PATH value="\\"$NGX_HTTP_FASTCGI_TEMP_PATH\\""
. auto/define
have=NGX_HTTP_UWSGI_TEMP_PATH value="\\"$NGX_HTTP_UWSGI_TEMP_PATH\\""
. auto/define
have=NGX_HTTP_SCGI_TEMP_PATH value="\\"$NGX_HTTP_SCGI_TEMP_PATH\\""
. auto/define
3.17、设置与最终生成的Makefile相关的内容
本节对应这篇文章《Nginx编译配置脚本篇(10)- Makefile相关脚本》
这里通过调用auto/make
、auto/lib/make
、auto/install
这三个脚本来补充Makefile
和objs/Makefile
里面的内容(因为这两个文件前面已经生成了,这里就是往里面增加内容来使其更加完整)
代码如下:
. auto/make
. auto/lib/make
. auto/install
3.18、一些其它的配置
这部分内容比较简单,没什么可讲的,auto/stubs
脚本就是写两个宏而已,auto/summary
里面就是输出一些编译信息而已,有兴趣的读者可以自行去看一下这两个脚本的内容
代码如下:
. auto/stubs
have=NGX_USER value="\\"$NGX_USER\\"" . auto/define
have=NGX_GROUP value="\\"$NGX_GROUP\\"" . auto/define
if [ ".$NGX_BUILD" != "." ]; then
have=NGX_BUILD value="\\"$NGX_BUILD\\"" . auto/define
fi
. auto/summary
4、总结
关于Nginx
编译配置脚本的内容到这里也就全部讲完了,全部看完之后就会发现其实里面并没有多么复杂的设计,可能最难的就是那几个sed
相关的正则了吧。从这些脚本中我们可以学习到make
和Shell
相关的一些知识,虽然对于开发来说这些可能确实是用处不大,但是秉着知其所以然的理念了解一下这些知识也是挺不错的。
最后,如果大佬们觉得我写的这些文章对你们有帮助的话,可以关注一下我或者我的专栏,以后会有更多有价值的文章输出的。
以上是关于Nginx编译配置脚本最终篇 - configure脚本的主要内容,如果未能解决你的问题,请参考以下文章
Nginx编译配置脚本篇- 动态库配置脚本auto/lib/conf