aboutsummaryrefslogtreecommitdiff
path: root/auto
diff options
context:
space:
mode:
authorMaxim Dounin <mdounin@mdounin.ru>2021-12-25 01:07:15 +0300
committerMaxim Dounin <mdounin@mdounin.ru>2021-12-25 01:07:15 +0300
commitc6fec0b027569a4e0b1d8aaee7dea0f2e4d6052b (patch)
tree2ac67a198959d1bf38efc6179bebee93f8b627e6 /auto
parentcddb22cefe8f1c132e00553cb012ca9ab3264c18 (diff)
downloadnginx-c6fec0b027569a4e0b1d8aaee7dea0f2e4d6052b.tar.gz
nginx-c6fec0b027569a4e0b1d8aaee7dea0f2e4d6052b.zip
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.
Diffstat (limited to 'auto')
-rw-r--r--auto/lib/pcre/conf107
-rw-r--r--auto/lib/pcre/make152
-rw-r--r--auto/options3
-rw-r--r--auto/summary4
4 files changed, 223 insertions, 43 deletions
diff --git a/auto/lib/pcre/conf b/auto/lib/pcre/conf
index ab13bf70f..20c1cafbe 100644
--- a/auto/lib/pcre/conf
+++ b/auto/lib/pcre/conf
@@ -5,29 +5,61 @@
if [ $PCRE != NONE ]; then
- have=NGX_PCRE . auto/have
+ if [ -f $PCRE/src/pcre2.h.generic ]; then
- if [ "$NGX_PLATFORM" = win32 ]; then
- have=PCRE_STATIC . auto/have
- fi
+ PCRE_LIBRARY=PCRE2
+
+ have=NGX_PCRE . auto/have
+ have=NGX_PCRE2 . auto/have
+
+ if [ "$NGX_PLATFORM" = win32 ]; then
+ have=PCRE2_STATIC . auto/have
+ fi
+
+ CORE_INCS="$CORE_INCS $PCRE/src/"
+ CORE_DEPS="$CORE_DEPS $PCRE/src/pcre2.h"
- CORE_INCS="$CORE_INCS $PCRE"
- CORE_DEPS="$CORE_DEPS $PCRE/pcre.h"
+ case "$NGX_CC_NAME" in
- case "$NGX_CC_NAME" in
+ msvc)
+ LINK_DEPS="$LINK_DEPS $PCRE/src/pcre2-8.lib"
+ CORE_LIBS="$CORE_LIBS $PCRE/src/pcre2-8.lib"
+ ;;
- msvc | owc | bcc)
- LINK_DEPS="$LINK_DEPS $PCRE/pcre.lib"
- CORE_LIBS="$CORE_LIBS $PCRE/pcre.lib"
- ;;
+ *)
+ LINK_DEPS="$LINK_DEPS $PCRE/.libs/libpcre2-8.a"
+ CORE_LIBS="$CORE_LIBS $PCRE/.libs/libpcre2-8.a"
+ ;;
- *)
- LINK_DEPS="$LINK_DEPS $PCRE/.libs/libpcre.a"
- CORE_LIBS="$CORE_LIBS $PCRE/.libs/libpcre.a"
- ;;
+ esac
+
+ else
+
+ PCRE_LIBRARY=PCRE
+
+ have=NGX_PCRE . auto/have
+
+ if [ "$NGX_PLATFORM" = win32 ]; then
+ have=PCRE_STATIC . auto/have
+ fi
- esac
+ 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 . auto/have
@@ -37,8 +69,48 @@ if [ $PCRE != NONE ]; then
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"
+ . 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`
+ . auto/feature
+ fi
+ fi
+
+ if [ $ngx_found = yes ]; then
+ have=NGX_PCRE . 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"
@@ -114,6 +186,7 @@ else
CORE_INCS="$CORE_INCS $ngx_feature_path"
CORE_LIBS="$CORE_LIBS $ngx_feature_libs"
PCRE=YES
+ PCRE_LIBRARY=PCRE
fi
if [ $PCRE = YES ]; then
diff --git a/auto/lib/pcre/make b/auto/lib/pcre/make
index 97c9f3ba0..839ef294b 100644
--- a/auto/lib/pcre/make
+++ b/auto/lib/pcre/make
@@ -3,36 +3,138 @@
# Copyright (C) Nginx, Inc.
-case "$NGX_CC_NAME" in
+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)
- msvc)
- ngx_makefile=makefile.msvc
- ngx_opt="CPU_OPT=\"$CPU_OPT\" LIBC=$LIBC"
- ngx_pcre="PCRE=\"$PCRE\""
- ;;
+END
+
+ else
+
+ cat << END >> $NGX_MAKEFILE
- owc)
- ngx_makefile=makefile.owc
- ngx_opt="CPU_OPT=\"$CPU_OPT\""
- ngx_pcre=`echo PCRE=\"$PCRE\" | sed -e "s/\//$ngx_regex_dirsep/g"`
- ;;
+$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
- bcc)
- ngx_makefile=makefile.bcc
- ngx_opt="-DCPU_OPT=\"$CPU_OPT\""
- ngx_pcre=`echo \-DPCRE=\"$PCRE\" | sed -e "s/\//$ngx_regex_dirsep/g"`
- ;;
+$PCRE/.libs/libpcre2-8.a: $PCRE/Makefile
+ cd $PCRE \\
+ && \$(MAKE) libpcre2-8.la
- *)
- ngx_makefile=
- ;;
+END
-esac
+ fi
-if [ -n "$ngx_makefile" ]; then
+else
- cat << END >> $NGX_MAKEFILE
+ # 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"`
@@ -43,9 +145,9 @@ if [ -n "$ngx_makefile" ]; then
END
-else
+ else
- cat << END >> $NGX_MAKEFILE
+ cat << END >> $NGX_MAKEFILE
$PCRE/pcre.h: $PCRE/Makefile
@@ -61,4 +163,6 @@ $PCRE/.libs/libpcre.a: $PCRE/Makefile
END
+ fi
+
fi
diff --git a/auto/options b/auto/options
index 80be906e1..48f3a1a42 100644
--- a/auto/options
+++ b/auto/options
@@ -146,6 +146,7 @@ PCRE=NONE
PCRE_OPT=
PCRE_CONF_OPT=
PCRE_JIT=NO
+PCRE2=YES
USE_OPENSSL=NO
OPENSSL=NONE
@@ -357,6 +358,7 @@ use the \"--with-mail_ssl_module\" option instead"
--with-pcre=*) PCRE="$value" ;;
--with-pcre-opt=*) PCRE_OPT="$value" ;;
--with-pcre-jit) PCRE_JIT=YES ;;
+ --without-pcre2) PCRE2=DISABLED ;;
--with-openssl=*) OPENSSL="$value" ;;
--with-openssl-opt=*) OPENSSL_OPT="$value" ;;
@@ -573,6 +575,7 @@ cat << END
--with-pcre=DIR set path to PCRE library sources
--with-pcre-opt=OPTIONS set additional build options for PCRE
--with-pcre-jit build PCRE with JIT compilation support
+ --without-pcre2 do not use PCRE2 library
--with-zlib=DIR set path to zlib library sources
--with-zlib-opt=OPTIONS set additional build options for zlib
diff --git a/auto/summary b/auto/summary
index 9aa776edf..b3c07eedc 100644
--- a/auto/summary
+++ b/auto/summary
@@ -16,9 +16,9 @@ if [ $USE_PCRE = DISABLED ]; then
else
case $PCRE in
- YES) echo " + using system PCRE library" ;;
+ YES) echo " + using system $PCRE_LIBRARY library" ;;
NONE) echo " + PCRE library is not used" ;;
- *) echo " + using PCRE library: $PCRE" ;;
+ *) echo " + using $PCRE_LIBRARY library: $PCRE" ;;
esac
fi