本节我们主要分析auto/types目录下的4个脚本文件:sizeof脚本
,typedef脚本
,uintptr_t脚本
以及value脚本
。
顾名思义,auto/types目录下的这些脚本主要就是处理类型相关的一些工作。
1. auto/types/sizeof脚本
脚本内容如下:
下面我们对脚本进行分析:
1.1 打印相关提示信息
分别向控制台及autoconf.err文件中打印相应的提示信息:
$ngx_n
与$ngx_c
我们前面讲述过,主要是为了禁止换行。$ngx_type
为当前我们需要检查的数据类型。
1.2 生成并编译程序
将ngx_size值置为空,接着生成objs/autotest.c程序,然后编译。这里$NGX_LD_OPT
与$ngx_feature_libs
值为空.
NGX_INCLUDE_UNISTD_H
与NGX_INCLUDE_INTTYPES_H
通过在auto/headers脚本调用auto/include分别被设置为了#include<unistd.h>
与#include <inttypes.h>
。而NGX_INCLUDE_AUTO_CONFIG_H
会在auto/unix脚本中根据需要进行设置。
1.3 执行程序,并根据执行结果进行处理
判断生成的objs/autotest文件是否可执行,可执行的话则执行程序并将结果保存到ngx_size变量中。然后根据ngx_size的值计算出对应的最大值保存在ngx_max_value变量中,最大长度值保存在ngx_max_len变量中。
1.4 删除生成的测试程序
2. auto/types/typedef脚本
脚本内容如下:
2.1 打印相关提示信息
$ngx_n
与$ngx_c
我们前面讲述过,主要是为了禁止换行。$ngx_type
为当前我们需要检查的数据类型。
2.2 循环检查对应的类型
上面循环检查$ngx_type
与$ngx_types
,尝试找到一个可用的类型。
2.3 后续处理
如果找到的可用类型不是$ngx_type
的话,则用typedef定义之,并将结果写到objs/ngx_auto_config.h头文件中。
3. auto/types/uintptr_t脚本
脚本内容如下:
下面进行脚本分析:
3.1 打印相关提示信息
$ngx_n
与$ngx_c
我们前面讲述过,主要是为了禁止换行。
3.2 生成并编译程序
NGX_INTTYPES_H
在auto/headers脚本调用中被设置:
auto/include脚本如下行:
eval "NGX_$ngx_name='#include <$ngx_include>'"
3.3 执行程序,并根据结果进行处理
判断生成的程序是否可执行,可执行的话将found置为yes,否则会用调用如下语句:
这里$ngx_ptr_size
为我们在文章开头auto/types/sizeof脚本求的当前机器字长(在/auto/unix脚本中调用获得)。
然后将found通过typedef的方式定义成uintptr_t并写入到objs/ngx_auto_config.h头文件中。
4. auto/types/value脚本
脚本内容如下:
向objs/ngx_auto_config.h头文件写入相应的宏定义。