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


if [ $PCRE_LIBRARY = PCRE2 ]; then

    # PCRE2

    if [ $NGX_CC_NAME = msvc ]; then

        # With PCRE2, it is not possible to compile all sources.
        # Since list of source files changes between versions, we
        # test files which might not be present.

        ngx_pcre_srcs="pcre2_auto_possess.c \
                       pcre2_chartables.c \
                       pcre2_compile.c \
                       pcre2_config.c \
                       pcre2_context.c \
                       pcre2_dfa_match.c \
                       pcre2_error.c \
                       pcre2_jit_compile.c \
                       pcre2_maketables.c \
                       pcre2_match.c \
                       pcre2_match_data.c \
                       pcre2_newline.c \
                       pcre2_ord2utf.c \
                       pcre2_pattern_info.c \
                       pcre2_string_utils.c \
                       pcre2_study.c \
                       pcre2_substitute.c \
                       pcre2_substring.c \
                       pcre2_tables.c \
                       pcre2_ucd.c \
                       pcre2_valid_utf.c \
                       pcre2_xclass.c"

        ngx_pcre_test="pcre2_convert.c \
                       pcre2_extuni.c \
                       pcre2_find_bracket.c \
                       pcre2_script_run.c \
                       pcre2_serialize.c"

        for ngx_src in $ngx_pcre_test
        do
            if [ -f $PCRE/src/$ngx_src ]; then
                ngx_pcre_srcs="$ngx_pcre_srcs $ngx_src"
            fi
        done

        ngx_pcre_objs=`echo $ngx_pcre_srcs \
            | sed -e "s#\([^ ]*\.\)c#\1$ngx_objext#g"`

        ngx_pcre_srcs=`echo $ngx_pcre_srcs \
            | sed -e "s/  *\([^ ][^ ]*\)/$ngx_regex_cont\1/g"`
        ngx_pcre_objs=`echo $ngx_pcre_objs \
            | sed -e "s/  *\([^ ][^ ]*\)/$ngx_regex_cont\1/g"`

        cat << END                                            >> $NGX_MAKEFILE

PCRE_CFLAGS =	-O2 -Ob1 -Oi -Gs $LIBC $CPU_OPT
PCRE_FLAGS =	-DHAVE_CONFIG_H -DPCRE2_STATIC -DPCRE2_CODE_UNIT_WIDTH=8 \\
		-DHAVE_MEMMOVE

PCRE_SRCS =	 $ngx_pcre_srcs
PCRE_OBJS =	 $ngx_pcre_objs

$PCRE/src/pcre2.h:
	cd $PCRE/src \\
	&& copy /y config.h.generic config.h \\
	&& copy /y pcre2.h.generic pcre2.h \\
	&& copy /y pcre2_chartables.c.dist pcre2_chartables.c

$PCRE/src/pcre2-8.lib:	$PCRE/src/pcre2.h $NGX_MAKEFILE
	cd $PCRE/src \\
	&& cl -nologo -c \$(PCRE_CFLAGS) -I . \$(PCRE_FLAGS) \$(PCRE_SRCS) \\
	&& link -lib -out:pcre2-8.lib -verbose:lib \$(PCRE_OBJS)

END

    else

        cat << END                                            >> $NGX_MAKEFILE

$PCRE/src/pcre2.h:	$PCRE/Makefile

$PCRE/Makefile:	$NGX_MAKEFILE
	cd $PCRE \\
	&& if [ -f Makefile ]; then \$(MAKE) distclean; fi \\
	&& CC="\$(CC)" CFLAGS="$PCRE_OPT" \\
	./configure --disable-shared $PCRE_CONF_OPT

$PCRE/.libs/libpcre2-8.a:	$PCRE/Makefile
	cd $PCRE \\
	&& \$(MAKE) libpcre2-8.la

END

    fi


else

    # PCRE

    case "$NGX_CC_NAME" in

        msvc)
            ngx_makefile=makefile.msvc
            ngx_opt="CPU_OPT=\"$CPU_OPT\" LIBC=$LIBC"
            ngx_pcre="PCRE=\"$PCRE\""
        ;;

        owc)
            ngx_makefile=makefile.owc
            ngx_opt="CPU_OPT=\"$CPU_OPT\""
            ngx_pcre=`echo PCRE=\"$PCRE\" | sed -e "s/\//$ngx_regex_dirsep/g"`
        ;;

        bcc)
            ngx_makefile=makefile.bcc
            ngx_opt="-DCPU_OPT=\"$CPU_OPT\""
            ngx_pcre=`echo \-DPCRE=\"$PCRE\" \
                | sed -e "s/\//$ngx_regex_dirsep/g"`
        ;;

        *)
            ngx_makefile=
        ;;

    esac


    if [ -n "$ngx_makefile" ]; then

        cat << END                                            >> $NGX_MAKEFILE

`echo "$PCRE/pcre.lib:	$PCRE/pcre.h $NGX_MAKEFILE"			\
	| sed -e "s/\//$ngx_regex_dirsep/g"`
	\$(MAKE) -f auto/lib/pcre/$ngx_makefile $ngx_pcre $ngx_opt

`echo "$PCRE/pcre.h:" | sed -e "s/\//$ngx_regex_dirsep/g"`
	\$(MAKE) -f auto/lib/pcre/$ngx_makefile $ngx_pcre pcre.h

END

    else

        cat << END                                            >> $NGX_MAKEFILE

$PCRE/pcre.h:	$PCRE/Makefile

$PCRE/Makefile:	$NGX_MAKEFILE
	cd $PCRE \\
	&& if [ -f Makefile ]; then \$(MAKE) distclean; fi \\
	&& CC="\$(CC)" CFLAGS="$PCRE_OPT" \\
	./configure --disable-shared $PCRE_CONF_OPT

$PCRE/.libs/libpcre.a:	$PCRE/Makefile
	cd $PCRE \\
	&& \$(MAKE) libpcre.la

END

    fi

fi
