nginx源码分析configure脚本详解

2019-10-17 18:38:40于丽

     上面简要介绍了nginx/auto/configure文件中的一些内容,configure并没有把工作全部集中于该文件内部,而是提供了一个框架,具体的工作交由auto/threads、auto/headers等文件来完成,并且采用 . auto/conf 这种调用方式,这样可以做到变量共享;这种做法既简化了configure文件的编写,也不同类型的检查工作拆分开,便于编写、维护。下面就来解答第一部分提出的两个问题:

NGX_PCRE宏定义,这类的宏定义可以在nginx/objs/ngx_auto_config.h中看到,这个文件是由have=$ngx_have_feature . auto/have这样的语句生成的。

################ nginx/auto/have ##############
cat << END >> $NGX_AUTO_CONFIG_H
 
#ifndef $have
#define $have 1
#endif
 
END

     文件中<<符号是来告知shell标准输入来自一对分隔符(可以使字符串、数字等类型,只要保证开头和结尾的一致)中间的内容;所以,have文件中的命令就是利用cat将分隔符END之间的5行内容追加到$NGX_AUTO_CONFIG_H文件中。效果如下:

#ifndef NGX_PCRE
#define NGX_PCRE 1
#endif

     这就回答了第一个问题。 

auto/configure文件中有一行. auto/modules, 这个文件中定义了要注册到nginx中各个模块的信息以及对应的源文件,然后遍历文件中包含所有定义模块名称的变量modules,自动生成ngx_module_t *ngx_modules[]和char *ngx_module_names[]两个数组,并写入到 $NGX_MODULES_C文件中。这就解释了第二个问题中两个数组是从哪里定义的问题了。

############## nginx/auto/modules ################
......
modules="$modules $MISC_MODULES"
 
cat << END                  > $NGX_MODULES_C
 
#include <ngx_config.h>
#include <ngx_core.h>
 
$NGX_PRAGMA
 
END
 
#声明模块为全局变量
for mod in $modules
do
  echo "extern ngx_module_t $mod;"     >> $NGX_MODULES_C
done
 
#定义并初始化ngx_module_t *ngx_modules[] 数组,然后输出重定向到$NGX_MODULES_C
echo                     >> $NGX_MODULES_C
echo 'ngx_module_t *ngx_modules[] = {'    >> $NGX_MODULES_C
 
for mod in $modules
do
  echo "  &$mod,"             >> $NGX_MODULES_C
done
 
cat << END                  >> $NGX_MODULES_C
  NULL
};
 
END
 
#定义并初始化char *ngx_module_names[]数组,然后输出重定向到$NGX_MODULES_C
echo 'char *ngx_module_names[] = {'      >> $NGX_MODULES_C
 
for mod in $modules
do
  echo "  "$mod","           >> $NGX_MODULES_C
done
 
cat << END                  >> $NGX_MODULES_C
  NULL
};
 
END
.......

nginx/auto/modules这个文件生成的两个数组用于cycle的初始化,因此如果开发者开发的模块要添加到nginx中,一定要记得修改nginx/auto/modules这个文件,否则是不会被编译到nginx中的(当然不会生效啦)。