Nginx编译配置脚本最终篇 - configure脚本

Posted 彼 方

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx编译配置脚本最终篇 - configure脚本相关的知识,希望对你有一定的参考价值。

1、相关文章

由于学习本文需要Nginx源码及搭建相关的编译环境,且本文与前面的文章有先后呼应关系,所以建议大家按以下文章顺序阅读

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的默认值为objsNGX_AUTO_HEADERS_H的默认值为objs/ngx_auto_headers.hNGX_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_SYSTEMNGX_RELEASENGX_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/makeauto/lib/makeauto/install这三个脚本来补充Makefileobjs/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相关的正则了吧。从这些脚本中我们可以学习到makeShell相关的一些知识,虽然对于开发来说这些可能确实是用处不大,但是秉着知其所以然的理念了解一下这些知识也是挺不错的。

最后,如果大佬们觉得我写的这些文章对你们有帮助的话,可以关注一下我或者我的专栏,以后会有更多有价值的文章输出的。

以上是关于Nginx编译配置脚本最终篇 - configure脚本的主要内容,如果未能解决你的问题,请参考以下文章

Nginx编译配置脚本篇- 编译器相关脚本

Nginx编译配置脚本篇- 动态库配置脚本auto/lib/conf

Nginx编译配置脚本篇- 工具型脚本系列

Nginx编译配置脚本篇(10)- Makefile相关脚本

Nginx编译配置脚本篇- 系统环境相关脚本

Nginx编译配置脚本篇- 模块配置脚本auto/modules