解剖Nginx·自动脚本篇(5)编译器相关主脚本
在 Nginx 的自动脚本中,auto/cc
目录下的所有脚本都是用于编译器相关配置使用的。Nginx
的出色跨平台性(Linux、Darwin、Solaris、Win32 等)就有这些脚本的贡献。该目录下包含如下脚本:
目录
- conf:主脚本,配置编译器的基本属性,并根据系统的编译器环境引用不同的脚本。
- name:与编译器名称相关的处理逻辑在该脚本中。
- gcc:GNU C 编译器的 Specified 配置。
- sunc:Sun C 编译器的 Specified 配置。
- acc:HP ANSI C++ 编译器的 Specified 配置。
- bcc:Borland C++ 编译器的 Specified 配置。
- ccc:Compaq C 编译器的 Specified 配置。
- icc:Intel C++ 编译器的 Specified 配置。
- msvc:Microsoft Visual C++ 编译器的 Specified 配置。
- owc:Open Watcom C 编译器的 Specified 配置。
4.1 LINK 变量
LINK
变量为:
LINK="\$(CC)"
4.2 编译选项变量
有 include、编译、输出目标文件、输出可执行文件。
ngx_include_opt="-I "
ngx_compile_opt="-c"
ngx_objout="-o "
ngx_binout="-o "
opt
表示option
,obj
表示object
,bin
表示binary
。
4.3 文件扩展名变量
目标文件扩展名、可执行文件扩展名。
ngx_objext="o"
ngx_binext=
ext
表示extension
。
4.4 ngx_long_start 和 ngx_long_end
相关变量为:
ngx_long_start=
ngx_long_end=
这两个变量是在编译选项中使用的,与平台相关。在这里做初始化。
4.4.1 ngx_long_start
- 在 bcc 中,设置为
'@&&|
- 在 msvc 中,设置为
@<<
- 在 owc 中,设置为
''
4.4.2 ngx_long_end
- 在 bcc 中,设置为
|
- 在 msvc 中,设置为
<<
- 在 owc 中,设置为
''
4.5 一些符号的配置
相关变量为:
ngx_regex_dirsep="\/"
ngx_dirsep='/'
ngx_regex_dirsep
:正则表达式中的目录分隔符ngx_dirsep
:目录分隔符
dir
表示directory
,sep
表示seperator
,regex
表示regular expression
。
ngx_regex_cont=' \\\
'
ngx_cont=' \
'
ngx_tab=' \
'
ngx_spacer=
ngx_long_regex_cont=$ngx_regex_cont
ngx_long_cont=$ngx_cont
4.6 引用 auto/cc/name 脚本
. auto/cc/name
4.7 平台相关性配置
if test -n "$CFLAGS"; then
CC_TEST_FLAGS="$CFLAGS $NGX_CC_OPT"
case $NGX_CC_NAME in
ccc)
# Compaq C V6.5-207
ngx_include_opt="-I"
;;
esac
else
case $NGX_CC_NAME in
gcc)
# gcc 2.7.2.3, 2.8.1, 2.95.4, egcs-1.1.2
# 3.0.4, 3.1.1, 3.2.3, 3.3.2, 3.3.3, 3.3.4, 3.4.0, 3.4.2
# 4.0.0, 4.0.1, 4.1.0
. auto/cc/gcc
;;
icc)
# Intel C++ compiler 7.1, 8.0, 8.1
. auto/cc/icc
;;
sunc)
# Sun C 5.7 Patch 117837-04 2005/05/11
. auto/cc/sunc
;;
ccc)
# Compaq C V6.5-207
. auto/cc/ccc
;;
acc)
# aCC: HP ANSI C++ B3910B A.03.55.02
. auto/cc/acc
;;
msvc*)
# MSVC++ 6.0 SP2, MSVC++ Toolkit 2003
. auto/cc/msvc
;;
owc)
# Open Watcom C 1.0, 1.2
. auto/cc/owc
;;
bcc)
# Borland C++ 5.5
. auto/cc/bcc
;;
esac
CC_TEST_FLAGS="$CC_TEST_FLAGS $NGX_CC_OPT"
fi
4.8 feature
auto/feature
脚本,已经在《精读 Nginx·自动脚本篇(4)工具型脚本系列》中介绍了。所以feature
相关的代码很容易理解。
if test -n "$NGX_LD_OPT"; then
ngx_feature=--with-ld-opt=\"$NGX_LD_OPT\"
ngx_feature_name=
ngx_feature_run=no
ngx_feature_incs=
ngx_feature_path=
ngx_feature_libs=
ngx_feature_test=
. auto/feature
if [ $ngx_found = no ]; then
echo $0: error: the invalid value in --with-ld-opt=\"$NGX_LD_OPT\"
echo
exit 1
fi
fi
在运行configure
的时候,--with-ld-opt
指定了NGX_LD_OPT
,然后设置feature
相关变量。其他一些feature
设置如下。
4.8.1 gcc builtin atomic operations 相关 feature
ngx_feature="gcc builtin atomic operations"
ngx_feature_name=NGX_HAVE_GCC_ATOMIC
ngx_feature_run=yes
ngx_feature_incs=
ngx_feature_path=
ngx_feature_libs=
ngx_feature_test="long n = 0;
if (!__sync_bool_compare_and_swap(&n, 0, 1))
return 1;
if (__sync_fetch_and_add(&n, 1) != 1)
return 1;
if (n != 2)
return 1;
__sync_synchronize();"
. auto/feature
4.8.2 C99 variadic macros 相关 feature
if [ "$NGX_CC_NAME" = "ccc" ]; then
echo "checking for C99 variadic macros ... disabled"
else
ngx_feature="C99 variadic macros"
ngx_feature_name="NGX_HAVE_C99_VARIADIC_MACROS"
ngx_feature_run=yes
ngx_feature_incs="#include <stdio.h>
#define var(dummy, ...) sprintf(__VA_ARGS__)"
ngx_feature_path=
ngx_feature_libs=
ngx_feature_test="char buf[30]; buf[0] = '0';
var(0, buf, \"%d\", 1);
if (buf[0] != '1') return 1"
. auto/feature
fi
4.8.3 gcc variadic macros 相关 feature
ngx_feature="gcc variadic macros"
ngx_feature_name="NGX_HAVE_GCC_VARIADIC_MACROS"
ngx_feature_run=yes
ngx_feature_incs="#include <stdio.h>
#define var(dummy, args...) sprintf(args)"
ngx_feature_path=
ngx_feature_libs=
ngx_feature_test="char buf[30]; buf[0] = '0';
var(0, buf, \"%d\", 1);
if (buf[0] != '1') return 1"
. auto/feature
4.9 结语
编译器相关配置的其他脚本,就不细致分析了,这对 Nginx 的整体自动脚本体系的学习理解并无多大裨益。不过如果你想了解这些内容,会有一些好处,对编写跨平台的软件的自动脚本很有帮助。能让我们在不同系统的机器上享受美妙的configure
过程,正是由这些编译器相关的自动脚本所保证的。
-
解剖Nginx·自动脚本篇(5)编译器相关主脚本的更多相关文章
- 解剖Nginx·自动脚本篇(6)编译器名称变量脚本 auto/cc/name
回顾变量 CC 最初是在auto/options脚本中初始化的: CC=${CC:-gcc} 1 C Compiler 的 feature Windows 平台的编译器叫做MSVC,其他平台的都统称为 ...
- 解剖Nginx·自动脚本篇(4)工具型脚本系列
目录 auto/have 向自动配置头文件追加可用宏定义(objs/ngx_auto_config.h) auto/nohave 向自动配置头文件追加不可用宏定义(objs/ngx_auto_conf ...
- 解剖Nginx·自动脚本篇(3)源码相关变量脚本 auto/sources
在configure脚本中,运行完auto/options和auto/init脚本后,接下来就运行auto/soures脚本.这个脚本是为编译做准备的. 目录 核心模块 事件模块 OpenSSL 模块 ...
- 解剖Nginx·自动脚本篇(7)类型相关脚本系列
1 auto/types/sizeof 该脚本的功能,是通过测试程序获知给定的ngx_type的大小. 1.1 显示提示信息 echo $ngx_n "checking for $ngx_t ...
- 解剖Nginx·自动脚本篇(2)设置初始变量脚本 auto/init
在configure中运行完auto/options脚本后,接着运行auto/init脚本,其中所做的工作如下. 1 Makefile文件名变量 默认情况下是: objs/Makefile 代码如下: ...
- 解剖Nginx·自动脚本篇(1)解析配置选项脚本 auto/options
在安装Nginx之前(即运行make脚本之前),首先是进行安装的配置准备,包括环境检查及生成文件.这些工作是由自动脚本完成的.和绝大多数软件一样,Nginx的自动脚本的入口,同样是名为configur ...
- 解剖Nginx·模块开发篇(3)ngx_http_hello_world_module 模块的基本函数实现
还记得我们定义过一个结构体如下吗? typedef struct { ngx_str_t output_words; } ngx_http_hello_world_loc_conf_t; 它就是 He ...
- 解剖Nginx·模块开发篇(1)跑起你的 Hello World 模块!
1 学习 Nginx 模块开发需要有哪些准备? 需要的预备知识不多,有如下几点: 有过一些 C 语言的编程经历: 知道 Nginx 是干嘛的,并有过编写或改写 Nginx 的配置文件的经历. OK,就 ...
- 解剖Nginx·模块开发篇(5)解读内置非默认模块 ngx_http_stub_status_module
1 Background ngx_http_stub_status_module 是一个 Nginx 的内置 HTTP 模块,该模块可以提供 Nginx 的状态信息.默认情况下这个模块是不被编译进来的 ...
随机推荐
- apache phoenix 安装试用
备注: 本次安装是在hbase docker 镜像的基础上配置的,主要是为了方便学习,而hbase搭建有觉得 有点费事,用镜像简单. 1. hbase 镜像 docker pull har ...
- vue-router做路由拦截时陷入死循环
今天分享一下使用vue-router做路由拦截时遇到的坑. 需要提前了解的api 1:router.beforeEach( to , from ,next) ; to: Route: 即将要进入的目标 ...
- SharePoint2013 Online中InfoPath 无法调用WebService
传说微软office365中国区服务器已经迁移到国内,试了下速度果然比之前快了很多,不过随后测试了个简单的功能,还是直接被打击了. 准备在online版本中做一个简单的报销流程测试测试,于是先用Inf ...
- 笔记:LNK2001不代表链接器真的需要链接相关符号
环境:VS2008 我们都知道,链接器在生成可执行程序时,会忽略那些没有用到的符号.但是昨天遇到一个链接问题,看起来与这条基本策略并不相符.首先看一个静态链接库的结构: lib | |---- ...
- eclipse Mars(4.5.2)安装pydev后不出现
一.环境 windows 7 64bit eclipse 4.5.2 pydev jdk7u55 二.安装步骤 1. 安装JDK eclipse依赖于java环境,所以需要安装java运行环境JRE. ...
- Servlet3.0的简单使用
Servlet3.0(WEB3.0)算是比较新的Servlet技术了,对应的JavaEE版本是6,虽然目前最新的版本是3.1,对应版本JavaEE7.我们目前使用的做多的还是Servlet2.5的东西 ...
- SQLServer数据库优化常用语句
-- 平均物理读次数最多的SQL语句:select top 50 *, (s.total_physical_reads / s.execution_count) as avephysicalreads ...
- kafka的OffsetOutOfRangeError
from kafka import KafkaClient, SimpleConsumer from sys import argv kafka = KafkaClient("10.0.1. ...
- spring 4.0+quartz2.2 实现持久化
最近在搭建框架 用到quartz持久化这块 查了一些文档 如下配置即可. 这里是quartz官方提供配置步骤 http://www.quartz-scheduler.org/ Quartz包含三个抽 ...
- Linux基础综合练习
Linux基本操作综合练习 1.建立用户zhangsan,密码使用明文123456: 命令:useradd -p 123456 zhangsan 解释: 参数 -p 添加明文密码 useradd添加用 ...