Nginx脚本分析-configure脚本

基于nginx-1.14.0脚本分析

configure脚本

  • 导入依赖脚本auto/options,auto/init,auto/sources,导入脚本具体分析参考后面内容。
  • 创建objs目录,创建objs/ngx_auto_headers.h和objs/ngx_auto_config.h文件。
  • 写入宏NGX_CONFIGURE到ngx_auto_config.h文件中。
  • 如果是调试状态,写入宏NGX_DEBUG到ngx_auto_config.h文件中。
  • 输出打印操作系统版本,设置系统,机器,系统发布版本等信息。
  • 检查编译器。
  • 检查依赖的操作系统的头文件是否可用。
  • 检查线程。
  • 检查模块。
  • 检查依赖的基础库。
  • 生成Makefile文件。
  • 编译。

auto/options脚本

该脚本是处理运行./configure的时候携带的参数选项的,解析出参数值,然后赋值给相关变量。

CC=${CC:-cc}的含义:

(1)如果变量 C C 未 声 明 将 默 认 值 c c 赋 值 给 变 量 CC未声明将默认值cc赋值给变量 CCccCC,如变量已被赋值则保持原值不变。
(2)当执行configure文件时,此文件第一个被调用,此时会把cc赋值给变量CC。
(3)如果要在configure中修改CC变量,可以使用“–with-cc=值”。

如果不熟悉参数可以使用“–help”,会打印相关参数说明,后面不用设置值,因为脚本里面会固定设置help的值为yes,默认为no。

如果是win32平台,可以使用参数“–crossbuild=win32”,需要变量WINE的值存在。

设置错误日志路径,可以使用参数“–error-log-path=”,默认文件为logs/error.log,如果设置值为“stderr”将不会输出日志。

此脚本的更多详细可以参考: https://blog.csdn.net/ai2000ai/article/details/78274132。

auto/init脚本

该脚本会进行一些变量初始化工作,为后续编译文件作准备。变量NGX_OBJS,在auto/options脚本文件进行赋值的,它保存了编译相关目录,默认是当前目录的objs文件夹。

NGX_MODULES_C=$NGX_OBJS/ngx_modules.c这个文件保存了我们编译到nginx中的所有模块。

ngx_n和ngx_c变量

检查当前系统是否支持echo命令的“-n”和“\c”选项,两个选项都是和换行有关的。检查“-n”和“\c”是否会匹配成功,如果能匹配,表示命令不起作用。当前在centos7环境下,“\c”需要和-e配合才有用,“-n”是可以使用的。后面很多echo输出中有这两个变量。

在当前目录生成Makefile文件,该Makefile会清理objs目录文件和自身。

auto/sources脚本

该脚本初始化源文件信息。

此脚本的更多更多详细可以参考:
https://blog.csdn.net/u010710458/article/details/79903656。
https://blog.csdn.net/weixin_43797048/article/details/95597950。

auto/endianness脚本

用于检测当前的计算机硬件是大端还是小端。根据大小端原则:大端字节序,数据高字节存于内存低地址,数据低字节存于内存高地址;小端字节序反之。

脚本有简短的main函数,用于检测大小端,函数返回0表示小端模式,返回1表示大段模式。

更多详细可以参考:https://blog.csdn.net/weixin_43797048/article/details/99713621。

auto/hava脚本

该脚本把宏定义为1,并把定义的宏源写入变量NGX_AUTO_CONFIG_H指向的源码文件中(ngx_auto_config.h)。

auto/nohava脚本

该脚本把宏定义为0,并写入ngx_auto_config.h文件中。

auto/define脚本

该脚本原理同auto/hava脚本,并把定义的宏源写入变量NGX_AUTO_CONFIG_H指向的源码文件中(ngx_auto_config.h)。

auto/hava_headers脚本

该脚本原理同auto/hava脚本,把宏定义写入变量NGX_AUTO_HEADERS_H指向的源码文件中(ngx_auto_header.h)。

auto/headers脚本

检查项目依赖的操作系统的头文件是否存在。

auto/include脚本

检查头文件是否存在。检查原理同auto/feature脚本类似,通过生成一段简易的C代码,编译生成可执行文件,通过检查执行文件的结果来判定头文件是否可以使用。

auto/threads脚本

处理线程脚本,win系统下,不支持–with-threads,

auto/feature脚本

更多详细可以参考:https://blog.csdn.net/chentaoxie/article/details/104391914。

auto/unix脚本

调用auto/feature脚本来检查系统相关API的。
比如,检查nobody组是否存在,检查poll函数,检查/dev/poll是否可用,检查kqueue是否可用,等等。

auto/threads脚本

如果使用多线程,需要添加–with-threads参数,编译的时候才会有“-lpthread”选项。在auto/unix中,如果有支持“POSIX semaphores”,也会设置“-lpthread”选项。win系统中不支持–with-threads参数设置。如果有设置编译的时候才会添加线程池相关的文件(ngx_thread_pool.c,ngx_thread_cond.c,ngx_thread_mutex.c,ngx_thread_id.c)。

auto/module脚本

根据auto/modules脚本的参数,拼接模块编译时需要的信息。

auto/modules脚本

生成各个模块的依赖信息,如HTTP模块,模块相关的源码信息(HTTP_SRCS),模块相关的头文件信息(HTTP_DEPS),模块相关的目录信息(HTTP_INCS),模块依赖的模块信息(HTTP_MODULES),模块依赖的库信息(CORE_LIBS)等。
生成ngx_modules.c文件,并写入模块相关信息。

auto/cc/name脚本

检查当前可以使用的编译器类型,并打印。设置变量NGX_CC_NAME,centos7使用的是“GNU C compiler”,变量设置为gcc。

脚本中,如果不是win32系统,会检测编译器是否存在。检测方法是调用auto/feature脚本,生成一个最简易的main函数,然后编译成可执行文件,检测可执行文件是否正确执行,否则表示编译器不存在。

auto/cc/conf脚本

该脚本主要检查编译器,它先调用auto/cc/name来得到编译器的名称,然后根据编译器执行相关文件,如Centos7,NGX_CC_NAME为gcc,那么会执行auto/cc/gcc。

脚本功能
(1)检测和设置编译器及参数。
(2)检测“–with-ld-opt”。
(3)检测“-Wl,-E switch”。
(4)检测“gcc内置原子操作”,检测成功,添加宏NGX_HAVE_GCC_ATOMIC到ngx_auto_config.h文件中。
(5)检测“可变参数宏”,检测成,添加宏NGX_HAVE_GCC_VARIADIC_MACROS到ngx_auto_config.h文件中。
(6)检测“gcc builtin 64 bit byteswap”,检测成功,添加宏NGX_HAVE_GCC_BSWAP64到ngx_auto_config.h文件中。
(7)检测“inline”,此检测代码已被注释。

auto/cc/gcc脚本

该脚本设置编译的相关选项。

脚本功能
(1)把宏定义NGX_COMPILER的编译器版本写入头文件ngx_auto_config.h中。
(2)检测是否支持"-pipe"。文中有写到Solaris 7不支持"-pipe"。
(3)检测cpu的类型,是否支持-mcpu=v9,以及pentium,pentiumpro,athlon,opteron,sparc32等类型检查。
(4)添加优化参数,包括O2,-fomit-frame-pointer,当前虚拟机Centos7没有此选项。
(5)添加警告参数,包括“-W -Wall -Wpointer-arith -Wno-unused-parameter -Werror”。
(6)添加调试参数-g。
例如,在虚拟机Centos7下,如果只执行configure,变量CFLAGS的值为“-pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g”

auto/os/conf脚本

检查操作系统特性,并把相关宏写入ngx_auto_config.h文件中。例如当前是Centos7系统,会调用auto/os/linux脚本。

auto/os/linux脚本

脚本功能
(1)写入宏NGX_LINUX到文件ngx_auto_hearder.h中。
(2)检查内核版本。
(3)检查epoll是否可用。
(4)检查epollrdhup是否可用。
(5)检查epollexclusive是否可用。
(6)检查openat函数的O_PATH和AT_EMPTY_PATH属性是否可用。
(7)检查sendfile函数是否可用。
(8)检查sendfile64函数是否可用。
(9)检查prctl(PR_SET_DUMPABLE)"函数是否可用。
(10)检查prctl(PR_SET_KEEPCAPS)函数是否可用。
(11)检查capabilities机制。
(12)检查crypt_r函数。
(13)检查sys/vfs.h头文件。

auto/lib/conf脚本

该脚本是基础库的检查。
脚本功能
(1)检查PCRE库。
(2)检查PCRE JIT库。
(3)检查zlib库。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值