• nginx系列第三篇:nginx平台相关源码自动生成流程


    在nginx调试过程中,会发现三个文件不是在源码包中的,而是根据具体平台自动生成,这三个文件分别是 ngx_modules.c ,ngx_auto_headers.h,ngx_auto_config.h。那么这三个文件是怎么自动生成的?生成的流程是怎样的?又是在什么地方调用的呢?本篇针对这些问题做个分析。

    1.总控脚本configure
    nginx-1.22.1/configure

    1. LC_ALL=C
    2. export LC_ALL
    3. . auto/options    #该脚本生效全局变量,比如自动生成文件.h和.c名,模块是否安装控制开关
    4. . auto/init       #不修改脚本auto/init权限,仍然可以执行脚本,需要root权限才可以
    5. . auto/sources    #基本模块定义
    6. ...
    7. if test -z "$NGX_PLATFORM"; then
    8.     echo "checking for OS"
    9.     NGX_SYSTEM=`uname -s 2>/dev/null`  #获取操作系统类型
    10.     NGX_RELEASE=`uname -r 2>/dev/null` #获取操作系统版本
    11.     NGX_MACHINE=`uname -m 2>/dev/null` #获取计算机CPU硬件架构
    12.     echo " + $NGX_SYSTEM $NGX_RELEASE $NGX_MACHINE"
    13.     NGX_PLATFORM="$NGX_SYSTEM:$NGX_RELEASE:$NGX_MACHINE";
    14.     case "$NGX_SYSTEM" in
    15.         MINGW32_* | MINGW64_* | MSYS_*)
    16.             NGX_PLATFORM=win32
    17.         ;;
    18.     esac
    19. else
    20.     echo "building for $NGX_PLATFORM"
    21.     NGX_SYSTEM=$NGX_PLATFORM
    22. fi
    23. #调用编译器配置脚本
    24. ...
    25. . auto/cc/conf
    26. ...
    27. #调用操作系统配置脚本
    28. . auto/os/conf
    29. ...

    2.初始化脚本中需要用到的全局变量
    nginx-1.22.1/auto/init

    1. NGX_MAKEFILE=$NGX_OBJS/Makefile
    2. NGX_MODULES_C=$NGX_OBJS/ngx_modules.c
    3. NGX_AUTO_HEADERS_H=$NGX_OBJS/ngx_auto_headers.h  #自动生成运行环境相关宏定义,例如操作系统宏开关
    4. NGX_AUTO_CONFIG_H=$NGX_OBJS/ngx_auto_config.h    #操作系统属性相关宏开关,比如是否支持epoll,sendfile等系统函数调用
    5. ...


    3.操作系统配置脚本
    nginx-1.22.1/auto/os/conf

    1. case "$NGX_PLATFORM" in
    2.     FreeBSD:*)
    3.         . auto/os/freebsd
    4.     ;;
    5.     Linux:*)
    6.         . auto/os/linux #执行linux系统脚本
    7.     ;;
    8.     SunOS:*)
    9.         . auto/os/solaris
    10.     ;;
    11.     Darwin:*)
    12.         . auto/os/darwin
    13.     ;;
    14.     win32)
    15.         . auto/os/win32
    16.     ;;
    17.     ...
    18.     *)
    19.         CORE_INCS="$UNIX_INCS"
    20.         CORE_DEPS="$UNIX_DEPS $POSIX_DEPS"
    21.         CORE_SRCS="$UNIX_SRCS"
    22.     ;;
    23. esac

    4.自动生成头文件: ngx_auto_headers.h和ngx_auto_config.h
    nginx-1.22.1/auto/os/linux

    1. ...
    2. have=NGX_LINUX . auto/have_headers  #自动生成linux系统的头文件ngx_auto_headers.h
    3. ...
    4. . auto/feature      #调用auto/have脚本和cat << END方法自动生成系统相关属性头文件ngx_auto_config.h
    5. ...

    4.1 auto/have_headers脚本
    nginx-1.22.1/auto/have_headers

    1. #脚本从变量NGX_AUTO_HEADERS_H获取值自动生成头文件ngx_auto_headers.h
    2. # Copyright (C) Igor Sysoev
    3. # Copyright (C) Nginx, Inc.
    4. cat << END >> $NGX_AUTO_HEADERS_H
    5. #ifndef $have
    6. #define $have  1
    7. #endif
    8. END
    9. #ngx_auto_headers.h文件样例
    10. ...
    11. #ifndef NGX_LINUX
    12. #define NGX_LINUX  1
    13. #endif
    14. ...

    4.2 auto/have脚本,往ngx_auto_config.h中写入信息
    nginx-1.22.1/auto/have

    1. # Copyright (C) Igor Sysoev
    2. # Copyright (C) Nginx, Inc.
    3. cat << END >> $NGX_AUTO_CONFIG_H
    4. #ifndef $have
    5. #define $have  1
    6. #endif
    7. END
    8. #ngx_auto_config.h文件样例
    9. nginx-1.22.1/objs/ngx_auto_config.h
    10. #define NGX_CONFIGURE " --prefix=/home/hesy/work/nginx-1.22.1/nginx/bin --with-http_ssl_module --with-stream --with-cc-opt='-O0 -g'"
    11. #ifndef NGX_COMPILER
    12. #define NGX_COMPILER  "gcc 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04) "
    13. #endif
    14. ...
    15. #ifndef NGX_HAVE_EPOLL
    16. #define NGX_HAVE_EPOLL  1
    17. #endif
    18. ...
    19. #ifndef NGX_HAVE_SENDFILE
    20. #define NGX_HAVE_SENDFILE  1
    21. #endif
    22. ...


    5.自动生成文件: ngx_modules.c
    auto/init脚本中定义文件路径:NGX_MODULES_C=$NGX_OBJS/ngx_modules.c
    根据. auto/options 和 . auto/sources脚本来确定相关模块名,存在全局变量中
    . auto/modules(调用auto/module)脚本根据模块全局变量名来动态生成.c文件

    . auto/options:该脚本可用来定义控制模块是否编译,是否是预定义
    如下两个脚本负责往ngx_modules.c中写入数据
    nginx-1.22.1/auto/modules
    nginx-1.22.1/auto/modules


    6.程序引用
    6.1 nginx-1.22.1/src/core/ngx_config.h中引用ngx_auto_headers.h和 中又引用ngx_auto_config.h
    nginx-1.22.1/src/core/ngx_config.h

    1. #ifndef _NGX_CONFIG_H_INCLUDED_
    2. #define _NGX_CONFIG_H_INCLUDED_
    3. #include
    4. ...
    5. #elif (NGX_LINUX)
    6. #include
    7. ...
    8. #endif /* _NGX_CONFIG_H_INCLUDED_ */


    6.2 nginx-1.22.1/src/os/unix/ngx_linux_config.h引用ngx_auto_config.h
    nginx-1.22.1/src/os/unix/ngx_linux_config.h

    1. #ifndef _NGX_LINUX_CONFIG_H_INCLUDED_
    2. #define _NGX_LINUX_CONFIG_H_INCLUDED_
    3. ...
    4. #include
    5. ...
    6. #if (NGX_HAVE_EPOLL)
    7. #include
    8. #endif
    9. #endif /* _NGX_LINUX_CONFIG_H_INCLUDED_ */

    nginx以模块的方式组织代码,使得代码编写和扩展相当灵活。而为了实现跨平台,其通过shell脚本检测本地系统,自动生成代码,这一套处理解决问题的思想值得IT同仁们在工作中借鉴。

  • 相关阅读:
    使用大数据分析建立电力企业用户画像的一种思路
    【Qt控件之QListWidget】介绍及使用,利用QListWidget、QToolButton、和布局控件实现抽屉式组合控件
    【leetcode】记忆化搜索
    C++ | 简单线程池的实现
    用FIR滤波器设计数字微分器和数字希尔伯特变换器
    Chat Towards Data Science|如何用个人数据知识库构建 RAG 聊天机器人?
    31.JavaScript数组进阶,一网打尽数组操作函数slice、filter、map、reduce、some、every、find、splice
    《Solidity 简易速速上手小册》第4章:智能合约的设计与开发(2024 最新版)
    面试题:你是如何计划和组织一个大型的软件测试项目的?
    07 Tomcat 请求处理流程详解,Tomcat 请求流程设计架构
  • 原文地址:https://blog.csdn.net/hsy12342611/article/details/128047288