view auto/lib/pcre/make @ 7981:0b5f12d5c531

PCRE2 library support. The PCRE2 library is now used by default if found, instead of the original PCRE library. If needed for some reason, this can be disabled with the --without-pcre2 configure option. To make it possible to specify paths to the library and include files via --with-cc-opt / --with-ld-opt, the library is first tested without any additional paths and options. If this fails, the pcre2-config script is used. Similarly to the original PCRE library, it is now possible to build PCRE2 from sources with nginx configure, by using the --with-pcre= option. It automatically detects if PCRE or PCRE2 sources are provided. Note that compiling PCRE2 10.33 and later requires inttypes.h. When compiling on Windows with MSVC, inttypes.h is only available starting with MSVC 2013. In older versions some replacement needs to be provided ("echo '#include <stdint.h>' > pcre2-10.xx/src/inttypes.h" is good enough for MSVC 2010). The interface on nginx side remains unchanged.
author Maxim Dounin <mdounin@mdounin.ru>
date Sat, 25 Dec 2021 01:07:15 +0300
parents 78f8ac479735
children
line wrap: on
line source


# 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