wolfSSL: Use LIBWOLFSSL_VERSION_HEX to decide whether or not to use WOLFSSL_X509_V_OK
[privoxy.git] / configure.in
index 7d3341d..1f7256d 100644 (file)
@@ -1,6 +1,6 @@
 dnl Process this file with autoconf to produce a configure script.
 dnl
-dnl Written by and Copyright (C) 2001-2020 the
+dnl Written by and Copyright (C) 2001-2023 the
 dnl Privoxy team. https://www.privoxy.org/
 dnl
 dnl Based on the Internet Junkbuster originally written
@@ -73,20 +73,19 @@ DB2HTML=$withval
 dnl =================================================================
 dnl Application version number
 dnl =================================================================
+dnl CODE_STATUS can be "alpha", "beta", "stable" or "UNRELEASED",
+dnl and will be used for CGI output. Increment version number and
+dnl set status to "UNRELEASED" whenever git differs from the last
+dnl release and no new release is near.
 
 VERSION_MAJOR=3
 VERSION_MINOR=0
-VERSION_POINT=29
+VERSION_POINT=35
 CODE_STATUS="UNRELEASED"
 
 dnl Timestamp (date +%s) used by the mtree-spec target.
 dnl Should be updated before releases but forgetting it isn't critical.
-SOURCE_DATE_EPOCH=1605695571
-
-dnl CODE_STATUS can be "alpha", "beta", "stable" or "UNRELEASED",
-dnl and will be used for CGI output. Increment version number and
-dnl set status to "UNRELEASED" whenever CVS differs from the last
-dnl release and no new release is near.
+SOURCE_DATE_EPOCH=1672586827
 
 dnl =================================================================
 dnl Substitute the version numbers
@@ -158,6 +157,29 @@ AC_ARG_WITH(debug,
         ]
 )
 
+AC_ARG_WITH(assertions, [  --with-assertions       Enable assertions])
+if test "x$with_assertions" != "xyes"; then
+    CFLAGS="$CFLAGS -DNDEBUG"
+fi
+
+AC_ARG_WITH(asan, [  --with-asan       Enable AddressSanitizer. Requires compiler support.])
+if test "x$with_asan" = "xyes"; then
+    CFLAGS="$CFLAGS -fsanitize=address"
+    LDFLAGS="$LDFLAGS -fsanitize=address"
+fi
+
+AC_ARG_WITH(msan, [  --with-msan       Enable MemorySanitizer. Requires compiler support.])
+if test "x$with_msan" = "xyes"; then
+    CFLAGS="$CFLAGS -fsanitize=memory"
+    LDFLAGS="$LDFLAGS -fsanitize=memory"
+fi
+
+AC_ARG_WITH(usan, [  --with-usan       Enable UndefinedBehaviorSanitizer. Requires compiler support.])
+if test "x$with_usan" = "xyes"; then
+    CFLAGS="$CFLAGS -fsanitize=undefined"
+    LDFLAGS="$LDFLAGS -fsanitize=undefined"
+fi
+
 dnl =================================================================
 dnl Check for user and group validity
 dnl =================================================================
@@ -194,7 +216,7 @@ else
         ],
         [
           if test $ID = no ; then
-            AC_MSG_ERROR(There is no 'id' programm on this system)
+            AC_MSG_ERROR(There is no 'id' program on this system)
           else
             AC_MSG_RESULT(none specified)
             USER=$with_user
@@ -233,7 +255,7 @@ else
         ],
         [
           if test $BGROUPS = no ; then
-            AC_MSG_ERROR(There is no 'groups' programm on this system)
+            AC_MSG_ERROR(There is no 'groups' program on this system)
           else
             AC_MSG_RESULT(none specified)
             GROUP=$with_group;
@@ -339,16 +361,6 @@ fi
 AC_SUBST(W3M)
 AC_SUBST(DB2HTML)
 
-dnl If we use rpm, we need to check where %_topdir is
-AC_CHECK_PROGS(RPMBIN,rpm,false)
-if test $RPMBIN != false; then
-               RPM_BASE=`rpm --eval "%{_topdir}"`
-               if test "$RPM_BASE" = ""; then
-                       RPM_BASE=/usr/src/redhat
-               fi
-fi
-AC_SUBST(RPM_BASE)
-
 dnl prefer openjade to jade
 dnl Check for jade, so we can build the documentation
 AC_CHECK_PROGS(JADEBIN,openjade jade,false)
@@ -423,7 +435,7 @@ fi])
 
 AC_ARG_ENABLE(static-linking,
 [  --enable-static-linking         Use static linking instead of dynamic linking (ie. LDFLAGS=-static)],
-[ if test $enableval = yes; then LDFLAGS="$LDFLAGS -static"; fi ])
+[ if test $enableval = yes; then LDFLAGS="$LDFLAGS -static"; use_static_pcre="yes"; fi ])
 
 dnl Save old CFLAGS so we can restore them later, then add SPECIAL_CFLAGS
 old_CFLAGS_nospecial=$CFLAGS
@@ -447,9 +459,10 @@ AC_ARG_ENABLE(pthread,
 [  --disable-pthread               Don't use POSIX threads (pthreads)],
 [if test $enableval = no; then
   # Disable pthreads
-  if test $have_pthread = yes; then
+  if test $have_pthread = yes -a $target_type != mingw; then
      AC_MSG_WARN([pthreads seem to be available but you are using --disable-pthread.])
      AC_MSG_WARN([This is almost always a mistake and can render Privoxy unacceptable slow.])
+     AC_MSG_WARN([Also various Privoxy features only work when using threads and won't even compile without them.])
   fi
   have_pthread=no
 fi])
@@ -602,9 +615,9 @@ AC_CHECK_FUNC(gmtime_r, [
   AC_TRY_COMPILE([
 #   include <time.h>
   ], [
-    struct time *t;
-    struct tm *tm;
-    (void) gmtime_r(t, tm)
+    time_t t;
+    struct tm tm;
+    (void) gmtime_r(&t, &tm)
   ], [
     AC_MSG_RESULT(ok)
     AC_DEFINE(HAVE_GMTIME_R)
@@ -620,9 +633,9 @@ AC_CHECK_FUNC(localtime_r, [
   AC_TRY_COMPILE([
 #   include <time.h>
   ], [
-    struct time *t;
-    struct tm *tm;
-    (void) localtime_r(t, tm)
+    time_t t;
+    struct tm tm;
+    (void) localtime_r(&t, &tm)
   ], [
     AC_MSG_RESULT(ok)
     AC_DEFINE(HAVE_LOCALTIME_R)
@@ -677,17 +690,6 @@ AC_EGREP_HEADER(socklen_t, sys/socket.h, AC_MSG_RESULT([yes]),
 
 fi
 
-dnl =================================================================
-dnl OS/2 specific
-dnl =================================================================
-
-case "$host" in
-*-os2-emx*) SOCKET_LIB=-lsocket
-;;
-esac
-
-AC_SUBST(SOCKET_LIB)
-
 dnl =================================================================
 dnl Mac OSX specific
 dnl =================================================================
@@ -768,8 +770,6 @@ AC_CHECK_HEADERS([ \
 ])
 
 dnl Checks for library functions.
-dnl bcopy is for PCRE
-AC_CHECK_FUNCS([bcopy])
 AC_PROG_GCC_TRADITIONAL
 AC_TYPE_SIGNAL
 AC_CHECK_FUNCS([ \
@@ -863,12 +863,48 @@ else
   ])
 fi
 
+AC_ARG_ENABLE(pcre2,
+[  --disable-pcre2                  Don't try to use pcre2 even if it's available],
+[enableval2=$enableval],
+[enableval2=yes])
+if test $enableval2 = yes; then
+  try_pcre2=yes
+else
+  AC_MSG_WARN([Ignoring pcre2 even if it's available])
+  try_pcre2=no
+  have_pcre2=no
+fi
+
+if test $try_pcre2 != no; then
 dnl =================================================================
 dnl Checks for libraries.
 dnl =================================================================
 dnl Note: Some systems may have the library but not the system header
 dnl       file, so we must check for both.
 dnl       Also check for correct version
+AC_CHECK_LIB(pcre2-8, pcre2_compile_8, [
+   AC_CHECK_HEADER(pcre2.h, [
+      AC_EGREP_HEADER(pcre2_pattern_info, pcre2.h,[have_pcre2=yes; AC_DEFINE(HAVE_PCRE2)], [AC_MSG_WARN([[pcre2 old version installed]]); have_pcre2=no])
+   ], [
+      AC_CHECK_HEADER(pcre2/pcre2.h, [
+         AC_EGREP_HEADER(pcre2_pattern_info, pcre2/pcre2.h, [have_pcre2=yes; AC_DEFINE(PCRE2_H_IN_SUBDIR)], [AC_MSG_WARN([[pcre2 old version installed]]); have_pcre2=no])
+      ], [have_pcre2=no])
+   ], [#define PCRE2_CODE_UNIT_WIDTH 8])
+], [have_pcre2=no])
+
+AC_CHECK_LIB(pcre2-posix, regcomp, [
+   AC_CHECK_HEADER(pcre2posix.h, [
+      AC_EGREP_HEADER(pcre2_regerror, pcre2posix.h, [have_pcre2posix=yes],[AC_MSG_WARN([[pcre2posix old version installed]]); have_pcre2posix=no])
+   ], [
+      AC_CHECK_HEADER(pcre/pcre2posix.h, [
+         AC_EGREP_HEADER(pcre2_regerror, pcre2/pcre2posix.h,  [have_pcre2posix=yes; AC_DEFINE(PCRE2POSIX_H_IN_SUBDIR)],[AC_MSG_WARN([[pcre2posix old version installed]]); have_pcre2posix=no])
+      ], [have_pcre2posix=no])
+   ])
+], [have_pcre2posix=no], -lpcre2-8)
+fi
+
+if test $have_pcre2 = "no"; then
+
 AC_CHECK_LIB(pcre, pcre_compile, [
    AC_CHECK_HEADER(pcre.h, [
       AC_EGREP_HEADER(pcre_fullinfo, pcre.h, [have_pcre=yes], [AC_MSG_WARN([[pcre old version installed]]); have_pcre=no])
@@ -889,6 +925,7 @@ AC_CHECK_LIB(pcreposix, regcomp, [
    ])
 ], [have_pcreposix=no], -lpcre)
 
+fi
 dnl ================================================================
 dnl libpcrs is temporarily disabled.
 dnl
@@ -992,6 +1029,12 @@ AC_ARG_ENABLE(pcre-host-patterns,
   AC_DEFINE(FEATURE_PCRE_HOST_PATTERNS)
 fi])
 
+AC_ARG_ENABLE(pcre-jit-compilation,
+[  --disable-pcre-jit-compilation     Don't let pcrs use pcre JIT compilation even if pcre supports it.],
+[if test $enableval != yes; then
+  AC_DEFINE(DISABLE_PCRE_JIT_COMPILATION)
+fi])
+
 AC_ARG_ENABLE(external-filters,
 [  --enable-external-filters       Allow to filter content with scripts and programs. Experimental.],
 [if test $enableval = yes; then
@@ -1089,20 +1132,56 @@ fi
 # we don't need pcreposix, then link pcre dynamically; else
 # build it and link statically
 #
+
+#check for libpcre2 first. then regular pcre
+
+if test $have_pcre2 = "yes"; then
+  echo "using libpcre2"
+  STATIC_PCRE_ONLY=#
+  LIBS="$LIBS -lpcre2-8 -lpcre2-posix"
+  if test "$use_static_pcre" = "yes"; then
+    pcre_dyn=no
+    AC_DEFINE(PCRE2_STATIC,1,[Define to statically link to the pcre2 library on Windows.])
+#     see pcre2-10.42/src/pcre2.h line 54
+#       #if defined(_WIN32) && !defined(PCRE2_STATIC)
+#       #  ifndef PCRE2_EXP_DECL
+#       #    define PCRE2_EXP_DECL  extern __declspec(dllimport)
+#       #  endif
+#       #endif
+#     If you want to statically link a program against a PCRE2 library in the form of
+#     a non-dll .a file, you must define PCRE2_STATIC before including src/pcre2.h.
+#     Otherwise the exported functions will be declared __declspec(dllimport),
+#     with unwanted results.  eg: build failures with error messages like
+#       undefined reference to `_imp__pcre2_compile_8'
+  else
+    pcre_dyn=yes
+    AC_DEFINE(FEATURE_DYNAMIC_PCRE,1,[Define to dynamically link to pcre.])
+  fi
+else
+
 if test $have_pcre = "yes"; then
   echo "using libpcre"
-  pcre_dyn=yes
-  AC_DEFINE(FEATURE_DYNAMIC_PCRE,1,[Define to dynamically link to pcre.])
   STATIC_PCRE_ONLY=#
   LIBS="$LIBS -lpcre -lpcreposix"
+  if test "$use_static_pcre" = "yes"; then
+    pcre_dyn=no
+    AC_DEFINE(PCRE_STATIC,1,[Define to statically link to pcre library on Windows.])
+#     see /usr/i686-w64-mingw32/sys-root/mingw/include/pcre.h line 54
+#       #if defined(_WIN32) && !defined(PCRE_STATIC)
+#       #  ifndef PCRE_EXP_DECL
+#       #    define PCRE_EXP_DECL  extern __declspec(dllimport)
+#       #  endif
+#     If you want to statically link a program against a PCRE library in the form of
+#     a non-dll .a file, you must define PCRE_STATIC before including pcre.h or
+#     pcrecpp.h, otherwise the pcre_malloc() and pcre_free() exported functions will
+#     be declared __declspec(dllimport), with unwanted results.
+  else
+    pcre_dyn=yes
+    AC_DEFINE(FEATURE_DYNAMIC_PCRE,1,[Define to dynamically link to pcre.])
+  fi
 else
-  AC_MSG_WARN([You are using the static PCRE code which is out of date and scheduled for removal, for details see:
-    http://sourceforge.net/mailarchive/forum.php?thread_name=20080511195555.2dc6cfdc%40fabiankeil.de&forum_name=ijbswa-developers])
-  pcre_dyn=no
-  # STATIC_PCRE is a name pcre needs to statically link on Windows.
-  # Privoxy itself no longer uses it.
-  AC_DEFINE(STATIC_PCRE,1,[Define to statically link to internal outdated pcre on Windows.])
-  STATIC_PCRE_ONLY=
+  AC_MSG_ERROR(Detected neither pcre2 nor pcre library.)
+fi
 fi
 
 AC_DEFINE(FEATURE_CONNECTION_KEEP_ALIVE)
@@ -1135,7 +1214,7 @@ AC_SUBST(STATIC_PCRS_ONLY)
 
 FEATURE_HTTPS_INSPECTION_ONLY=#
 dnl ========================================================
-dnl check for mbedTLS which is required for https inspection
+dnl check for mbedTLS which can be used for https inspection
 dnl ========================================================
 FEATURE_HTTPS_INSPECTION_ONLY_MBEDTLS=#
 OPT_MBEDTLS=no
@@ -1167,7 +1246,7 @@ fi
 AC_SUBST(FEATURE_HTTPS_INSPECTION_ONLY_MBEDTLS)
 
 dnl =================================================================
-dnl check for OpenSSL/LibreSSL which is required for https inspection
+dnl check for OpenSSL/LibreSSL which can be used for https inspection
 dnl =================================================================
 FEATURE_HTTPS_INSPECTION_ONLY_OPENSSL=#
 OPT_OPENSSL=no
@@ -1177,6 +1256,10 @@ AC_HELP_STRING([--without-openssl], [Disable OpenSSL/LibreSSL detection]),
   OPT_OPENSSL=$withval)
 
 if test X"$OPT_OPENSSL" != Xno; then
+   if test X"$OPT_MBEDTLS" != Xno; then
+      AC_MSG_ERROR([OpenSSL and mbedTLS support can't be enabled at the same time])
+   fi
+
   if test "$PORTNAME" != "win32"; then
      AC_CHECK_LIB(crypto, CRYPTO_new_ex_data, [], [AC_MSG_ERROR([library 'crypto' is required for OpenSSL])])
      FOUND_SSL_LIB="no"
@@ -1201,6 +1284,7 @@ if test X"$OPT_OPENSSL" != Xno; then
 
   if test "x$FEATURE_HTTPS_INSPECTION_OPENSSL" = "xyes"; then
     AC_MSG_NOTICE([Detected OpenSSL. Enabling https inspection.])
+    AC_MSG_WARN([If you intend to redistribute Privoxy, please make sure the "special exception" from section 3 of the GPLv2 applies.])
 
     LIBS="$LIBS -lssl -lcrypto"
     old_CFLAGS_nospecial="$old_CFLAGS_nospecial"
@@ -1211,6 +1295,45 @@ if test X"$OPT_OPENSSL" != Xno; then
 fi
 AC_SUBST(FEATURE_HTTPS_INSPECTION_ONLY_OPENSSL)
 
+dnl ========================================================
+dnl check for wolfSSL which can be used for https inspection
+dnl ========================================================
+FEATURE_HTTPS_INSPECTION_ONLY_WOLFSSL=#
+OPT_WOLFSSL=no
+AC_ARG_WITH(wolfssl,dnl
+AC_HELP_STRING([--with-wolfssl], [Enable Wolfssl/LibreSSL detection for https inspection.])
+AC_HELP_STRING([--without-wolfssl], [Disable Wolfssl/LibreSSL detection]),
+  OPT_WOLFSSL=$withval)
+
+if test X"$OPT_WOLFSSL" != Xno; then
+    if test X"$OPT_MBEDTLS" != Xno; then
+        AC_MSG_ERROR([wolfSSL and mbedTLS support can't be enabled at the same time])
+    fi
+    if test X"$OPT_OPENSSL" != Xno; then
+        AC_MSG_ERROR([wolfSSL and OpenSSL support can't be enabled at the same time])
+    fi
+
+    AC_CHECK_LIB(wolfssl, wolfSSL_Init, [HAVE_WOLFSSL_INIT="yes"])
+
+    if test "x$HAVE_WOLFSSL_INIT" = "xyes"; then
+        AC_DEFINE(FEATURE_HTTPS_INSPECTION, 1, [if SSL/TLS is enabled])
+        AC_DEFINE(FEATURE_HTTPS_INSPECTION_WOLFSSL, 1, [if Wolfssl is enabled])
+        AC_SUBST(FEATURE_HTTPS_INSPECTION_WOLFSSL, [1])
+        FEATURE_HTTPS_INSPECTION="yes"
+        FEATURE_HTTPS_INSPECTION_WOLFSSL="yes"
+    fi
+
+    if test "x$FEATURE_HTTPS_INSPECTION_WOLFSSL" = "xyes"; then
+    AC_MSG_NOTICE([Detected wolfSSL. Enabling https inspection.])
+
+    LIBS="$LIBS -lwolfssl"
+
+    FEATURE_HTTPS_INSPECTION_ONLY=
+    FEATURE_HTTPS_INSPECTION_ONLY_WOLFSSL=
+  fi
+fi
+AC_SUBST(FEATURE_HTTPS_INSPECTION_ONLY_WOLFSSL)
+
 AC_SUBST(FEATURE_HTTPS_INSPECTION_ONLY)
 
 dnl ========================================================
@@ -1225,6 +1348,10 @@ AC_HELP_STRING([--without-brotli], [Disable Brotli detection]),
 if test X"$WITH_BROTLI" != Xno; then
 
   LIBS="$LIBS -lbrotlidec"
+  if test $target_type = mingw; then
+    # XXX: why does just the mingw build need this???
+    LIBS="$LIBS -lbrotlicommon -lbrotlienc"
+  fi
 
   AC_CHECK_LIB(brotlidec, BrotliDecoderDecompress)