社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  NGINX

Nginx源码分析之--编译器相关脚本

郑尔多斯 • 6 年前 • 570 次点击  
阅读 4

Nginx源码分析之--编译器相关脚本

微信公众号:Nginx源码分析
关注可了解更多的Nginx知识。任何问题或建议,请公众号留言;
关注公众号,有趣有内涵的文章第一时间送达!

回顾

前面我们介绍了nginx的很多脚本,比如测试操作系统是否支持某个特性的auto/feature脚本,测试类型变量长度的auto/types/sizeof脚本等等。
有时候大家可能会问,nginx为什么搞这么多脚本呢?
其实答案很简单:
①.为了保证nginx的可移植性。
②.为编译nginx源码做准备。
那么本文我们就分析一下和编译器相关的脚本。

编译器相关脚本
编译器相关脚本

写在前面

本文简单的分析一下和编译器相关的脚本。
这一部分内容对于分析nginx自动化配置流程以及分析源码来说,几乎没有什么用处。但是为了保证本系列文章的连贯性和完整性,我还是尽最大的努力分析这部分内容。但是由于本人对编译相关的内容也不是很了解,如有错误,请联系我,我会第一时间修正。

auto/cc 脚本

该目录下的脚本用于设置编译器相关的参数。
不同的操作系统都有自己的特有的编译器,它们的设置可能有细微的差别。所以nginx自动根据操作系统和编译器种类,设置符合该平台的参数。

设置编译器种类

nginx使用CC变量保存所用的编译器名称。在auto/options中对该变量进行了赋值。




    
1CC=${CC:-gcc}
复制代码

所以CC的默认值是gcc
我们可以在执行configre脚本的时候通过指定--with-cc=*)的方式来自由的设置所使用的编译器,默认情况下,我们都不会改变这个值。在linux下该值为gcc

auto/cc/name 设置编译器名称

auto/cc/conf脚本中,会首先调用auto/cc/name。这个脚本并不复杂,它的作用就是根据我们在configure时选择的编译器,从而设置编译器的名称。

查找编译器

auto/cc/name一开始就调用了一大段脚本,如下:

 1if [ "$NGX_PLATFORM" != win32 ]; then
2
3    ngx_feature="C compiler"
4    ngx_feature_name=
5    ngx_feature_run=yes
6    ngx_feature_incs=
7    ngx_feature_path=
8    ngx_feature_libs=
9    ngx_feature_test=
10    . auto/feature
11
12    if [ $ngx_found = no ]; then
13        echo
14         echo $0: error: C compiler $CC is not found
15        echo
16        exit 1
17    fi
18
19fi
复制代码

这段脚本看起来吓人,其实,它的功能非常简单。
我们前面介绍过auto/feature的执行过程,所以上面的代码就是编译如下的自动测试程序:

1#include <sys/types.h>
2#include <unistd.h>
3#include <sys/epoll.h>
4
5int main() {
6    return 0;
7}
复制代码

这段代码其实啥功能都木有,所以它就是测试一下能不能找到我们选择的编译器。因为只要编译器能正常工作,那么上面的c代码就可以编译成功。

判断编译器的名称

因为我们选择的编译器是gcc,所以剩下的脚本执行的应该是如下的部分:




    
1if [ "$CC" = cl ]; then
2    
3else
4    # 因为我们选择的是gcc
5    # 所以执行else部分
6fi
复制代码

观察一下else部分的代码:
其实就是根据gcc -v的内容判断具体的编译器名称。
下面的内容是在我的本机上面执行gcc -v的输出内容:

1Using built-in specs.
2COLLECT_GCC=gcc
3COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper
4Target: x86_64-redhat-linux
5Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
6Thread model: posix
7gcc version 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC)
复制代码

所以对于我自己的电脑来说,会指向下面的代码:

1 NGX_CC_NAME=gcc
2echo " + using GNU C compiler"
复制代码

对于大多数linux系统,应该都是执行上面的代码,会把NGX_CC_NAME变量的值设置为gcc
即使你的电脑上不是这样的,那么也没关系,这部分内容并不影响我们后面的源码分析。

auto/cc/conf

初始化变量

该脚本的第一步是初始化一些变量,用于后面的编译选项,如ngx_include_opt变量表示编译时引入头文件的选项等。

调用 auto/cc/name 脚本

上面已经分析过这个脚本。主要功能就是根据cc变量设置NGX_CC_NAME的值。

执行特定编译器测试脚本

根据在auto/cc/name中获取到的NGX_CC_NAME变量,执行特定的脚本,比如对于我的机器来说,由于选择的编译器是gcc,所以执行 auto/cc/gcc脚本。

编译器的feature测试

进行一些编译器的feature性能测试。
比如测试编译器是否支持宏,是否支持inline等。

auto/cc/gcc 脚本

该脚本完成gcc编译器的特定初始化操作。
脚本的内容非常简单,利用了前面分析过的许多脚本,大家可以自己看一下。

总结

我们在本文中分析了nginx中编译器相关的脚本,这部分内容对于我们分析源代码没有什么关系。只是为了保证内容上的连续性。如果又不懂的地方也没关系,let it go

后面的文章我们会接着分析nginx的源码,敬请期待。顺便关注我的个公众号(Nginx源码分析)。



喜欢本文的朋友们,欢迎长按下图关注订阅号Nginx源码分析,更多精彩内容第一时间送达
Nginx源码分析
Nginx源码分析
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/36657
 
570 次点击