Nginx编译配置脚本篇(9)- 动态库配置脚本auto lib conf_auto lib openssl conf(1)

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

Nginx编译配置脚本篇(9)- 动态库配置脚本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=


![img](https://img-blog.csdnimg.cn/img_convert/4e2b21d1d1e4f6df8f0a5e131f5330ad.png)
![img](https://img-blog.csdnimg.cn/img_convert/fa28b421742ee38a45e216f25e40f1b2.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值