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

Posted 彼方丶

tags:

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

1、相关文章

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

2、前言

Nginx的编译是需要依赖一些第三方库的,比如说opensslzlib等等,本文将介绍Nginx是如何使用脚本文件去配置这些第三方库的引用信息的。

3、auto/lib/conf脚本文件详解

代码如下:

if [ $USE_PCRE = YES -o $PCRE != NONE ]; then
    . auto/lib/pcre/conf

else
    if [ $USE_PCRE = DISABLED -a $HTTP = YES -a $HTTP_REWRITE = YES ]; then

cat << END

$0: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option or you have to enable the PCRE support.

END
        exit 1
    fi
fi


if [ $USE_OPENSSL = YES ]; then
    . auto/lib/openssl/conf
fi

if [ $USE_ZLIB = YES ]; then
    . auto/lib/zlib/conf
fi

if [ $USE_LIBXSLT != NO ]; then
    . auto/lib/libxslt/conf
fi

if [ $USE_LIBGD != NO ]; then
    . auto/lib/libgd/conf
fi

if [ $USE_PERL != NO ]; then
    . auto/lib/perl/conf
fi

if [ $USE_GEOIP != NO ]; then
    . auto/lib/geoip/conf
fi

if [ $NGX_GOOGLE_PERFTOOLS = YES ]; then
    . auto/lib/google-perftools/conf
fi

if [ $NGX_LIBATOMIC != NO ]; then
    . auto/lib/libatomic/conf
fi

从代码中可以看出以下几点信息:

  • 该脚本是一个整合的脚本,其本身不做什么处理,而是根据条件去调用对应的脚本文件(auto/lib/目录下的每一个子目录表示一个动态库)
  • auto/lib/conf脚本里面用到的那些作为判断条件的变量,例如USE_PCREUSE_OPENSSLUSE_ZLIB等等,都是在auto/modules里面设置的,建议没看过这篇文章 Nginx编译配置脚本篇(8)- 模块配置脚本auto/modules 的读者倒回去看一下
  • 由于各个动态库的配置过程大致相同,下面就以auto/lib/openssl/conf为例去讲解一下配置过程,其它的读者可以自行查阅源码

4、auto/lib/openssl/conf脚本文件详解

4.1、OPENSSL的值不为NONE的情况

从这篇文章 Nginx配置编译脚本篇(1)- 解析配置选项脚本auto/options 可以知道,OPENSSL的值是根据我们传入脚本的参数来设置的,默认为NONE
代码如下:

if [ $OPENSSL != NONE ]; then

    case "$CC" in

        cl | bcc32)
            have=NGX_OPENSSL . auto/have
            have=NGX_SSL . auto/have

            CFLAGS="$CFLAGS -DNO_SYS_TYPES_H"

            CORE_INCS="$CORE_INCS $OPENSSL/openssl/include"
            CORE_DEPS="$CORE_DEPS $OPENSSL/openssl/include/openssl/ssl.h"

            if [ -f $OPENSSL/ms/do_ms.bat ]; then
                # before OpenSSL 1.1.0
                CORE_LIBS="$CORE_LIBS $OPENSSL/openssl/lib/ssleay32.lib"
                CORE_LIBS="$CORE_LIBS $OPENSSL/openssl/lib/libeay32.lib"
            else
                # OpenSSL 1.1.0+
                CORE_LIBS="$CORE_LIBS $OPENSSL/openssl/lib/libssl.lib"
                CORE_LIBS="$CORE_LIBS $OPENSSL/openssl/lib/libcrypto.lib"
            fi

            # libeay32.lib requires gdi32.lib
            CORE_LIBS="$CORE_LIBS gdi32.lib"
            # OpenSSL 1.0.0 requires crypt32.lib
            CORE_LIBS="$CORE_LIBS crypt32.lib"
        ;;

        *)
            have=NGX_OPENSSL . auto/have
            have=NGX_SSL . auto/have

            CORE_INCS="$CORE_INCS $OPENSSL/.openssl/include"
            CORE_DEPS="$CORE_DEPS $OPENSSL/.openssl/include/openssl/ssl.h"
            CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libssl.a"
            CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libcrypto.a"
            CORE_LIBS="$CORE_LIBS $NGX_LIBDL"
            CORE_LIBS="$CORE_LIBS $NGX_LIBPTHREAD"

            if [ "$NGX_PLATFORM" = win32 ]; then
                CORE_LIBS="$CORE_LIBS -lgdi32 -lcrypt32 -lws2_32"
            fi
        ;;
    esac

从代码中可以看出以下几点信息:

  • 代码中有个选择语句,是根据编译器的不同选择执行对应的代码的
  • 以下面那个通用的分支为例,可以看到首先是使用auto/have将两个宏NGX_OPENSSLNGX_SSL写入到头文件里(auto/have的内容前面的文章有讲到,这里就不赘述了)
  • 然后在CORE_INCS变量后面添加openssl头文件目录,在CORE_DEPS变量后面添加openssl相关头文件,在CORE_LIBS变量后面添加openssl相关的静态库,从这里可以看出OPENSSL参数实际上是指定了openssl静态库的存放目录,只要我们主动设置了OPENSSL的参数,后续程序中链接的就是openssl的静态库了
  • CORE_INCSCORE_DEPSCORE_LIBS这几个变量之前在介绍auto/module的时候也出现过,到目前为止这几个变量还没有写入到对应的文件中,后续会有脚本使用他们的

4.2、OPENSSL的值为NONE的情况

  • 首先,先判断当前平台是不是win32,必须不是win32才能执行下面的代码。可以看到这里也是使用到了auto/feature这个脚本(不懂auto/feature的可以看下这篇文章 Nginx编译配置脚本篇(4)- 工具型脚本系列 ),这里就和上面的情况不同了,使用的是动态库的链接方式。
else
    if [ "$NGX_PLATFORM" != win32 ]; then

        OPENSSL=NO

        ngx_feature="OpenSSL library"
        ngx_feature_name="NGX_OPENSSL"
        ngx_feature_run=no
        ngx_feature_incs="#include <openssl/ssl.h>"
        ngx_feature_path=
        ngx_feature_libs="-lssl -lcrypto $NGX_LIBDL $NGX_LIBPTHREAD"
        ngx_feature_test="SSL_CTX_set_options(NULL, 0)"
        . auto/feature
  • 如果上面的代码测试失败,也就是ngx_found的值为no的情况,执行下面的代码,这是FreeBSD系统的特化版本,代码和上面的差不多,不过链接的是FreeBSDopenssl库而已
        if [ $ngx_found = no ]; then

            # FreeBSD port

            ngx_feature="OpenSSL library in /usr/local/"
            ngx_feature_path="/usr/local/include"

            if [ $NGX_RPATH = YES ]; then
                ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lssl -lcrypto"
            else
                ngx_feature_libs="-L/usr/local/lib -lssl -lcrypto"
            fi

            ngx_feature_libs="$ngx_feature_libs $NGX_LIBDL $NGX_LIBPTHREAD"

            . auto/feature
        fi
  • 和上面的情况类似,是NetBSD系统的特化版本
        if [ $ngx_found = no ]; then

            # NetBSD port

            ngx_feature="OpenSSL library in /usr/pkg/"
            ngx_feature_path="/usr/pkg/include"

            if [ $NGX_RPATH = YES ]; then
                ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lssl -lcrypto"
            else
                ngx_feature_libs="-L/usr/pkg/lib -lssl -lcrypto"
            fi

            ngx_feature_libs="$ngx_feature_libs $NGX_LIBDL $NGX_LIBPTHREAD"

            . auto/feature
        fi
  • 和上面的情况类似,是Mac系统的特化版本
        if [ $ngx_found = no ]; then

            # MacPorts

            ngx_feature="OpenSSL library in /opt/local/"
            ngx_feature_path="/opt/local/include"

            if [ $NGX_RPATH = YES ]; then
                ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lssl -lcrypto"
            else
                ngx_feature_libs="-L/opt/local/lib -lssl -lcrypto"
            fi

            ngx_feature_libs="$ngx_feature_libs $NGX_LIBDL $NGX_LIBPTHREAD"

            . auto/feature
        fi
  • 这里和前面的链接静态库那里差不多,不过少设置了一个NGX_OPENSSL
        if [ $ngx_found = yes ]; then
            have=NGX_SSL . auto/have
            CORE_INCS="$CORE_INCS $ngx_feature_path"
            CORE_LIBS="$CORE_LIBS $ngx_feature_libs"
            OPENSSL=YES
        fi
    fi
  • 最后如果openssl库相关的内容设置失败,则输出报错信息然后退出配置文件
    if [ $OPENSSL != YES ]; then

cat << END

$0: error: SSL modules require the OpenSSL library.
You can either do not enable the modules, or install the OpenSSL library
into the system, or build the OpenSSL library statically from the source
with nginx by using --with-openssl=<path> option.

END
        exit 1
    fi

fi

5、总结

本文主要介绍了与动态库配置脚本相关的内容,从文中可以看出这些脚本并没有往文件里写入很重要的信息,只是写了几个宏到头文件里而已,但是其和auto/module做了类似的工作,
就是往CORE_INCSCORE_DEPSCORE_LIBS等变量里面添加了和动态库相关的内容,这些变量将会在之后被其它脚本所使用。

以上是关于Nginx编译配置脚本篇- 动态库配置脚本auto/lib/conf的主要内容,如果未能解决你的问题,请参考以下文章

Nginx配置编译脚本篇- 解析配置选项脚本auto/options

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

Nginx编译配置脚本篇- 源码相关变量脚本auto/sources

Nginx编译配置脚本篇- UNIX环境脚本auto/unix

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

Nginx编译配置脚本篇- Makefile初始化脚本auto/init