Nginx编译配置脚本篇- UNIX环境脚本auto/unix

Posted 彼方丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx编译配置脚本篇- UNIX环境脚本auto/unix相关的知识,希望对你有一定的参考价值。

1、相关文章

由于学习本文需要Nginx源码及搭建相关的编译环境,且本文与前面的文章有先后呼应关系,所以建议大家按以下文章顺序阅读

2、前言

本文将介绍auto/unix脚本文件,除了win32以外的平台都会使用到该脚本,所以很有必要看一下里面做了什么工作。

3、auto/unix脚本文件详解

3.1、根据当前NGX_USER的设置NGX_GROUP

首先如果在auto/options中没有设置NGX_USER的话,就讲Nginx的账号设置为nobody,然后根据NGX_USER去设置Nginx的用户组也就是NGX_GROUP的值。
代码如下:

NGX_USER=${NGX_USER:-nobody}

if [ -z "$NGX_GROUP" ]; then
    if [ $NGX_USER = nobody ]; then
        if grep nobody /etc/group 2>&1 >/dev/null; then
            echo "checking for nobody group ... found"
            NGX_GROUP=nobody
        else
            echo "checking for nobody group ... not found"

            if grep nogroup /etc/group 2>&1 >/dev/null; then
                echo "checking for nogroup group ... found"
                NGX_GROUP=nogroup
            else
                echo "checking for nogroup group ... not found"
                NGX_GROUP=nobody
            fi
        fi
    else
        NGX_GROUP=$NGX_USER
    fi
fi

3.2、检查当前环境是否支持poll

这段代码也是使用了auto/feature去检查当前环境是否支持poll功能的,可以看到这里ngx_feature_name为空,所以就算系统支持poll也不会往头文件写入宏,如果不支持的话就将EVENT_POLL的值设置为NONE
代码如下:

ngx_feature="poll()"
ngx_feature_name=
ngx_feature_run=no
ngx_feature_incs="#include <poll.h>"
ngx_feature_path=
ngx_feature_libs=
ngx_feature_test="int  n; struct pollfd  pl;
                  pl.fd = 0;
                  pl.events = 0;
                  pl.revents = 0;
                  n = poll(&pl, 1, 0);
                  if (n == -1) return 1"
. auto/feature

if [ $ngx_found = no ]; then
    EVENT_POLL=NONE
fi

3.3、检查当前环境是否支持devpoll

这段代码也是使用了auto/feature去检查当前环境是否支持devpoll功能的,支持的话将NGX_HAVE_DEVPOLL宏写入到$NGX_AUTO_CONFIG_H文件中,并且往$CORE_SRCS后面添加$DEVPOLL_SRCS(在auto/sources中该值被设置成src/event/modules/ngx_devpoll_module.c),往$EVENT_MODULES后面添加$DEVPOLL_MODULE(在auto/sources中该值被设置成ngx_devpoll_module)。
代码如下:

ngx_feature="/dev/poll"
ngx_feature_name="NGX_HAVE_DEVPOLL"
ngx_feature_run=no
ngx_feature_incs="#include <sys/devpoll.h>"
ngx_feature_path=
ngx_feature_libs=
ngx_feature_test="int  n, dp; struct dvpoll  dvp;
                  dp = 0;
                  dvp.dp_fds = NULL;
                  dvp.dp_nfds = 0;
                  dvp.dp_timeout = 0;
                  n = ioctl(dp, DP_POLL, &dvp);
                  if (n == -1) return 1"
. auto/feature

if [ $ngx_found = yes ]; then
    CORE_SRCS="$CORE_SRCS $DEVPOLL_SRCS"
    EVENT_MODULES="$EVENT_MODULES $DEVPOLL_MODULE"
    EVENT_FOUND=YES
fi

3.4、检查当前环境是否支持kqueue

这段代码也是使用了auto/feature去检查当前环境是否支持kqueue功能的,和前面的实现类似,这里就不赘述了。
代码如下:

if test -z "$NGX_KQUEUE_CHECKED"; then
    ngx_feature="kqueue"
    ngx_feature_name="NGX_HAVE_KQUEUE"
    ngx_feature_run=no
    ngx_feature_incs="#include <sys/event.h>"
    ngx_feature_path=
    ngx_feature_libs=
    ngx_feature_test="(void) kqueue()"
    . auto/feature

    if [ $ngx_found = yes ]; then

        have=NGX_HAVE_CLEAR_EVENT . auto/have
        EVENT_MODULES="$EVENT_MODULES $KQUEUE_MODULE"
        CORE_SRCS="$CORE_SRCS $KQUEUE_SRCS"
        EVENT_FOUND=YES

        ngx_feature="kqueue's NOTE_LOWAT"
        ngx_feature_name="NGX_HAVE_LOWAT_EVENT"
        ngx_feature_run=no
        ngx_feature_incs="#include <sys/event.h>"
        ngx_feature_path=
        ngx_feature_libs=
        ngx_feature_test="struct kevent  kev;
                          kev.fflags = NOTE_LOWAT;
                          (void) kev"
        . auto/feature


        ngx_feature="kqueue's EVFILT_TIMER"
        ngx_feature_name="NGX_HAVE_TIMER_EVENT"
        ngx_feature_run=yes
        ngx_feature_incs="#include <sys/event.h>
                          #include <sys/time.h>"
        ngx_feature_path=
        ngx_feature_libs=
        ngx_feature_test="int      kq;
                  struct kevent    kev;
                  struct timespec  ts;

                  if ((kq = kqueue()) == -1) return 1;

                  kev.ident = 0;
                  kev.filter = EVFILT_TIMER;
                  kev.flags = EV_ADD|EV_ENABLE;
                  kev.fflags = 0;
                  kev.data = 1000;
                  kev.udata = 0;

                  ts.tv_sec = 0;
                  ts.tv_nsec = 0;

                  if (kevent(kq, &kev, 1, &kev, 1, &ts) == -1) return 1;

                  if (kev.flags & EV_ERROR) return 1;"

        . auto/feature
    fi
fi

3.5、NetBSD环境下设置NGX_KQUEUE_UDATA_T宏

代码如下:

if [ "$NGX_SYSTEM" = "NetBSD" ]; then

    # NetBSD 2.0 incompatibly defines kevent.udata as "intptr_t"

    cat << END >> $NGX_AUTO_CONFIG_H

#define NGX_KQUEUE_UDATA_T

END

else
    cat << END >> $NGX_AUTO_CONFIG_H

#define NGX_KQUEUE_UDATA_T  (void *)

END

fi

3.6、写入NGX_HAVE_UNIX_DOMAIN宏到头文件

代码如下:

have=NGX_HAVE_UNIX_DOMAIN . auto/have

3.7、调用auto/types/目录下的脚本文件

之前在这一篇文章 Nginx编译配置脚本篇(4)- 工具型脚本系列 中介绍了四个脚本文件,分别是auto/types/sizeofauto/types/typedefauto/types/uintptr_tauto/types/value,没看的读者建议倒回去看一下,这里就是使用这四个脚本文件进行类型的测试之类的工作的。
代码如下:

# C types

ngx_type="int"; . auto/types/sizeof

ngx_type="long"; . auto/types/sizeof

ngx_type="long long"; . auto/types/sizeof

ngx_type="void *"; . auto/types/sizeof; ngx_ptr_size=$ngx_size
ngx_param=NGX_PTR_SIZE; ngx_value=$ngx_size; . auto/types/value


# POSIX types

NGX_INCLUDE_AUTO_CONFIG_H="#include \\"ngx_auto_config.h\\""

ngx_type="uint32_t"; ngx_types="u_int32_t"; . auto/types/typedef
ngx_type="uint64_t"; ngx_types="u_int64_t"; . auto/types/typedef

ngx_type="sig_atomic_t"; ngx_types="int"; . auto/types/typedef
. auto/types/sizeof
ngx_param=NGX_SIG_ATOMIC_T_SIZE; ngx_value=$ngx_size; . auto/types/value

ngx_type="socklen_t"; ngx_types="int"; . auto/types/typedef

ngx_type="in_addr_t"; ngx_types="uint32_t u_int32_t"; . auto/types/typedef

ngx_type="in_port_t"; ngx_types="u_short"; . auto/types/typedef

ngx_type="rlim_t"; ngx_types="int"; . auto/types/typedef

. auto/types/uintptr_t

. auto/endianness

ngx_type="size_t"; . auto/types/sizeof
ngx_param=NGX_MAX_SIZE_T_VALUE; ngx_value=$ngx_max_value; . auto/types/value
ngx_param=NGX_SIZE_T_LEN; ngx_value=$ngx_max_len; . auto/types/value

ngx_type="off_t"; . auto/types/sizeof
ngx_param=NGX_MAX_OFF_T_VALUE; ngx_value=$ngx_max_value; . auto/types/value
ngx_param=NGX_OFF_T_LEN; ngx_value=$ngx_max_len; . auto/types/value

ngx_type="time_t"; . auto/types/sizeof
ngx_param=NGX_TIME_T_SIZE; ngx_value=$ngx_size; . auto/types/value
ngx_param=NGX_TIME_T_LEN; ngx_value=$ngx_max_len; . auto/types/value
ngx_param=NGX_MAX_TIME_T_VALUE; ngx_value=$ngx_max_value; . auto/types/value

3.8、使用auto/feature来检查一系列的函数在当前环境是否被支持

由于auto/unix里面剩余的代码都是auto/feature来实现的,都是在检查当前环境是否支持某些函数,和前面的使用方法类似,这里就不细讲了,读者可以自行去看源代码。

4、总结

本文介绍了auto/unix脚本文件,该脚本会在configure里被调用,且当前平台必须不是win32才能被调用。该文件主要是验证了当前环境的某些函数是否可以使用,并根据情况向$NGX_AUTO_CONFIG_H文件里面写入对应的宏。其中大量使用了这篇文章 Nginx编译配置脚本篇(4)- 工具型脚本系列 里面介绍的脚本,读者不熟悉的话建议倒回去认真看一遍这篇文章。

以上是关于Nginx编译配置脚本篇- UNIX环境脚本auto/unix的主要内容,如果未能解决你的问题,请参考以下文章

Nginx配置编译脚本篇- 解析配置选项脚本auto/options

Nginx编译配置脚本篇- 动态库配置脚本auto/lib/conf

Nginx编译配置脚本篇- Makefile初始化脚本auto/init

Nginx编译配置脚本篇- 编译器相关脚本

Nginx编译配置脚本篇- 工具型脚本系列

Nginx编译配置脚本最终篇 - configure脚本