configure文件详解
先介绍三个脚本:
auto/options
auto/init
auto/sources
auto/options
设置选项对应的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
自研模块编译到nginx
options:
NGX_SELF_SUP=NO
–with-http_self_support) NGX_SELF_SUP=YES ;;
os/linux:
# enable vpc support
if [ $NGX_SELF_SUP = YES ]; then
have=NGX_SELF_SUP . auto/have
fi
编译时./configure –with-http_self_support
objs/ngx_auto_config.h:
#ifndef NGX_SELF_SUP
#define NGX_SELF_SUP 1
#endif
success
来源:freebuf.com 2020-12-12 18:54:03 by: stan1y
请登录后发表评论
注册