基于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赋值给变量
CC未声明将默认值cc赋值给变量CC,如变量已被赋值则保持原值不变。
(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库。