
# Copyright (C) Igor Sysoev
# Copyright (C) Nginx, Inc.


if [ $PCRE != NONE ]; then

    if [ -f $PCRE/src/pcre2.h.generic ]; then

        PCRE_LIBRARY=PCRE2

        have=NGX_PCRE . $NGX_AUTO/have
        have=NGX_PCRE2 . $NGX_AUTO/have

        if [ "$NGX_PLATFORM" = win32 ]; then
            have=PCRE2_STATIC . $NGX_AUTO/have
        fi

        CORE_INCS="$CORE_INCS $PCRE/src/"
        CORE_DEPS="$CORE_DEPS $PCRE/src/pcre2.h"

        case "$NGX_CC_NAME" in

            msvc)
                LINK_DEPS="$LINK_DEPS $PCRE/src/pcre2-8.lib"
                CORE_LIBS="$CORE_LIBS $PCRE/src/pcre2-8.lib"
            ;;

            *)
                LINK_DEPS="$LINK_DEPS $PCRE/.libs/libpcre2-8.a"
                CORE_LIBS="$CORE_LIBS $PCRE/.libs/libpcre2-8.a"
            ;;

        esac

    else

        PCRE_LIBRARY=PCRE

        have=NGX_PCRE . $NGX_AUTO/have

        if [ "$NGX_PLATFORM" = win32 ]; then
            have=PCRE_STATIC . $NGX_AUTO/have
        fi

        CORE_INCS="$CORE_INCS $PCRE"
        CORE_DEPS="$CORE_DEPS $PCRE/pcre.h"

        case "$NGX_CC_NAME" in

            msvc | owc | bcc)
                LINK_DEPS="$LINK_DEPS $PCRE/pcre.lib"
                CORE_LIBS="$CORE_LIBS $PCRE/pcre.lib"
            ;;

            *)
                LINK_DEPS="$LINK_DEPS $PCRE/.libs/libpcre.a"
                CORE_LIBS="$CORE_LIBS $PCRE/.libs/libpcre.a"
            ;;

        esac
    fi

    if [ $PCRE_JIT = YES ]; then
        have=NGX_HAVE_PCRE_JIT . $NGX_AUTO/have
        PCRE_CONF_OPT="$PCRE_CONF_OPT --enable-jit"
    fi

else

    if [ "$NGX_PLATFORM" != win32 ]; then
        PCRE=NO
    fi

    if [ $PCRE = NO -a $PCRE2 != DISABLED ]; then

        ngx_feature="PCRE2 library"
        ngx_feature_name="NGX_PCRE2"
        ngx_feature_run=no
        ngx_feature_incs="#define PCRE2_CODE_UNIT_WIDTH 8
                          #include <pcre2.h>"
        ngx_feature_path=
        ngx_feature_libs="-lpcre2-8"
        ngx_feature_test="pcre2_code *re;
                          re = pcre2_compile(NULL, 0, 0, NULL, NULL, NULL);
                          if (re == NULL) return 1"
        . $NGX_AUTO/feature

        if [ $ngx_found = no ]; then

            # pcre2-config

            ngx_pcre2_prefix=`pcre2-config --prefix 2>/dev/null`

            if [ -n "$ngx_pcre2_prefix" ]; then
                ngx_feature="PCRE2 library in $ngx_pcre2_prefix"
                ngx_feature_path=`pcre2-config --cflags \
                                  | sed -n -e 's/.*-I *\([^ ][^ ]*\).*/\1/p'`
                ngx_feature_libs=`pcre2-config --libs8`
                . $NGX_AUTO/feature
            fi
        fi

        if [ $ngx_found = yes ]; then
            have=NGX_PCRE . $NGX_AUTO/have
            CORE_INCS="$CORE_INCS $ngx_feature_path"
            CORE_LIBS="$CORE_LIBS $ngx_feature_libs"
            PCRE=YES
            PCRE_LIBRARY=PCRE2
        fi
    fi

    if [ $PCRE = NO ]; then

        ngx_feature="PCRE library"
        ngx_feature_name="NGX_PCRE"
        ngx_feature_run=no
        ngx_feature_incs="#include <pcre.h>"
        ngx_feature_path=
        ngx_feature_libs="-lpcre"
        ngx_feature_test="pcre *re;
                          re = pcre_compile(NULL, 0, NULL, 0, NULL);
                          if (re == NULL) return 1"
        . $NGX_AUTO/feature

        if [ $ngx_found = no ]; then

            # FreeBSD port

            ngx_feature="PCRE library in /usr/local/"
            ngx_feature_path="/usr/local/include"

            if [ $NGX_RPATH = YES ]; then
                ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lpcre"
            else
                ngx_feature_libs="-L/usr/local/lib -lpcre"
            fi

            . $NGX_AUTO/feature
        fi

        if [ $ngx_found = no ]; then

            # RedHat RPM, Solaris package

            ngx_feature="PCRE library in /usr/include/pcre/"
            ngx_feature_path="/usr/include/pcre"
            ngx_feature_libs="-lpcre"

            . $NGX_AUTO/feature
        fi

        if [ $ngx_found = no ]; then

            # NetBSD port

            ngx_feature="PCRE library in /usr/pkg/"
            ngx_feature_path="/usr/pkg/include"

            if [ $NGX_RPATH = YES ]; then
                ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lpcre"
            else
                ngx_feature_libs="-L/usr/pkg/lib -lpcre"
            fi

            . $NGX_AUTO/feature
        fi

        if [ $ngx_found = no ]; then

            # MacPorts

            ngx_feature="PCRE library in /opt/local/"
            ngx_feature_path="/opt/local/include"

            if [ $NGX_RPATH = YES ]; then
                ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lpcre"
            else
                ngx_feature_libs="-L/opt/local/lib -lpcre"
            fi

            . $NGX_AUTO/feature
        fi

        if [ $ngx_found = yes ]; then
            CORE_INCS="$CORE_INCS $ngx_feature_path"
            CORE_LIBS="$CORE_LIBS $ngx_feature_libs"
            PCRE=YES
            PCRE_LIBRARY=PCRE
        fi

        if [ $PCRE = YES ]; then
            ngx_feature="PCRE JIT support"
            ngx_feature_name="NGX_HAVE_PCRE_JIT"
            ngx_feature_test="int jit = 0;
                              pcre_free_study(NULL);
                              pcre_config(PCRE_CONFIG_JIT, &jit);
                              if (jit != 1) return 1;"
            . $NGX_AUTO/feature

            if [ $ngx_found = yes ]; then
                PCRE_JIT=YES
            fi
        fi
    fi

    if [ $PCRE != YES ]; then
cat << END

$0: error: the HTTP rewrite module requires the PCRE library.
You can either disable the module by using --without-http_rewrite_module
option, or install the PCRE library into the system, or build the PCRE library
statically from the source with nginx by using --with-pcre=<path> option.

END
        exit 1
    fi

fi
