执行.configure编译nginx分析 – 作者:stan1y

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

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论