configure文件详解
主要围绕auto文件夹进行分析
. auto/options
. auto/init
. auto/sources
auto/options
1. 设置选项对应的shell变量以及他们的初始值
help=no
NGX_PREFIX=
NGX_SBIN_PATH=
NGX_CONF_PREFIX=
NGX_CONF_PATH=
NGX_ERROR_LOG_PATH=
NGX_PID_PATH=
NGX_LOCK_PATH=
NGX_USER=
NGX_GROUP=
# 得到此选项的value部分
case "$option" in
-*=*) value=`echo "$option" | sed -e 's/[-_a-zA-Z0-9]*=//'` ;;
*) value="" ;;
esac
# 根据option内容进行匹配,并设置相应的选项
case "$option" in
--help) help=yes ;;
--prefix=) NGX_PREFIX="!" ;;
--prefix=*) NGX_PREFIX="$value" ;;
--sbin-path=*) NGX_SBIN_PATH="$value" ;;
--conf-path=*) NGX_CONF_PATH="$value" ;;
--error-log-path=*) NGX_ERROR_LOG_PATH="$value";;
--pid-path=*) NGX_PID_PATH="$value" ;;
--lock-path=*) NGX_LOCK_PATH="$value" ;;
--user=*) NGX_USER="$value" ;;
--group=*) NGX_GROUP="$value" ;;
...
*)
# 没有找到的对应选项
echo "$0: error: invalid option \"$option\""
exit 1
;;
esac
默认文件路径
NGX_CONF_PATH=${NGX_CONF_PATH:-conf/nginx.conf}
NGX_CONF_PREFIX=dirname $NGX_CONF_PATH
NGX_PID_PATH=${NGX_PID_PATH:-logs/nginx.pid}
NGX_LOCK_PATH=${NGX_LOCK_PATH:-logs/nginx.lock}
auto/init
这块出现了ngx_auto_config.h文件,这个文件就是最终要生成使用的宏的地方
# 生成最终执行编译的makefile文件路径
NGX_MAKEFILE=$NGX_OBJS/Makefile
# 动态生成nginx模块列表的路径,由于nginx的的一些模块是可以选择编译的,而且可以添加自己的模块,所以模块列表是动态生成的
NGX_MODULES_C=$NGX_OBJS/ngx_modules.c
NGX_AUTO_HEADERS_H=$NGX_OBJS/ngx_auto_headers.h
NGX_AUTO_CONFIG_H=$NGX_OBJS/ngx_auto_config.h
# 自动测试目录与日志输出文件
NGX_AUTOTEST=$NGX_OBJS/autotest
# 如果configure出错,可用来查找出错的原因
NGX_AUTOCONF_ERR=$NGX_OBJS/autoconf.err
NGX_ERR=$NGX_OBJS/autoconf.err
MAKEFILE=$NGX_OBJS/Makefile
NGX_PCH=
NGX_USE_PCH=
# 检查echo是否支持-n或\c
# check the echo's "-n" option and "\c" capability
if echo "test\c" | grep c >/dev/null; then
# 不支持-c的方式,检查是否支持-n的方式
if echo -n test | grep n >/dev/null; then
ngx_n=
ngx_c=
else
ngx_n=-n
ngx_c=
fi
else
ngx_n=
ngx_c='\c'
fi
# 创建最初始的makefile文件
# default表示目前编译对象
# clean表示执行clean工作时,需要删除makefile文件以及objs目录
# 整个过程中只会生成makefile文件以及objs目录,其它所有临时文件都在objs目录之下,所以执行clean后,整个目录还原到初始状态
# 要再次执行编译,需要重新执行configure命令
# create Makefile
cat << END > Makefile
default: build
clean:
rm -rf Makefile $NGX_OBJS
END
auto/sources
CORE_SRCS="src/core/nginx.c \
src/core/ngx_log.c \
src/core/ngx_palloc.c \
src/core/ngx_array.c \
src/core/ngx_list.c \
src/core/ngx_hash.c \
src/core/ngx_buf.c \
src/core/ngx_queue.c \
src/core/ngx_output_chain.c \
src/core/ngx_string.c \
src/core/ngx_parse.c \
src/core/ngx_inet.c \
src/core/ngx_file.c \
src/core/ngx_crc32.c \
src/core/ngx_murmurhash.c \
src/core/ngx_md5.c \
src/core/ngx_rbtree.c \
src/core/ngx_trie.c
src/core/ngx_segment_tree.c \
src/core/ngx_radix_tree.c \
src/core/ngx_slab.c \
src/core/ngx_times.c \
src/core/ngx_shmtx.c \
src/core/ngx_connection.c \
src/core/ngx_cycle.c \
src/core/ngx_spinlock.c \
src/core/ngx_cpuinfo.c \
src/core/ngx_conf_file.c \
src/core/ngx_resolver.c \
src/core/ngx_open_file_cache.c \
src/core/ngx_crypt.c \
src/core/ngx_proxy_protocol.c \
src/core/ngx_syslog.c"
auto/have
这个工具的作用是,将$have变量的值,宏定义为1,并输出到auto_config文件中
# Copyright (C) Igor Sysoev
# Copyright (C) Nginx, Inc.
cat << END >> $NGX_AUTO_CONFIG_H
#ifndef $have
#define $have 1
#endif
END
auto/os/conf
操作系统相关的配置的检测,对于我们的linux系统会选择对应的linux脚本
# Copyright (C) Igor Sysoev
# Copyright (C) Nginx, Inc.
NGX_SOEXT=".so"
echo "checking for $NGX_SYSTEM specific features"
case "$NGX_PLATFORM" in
FreeBSD:*)
. auto/os/freebsd
;;
Linux:*)
. auto/os/linux
;;
SunOS:*)
. auto/os/solaris
;;
Darwin:*)
. auto/os/darwin
;;
win32)
. auto/os/win32
;;
auto/os/linux
这块就是判断了NGX_NAMESPACE参数是否设置为yes,是的话,将 CONFIG_NGX_NS这个宏进行定义
# enable namespace
if [ $NGX_NAMESPACE = YES ]; then
have=CONFIG_NGX_NS . auto/have
fi
而这个yes是来自于编译过程中的options脚本,
--with-namespace) NGX_NAMESPACE=YES ;;
./objs/ngx_auto_config.h
#ifndef CONFIG_NGX_NS
#define CONFIG_NGX_NS 1
#endif
VPC_SUP宏定义
options:
NGX_VPC_SUP=NO
--with-http_vpc_support) NGX_VPC_SUP=YES ;;
os/linux:
# enable vpc support
if [ $NGX_VPC_SUP = YES ]; then
have=NGX_VPC_SUP . auto/have
fi
./configure --with-http_vpc_support
objs/ngx_auto_config.h:
#ifndef NGX_VPC_SUP
#define NGX_VPC_SUP 1
#endif
success