微信公众号:Nginx源码分析
关注可了解更多的Nginx
知识。任何问题或建议,请公众号留言;
关注公众号,有趣有内涵的文章第一时间送达!
回顾
我们在上一篇文章中详细的分析了auto/define
,auto/have
,auto/nohave
脚本源码,本文我们继续分析其他辅助脚本文件。我们首先回顾一下nginx
中的大致辅助脚本图片,如下图:
auto/types脚本
在auto/types
目录下面有四个脚本,分别是sizeof
,typedef
,uintptr_t
,value
,这几个脚本都和c
语言的数据类型有关。本文剩余的内容和下篇文章会主要分析一下这四个脚本。
auto/types/sizeof脚本
功能
参数
ngx_type
:要检测的数据类型
脚本内容
1echo
$ngx_n "checking for $ngx_type size ...$ngx_c"
2
3cat << END >> $NGX_AUTOCONF_ERR
4
5----------------------------------------
6checking for $ngx_type size
7
8END
9
10ngx_size=
11
12cat << END > $NGX_AUTOTEST.c
13
14#include <sys/types.h>
15#include <sys/time.h>
16$NGX_INCLUDE_UNISTD_H
17#include <signal.h>
18#include <sys/resource.h>
19$NGX_INCLUDE_INTTYPES_H
20$NGX_INCLUDE_AUTO_CONFIG_H
21
22int main() {
23 printf("%d"
, sizeof($ngx_type));
24 return 0;
25}
26
27END
28
29
30ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS \
31 -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT $ngx_feature_libs"
32
33eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1"
34
35
36if [ -x $NGX_AUTOTEST ]; then
37 ngx_size=`$NGX_AUTOTEST`
38 echo " $ngx_size bytes"
39fi
40
41
42rm -f $NGX_AUTOTEST
43
44
45case $ngx_size in
46 4)
47 if [ "$ngx_type"="long" ]; then
48 ngx_max_value=2147483647L
49 else
50 ngx_max_value=2147483647
51 fi
52
53 ngx_max_len='(sizeof("-2147483648") - 1)'
54 ;;
55
56 8)
57 if [ "$ngx_type"="long long" ]; then
58 ngx_max_value=9223372036854775807LL
59 else
60 ngx_max_value=9223372036854775807L
61 fi
62
63 ngx_max_len='(sizeof("-9223372036854775808") - 1)'
64 ;;
65
66 *)
67 echo
68 echo "$0: error: can not detect $ngx_type size"
69
70 echo "----------" >> $NGX_AUTOCONF_ERR
71 cat $NGX_AUTOTEST.c >> $NGX_AUTOCONF_ERR
72 echo "----------" >> $NGX_AUTOCONF_ERR
73 echo $ngx_test >> $NGX_AUTOCONF_ERR
74 echo "----------" >> $NGX_AUTOCONF_ERR
75
76 exit 1
77esac
复制代码
示例
我们这次先看示例,然后用实际例子来分析这个脚本,这样更容易理解。
在auto/unix
脚本中有如下的内容:
1# C types
2
3ngx_type="int"; . auto/types/sizeof
4
5ngx_type="long"; . auto/types/sizeof
6
7ngx_type="long long"; . auto/types/sizeof
复制代码
上面的脚本分别是计算sizeof(int)
,sizeof(long)
,sizeof(long long)
的脚本。
我们以sizeof(int)
为例分析该脚本。
脚本分析
1).
首先是向控制台输出信息
sh
echo $ngx_n "checking for $ngx_type size ...$ngx_c"
我们在终端上可以看到如下内容:
sh
checking for int size ...
2).
向NGX_AUTOCONF_ERR
中输出内容,表示开始类型检测,便于后面分析错误。
1cat << END >> $NGX_AUTOCONF_ERR
2
3----------------------------------------
4checking for $ngx_type size
5
6END
复制代码
所以,实际上向NGX_AUTOCONF_ERR
中写入的内容是:
1checking for int size
复制代码
3). 生成测试程序
1ngx_size=
2
3cat << END > $NGX_AUTOTEST.c
4
5#include <sys/types.h>
6#include <sys/time.h>
7$NGX_INCLUDE_UNISTD_H
8#include <signal.h>
9#include <sys/resource.h>
10$NGX_INCLUDE_INTTYPES_H
11$NGX_INCLUDE_AUTO_CONFIG_H
12
13int main() {
14 printf("%d", sizeof($ngx_type));
15 return 0;
16}
复制代码
这里首先将ngx_size
的内容赋值为空,这个变量在后面用来表示int
类型的长度。
接着生成如下的测试源文件。
1#include <sys/types.h>
2#include <sys/time.h>
3
#include <unistd.h>
4#include <signal.h>
5#include <sys/resource.h>
6#include <inttypes.h>
7
8
9int main() {
10 printf("%d", sizeof(int));
11 return 0;
12}
复制代码
这个源文件真的是很简单,就是在终端打印一下sizeof(int)
的值。
4).
编译上面生成的源文件
1ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS \
2 -o $NGX_AUTOTEST $NGX_AUTOTEST
.c $NGX_LD_OPT $ngx_feature_libs"
3
4eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1"
复制代码
上面的ngx_test
就是一个编译语句,具体内容如下:
1ngx_test=gcc -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -o objs/autotest objs/autotest.c
复制代码
紧接着的eval
语句会执行ngx_test
的内容,也就是执行编译语句,生成可以执行文件objs/autotest
。
5).
执行可执行程序
1if [ -x $NGX_AUTOTEST ]; then
2 ngx_size=`$NGX_AUTOTEST`
3 echo " $ngx_size bytes"
4fi
复制代码
nginx
判断如果第4
步生成的目标文件是是可执行文件-x $NGX_AUTOTEST
,那么执行该目标文件,并将结果保存到ngx_size
变量中。
6).
删除目标文件
1rm -f $NGX_AUTOTEST
复制代码
Nginx
会在运行完可执行文件之后就将该文件删除,所以实际上我们在Nginx
的目录中是不能看到这些文件的,它们都是临时文件。
7).
设置该类型的最大值和最大长度
1case $ngx_size in
2 4)
3 if [ "$ngx_type"="long" ]; then
4 ngx_max_value=2147483647L
5 else
6 ngx_max_value=2147483647
7 fi
8
9 ngx_max_len='(sizeof("-2147483648") - 1)'
10 ;;
11
12 8)
13 if [ "$ngx_type"="long long" ]; then
14 ngx_max_value=9223372036854775807LL
15 else
16 ngx_max_value=9223372036854775807L
17 fi
18
19 ngx_max_len='(sizeof("-9223372036854775808") - 1)'
20 ;;
21
22 *)
23 echo
24 echo "$0: error: can not detect $ngx_type size"
25
26 echo "----------" >> $NGX_AUTOCONF_ERR
27 cat $NGX_AUTOTEST.c >> $NGX_AUTOCONF_ERR
28 echo "----------" >> $NGX_AUTOCONF_ERR
29 echo $ngx_test >> $NGX_AUTOCONF_ERR
30 echo "----------" >> $NGX_AUTOCONF_ERR
31
32 exit 1
33esac
复制代码
其中ngx_size
就是第5)
步中得到的长度,根据该值来计算最大值ngx_max_value
和最大长度ngx_max_len
,这两个值在后面执行auto/types/value
的时候会用到。如下:
1ngx_type="off_t"; . auto/types/sizeof
2ngx_param=NGX_MAX_OFF_T_VALUE; ngx_value=$ngx_max_value; . auto/types/value
3ngx_param=NGX_OFF_T_LEN; ngx_value=$ngx_max_len; . auto/types/value
复制代码
至于auto/types/value
脚本,我们后面的文章会分析。
总结
本文详细的分析了auto/types/sizeof
脚本的功能:测试一个c
语言数据类型在特定操作系统上的长度,根据长度进行不同的操作。
其实我们通过这几篇文章可以发现一个东东,Nginx
的许多脚本都是自动生成的,说实话,我以前看的源码比较少,也没有关注过这种大型工程的配置文件,真的是一种非常巧妙的方法,我们可以多多借鉴。
后面的文章我们会接着分析nginx
的其他辅助脚本,敬请期待。顺便关注我的个公众号(Nginx源码分析
)。
喜欢本文的朋友们,欢迎长按下图关注订阅号Nginx源码分析,更多精彩内容第一时间送达