
# Copyright (C) Igor Sysoev


if [ $PCRE != NONE ]; then
    CORE_INCS="$CORE_INCS $PCRE"
    CORE_DEPS="$CORE_DEPS $REGEX_DEPS"
    CORE_SRCS="$CORE_SRCS $REGEX_SRCS"

    case "$NGX_CC_NAME" in

        msvc* | owc* | bcc)
            have=NGX_PCRE . auto/have
            have=PCRE_STATIC . auto/have
            CORE_DEPS="$CORE_DEPS $PCRE/pcre.h"
            LINK_DEPS="$LINK_DEPS $PCRE/pcre.lib"
            CORE_LIBS="$CORE_LIBS $PCRE/pcre.lib"
        ;;

        icc* | sunc )
            have=NGX_PCRE . auto/have
            CORE_DEPS="$CORE_DEPS $PCRE/pcre.h"

            LINK_DEPS="$LINK_DEPS $PCRE/.libs/libpcre.a"

            echo $ngx_n "checking for PCRE library ...$ngx_c"

            ngx_pcre_ver=`grep PCRE_MAJOR= $PCRE/configure.in \
                          | sed -e 's/^.*=\(.*\)$/\1/'`

            echo " $ngx_pcre_ver major version found"

            # to allow -ipo optimization we link with the *.o but not library

            case "$ngx_pcre_ver" in
                6)
                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_chartables.o"
                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_compile.o"
                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_exec.o"
                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_fullinfo.o"
                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_globals.o"
                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_tables.o"
                    CORE_LIBS="$CORE_LIBS $PCRE/pcre_try_flipped.o"
                ;;

                *)
                    CORE_LIBS="$CORE_LIBS $PCRE/pcre.o"
                ;;
            esac
        ;;

        *)
            have=NGX_PCRE . auto/have
            CORE_DEPS="$CORE_DEPS $PCRE/pcre.h"
            LINK_DEPS="$LINK_DEPS $PCRE/.libs/libpcre.a"
            CORE_LIBS="$CORE_LIBS $PCRE/.libs/libpcre.a"
            #CORE_LIBS="$CORE_LIBS -L $PCRE/.libs -lpcre"
        ;;

    esac

else

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

        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)"
        . auto/feature

        if [ $ngx_found = yes ]; then
            CORE_DEPS="$CORE_DEPS $REGEX_DEPS"
            CORE_SRCS="$CORE_SRCS $REGEX_SRCS"
            CORE_LIBS="$CORE_LIBS $ngx_feature_libs"
            PCRE=YES
            ngx_found=no

        else
            # FreeBSD port

            ngx_feature="PCRE library in /usr/local/"
            ngx_feature_name="NGX_PCRE"
            ngx_feature_run=no
            ngx_feature_incs="#include <pcre.h>"
            ngx_feature_path="/usr/local/include"
            ngx_feature_libs="-L /usr/local/lib -lpcre"
            ngx_feature_test="pcre *re;
                              re = pcre_compile(NULL, 0, NULL, 0, NULL)"
            . auto/feature
        fi

        if [ $ngx_found = yes ]; then
            CORE_DEPS="$CORE_DEPS $REGEX_DEPS"
            CORE_SRCS="$CORE_SRCS $REGEX_SRCS"
            CORE_INCS="$CORE_INCS $ngx_feature_path"
            CORE_LIBS="$CORE_LIBS $ngx_feature_libs"
            PCRE=YES
            ngx_found=no

        else
            # Linux package

            if [ $PCRE = NO ]; then

                ngx_feature="PCRE library in /usr/include/pcre/"
                ngx_feature_name="NGX_PCRE"
                ngx_feature_run=no
                ngx_feature_incs="#include <pcre.h>"
                ngx_feature_path="/usr/include/pcre"
                ngx_feature_libs="-lpcre"
                ngx_feature_test="pcre *re;
                                  re = pcre_compile(NULL, 0, NULL, 0, NULL)"
                . auto/feature
            fi
        fi

        if [ $ngx_found = yes ]; then
            CORE_DEPS="$CORE_DEPS $REGEX_DEPS"
            CORE_SRCS="$CORE_SRCS $REGEX_SRCS"
            CORE_INCS="$CORE_INCS $ngx_feature_path"
            CORE_LIBS="$CORE_LIBS $ngx_feature_libs"
            PCRE=YES
            ngx_found=no

        else
            # NetBSD port

            if [ $PCRE = NO ]; then

                ngx_feature="PCRE library in /usr/pkg/"
                ngx_feature_name="NGX_PCRE"
                ngx_feature_run=no
                ngx_feature_incs="#include <pcre.h>"
                ngx_feature_path="/usr/pkg/include"
                ngx_feature_libs="-L /usr/pkg/lib -lpcre"
                ngx_feature_test="pcre *re;
                                  re = pcre_compile(NULL, 0, NULL, 0, NULL)"
                . auto/feature
            fi
        fi

        if [ $ngx_found = yes ]; then
            CORE_DEPS="$CORE_DEPS $REGEX_DEPS"
            CORE_SRCS="$CORE_SRCS $REGEX_SRCS"
            CORE_INCS="$CORE_INCS $ngx_feature_path"
            CORE_LIBS="$CORE_LIBS $ngx_feature_libs"
            PCRE=YES
            ngx_found=no
        fi

    fi
fi
