From https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1000041

--- ganglia.orig/configure.ac
+++ ganglia/configure.ac
@@ -520,14 +520,20 @@
   echo "Added -L$libpcrepath/${LIB_SUFFIX} to LDFLAGS"
 fi
 if test x"$libpcre" == xyes ; then
-  AC_CHECK_HEADERS([pcre/pcre.h pcre.h])
-  AC_CHECK_LIB(pcre, pcre_compile)
-  if test x"$ac_cv_lib_pcre_pcre_compile" = xyes; then
-    echo "Found a suitable pcre library"
-  else
-    echo "libpcre not found, specify --with-libpcre=no to build without PCRE support"
-    exit 1;
-  fi
+  AC_CHECK_HEADERS([pcre2.h], [], [], [[#define PCRE2_CODE_UNIT_WIDTH 8]])
+  LIBS="$LIBS -lpcre2-8"
+  AC_MSG_CHECKING([for pcre2_match_data_create in -lpcre2-8])
+  AC_LINK_IFELSE(
+    [AC_LANG_PROGRAM([[#define PCRE2_CODE_UNIT_WIDTH 8
+                       #include <pcre2.h>
+                     ]],
+                     [[pcre2_match_data *md;
+                       md = pcre2_match_data_create (16, NULL);]])],
+    [AC_DEFINE([HAVE_LIBPCRE], [1], [Define if the PCRE2 library is available])
+     AC_MSG_RESULT([yes])
+     AC_MSG_RESULT([Found a suitable pcre library])],
+    [AC_MSG_RESULT([no])
+     AC_MSG_FAILURE([libpcre not found, specify --with-libpcre=no to build without PCRE support], [1])])
 else
   echo "building without PCRE support"
 fi
--- ganglia.orig/gmond/gmond.c
+++ ganglia/gmond/gmond.c
@@ -38,11 +38,8 @@
 #include <apr_version.h>
 
 #ifdef HAVE_LIBPCRE
-#if defined (HAVE_PCRE_PCRE_H)
-#include <pcre/pcre.h>
-#else
-#include <pcre.h>
-#endif
+#define PCRE2_CODE_UNIT_WIDTH 8
+#include <pcre2.h>
 #endif
 
 #include "cmdline.h"   /* generated by cmdline.sh which runs gengetopt */
@@ -2650,10 +2647,11 @@
 
           if(name_match != NULL)
             {
-              pcre *pcre_re;
-              const char *pcre_err_ptr;
-              int pcre_err_offset;
-              int pcre_ovector[PCRE_OVECCOUNT];
+              pcre2_code *pcre_re;
+              pcre2_match_data *pcre_md;
+              int pcre_err_ptr;
+              size_t pcre_err_offset;
+              size_t *pcre_ovector;
               int pcre_rc;
 
               apr_hash_index_t *hi;
@@ -2662,9 +2660,9 @@
               const char *key;
               int found = 0;
 
-              if((pcre_re = pcre_compile(name_match, 0, &pcre_err_ptr, &pcre_err_offset, NULL)) == NULL)
+              if((pcre_re = pcre2_compile((PCRE2_SPTR)name_match, PCRE2_ZERO_TERMINATED, 0, &pcre_err_ptr, &pcre_err_offset, NULL)) == NULL)
                 {
-                  err_msg ("pcre_compile failed on %s\n", name_match);
+                  err_msg ("pcre2_compile failed on %s\n", name_match);
                   exit (1);
                 }
 
@@ -2676,6 +2674,8 @@
 		  exit(EXIT_FAILURE);
                 }
 
+              pcre_md = pcre2_match_data_create(PCRE_OVECCOUNT, NULL);
+
               for(hi = apr_hash_first(p, metric_callbacks);
                   hi;
                   hi = apr_hash_next(hi))
@@ -2683,17 +2683,17 @@
                   Ganglia_metric_callback *cb;
 
                   apr_hash_this(hi, (const void**)&key, NULL, &val);
-                  if((pcre_rc = pcre_exec(pcre_re, NULL, key, strlen(key), 0, 0, pcre_ovector, PCRE_OVECCOUNT)) < 1)
+                  if((pcre_rc = pcre2_match(pcre_re, (PCRE2_SPTR)key, strlen(key), 0, 0, pcre_md, NULL)) < 1)
                     {
                       switch(pcre_rc)
                         {
-                          case PCRE_ERROR_NOMATCH:
+                          case PCRE2_ERROR_NOMATCH:
                             break;
                           case 0:
                             /* output vector not big enough */
                           default:
                             /* unexpected error */
-                            err_msg ("unexpected pcre_exec error\n");
+                            err_msg ("unexpected pcre2_match error\n");
                             exit (1);
                         }
                     }
@@ -2703,6 +2703,8 @@
                       char *title_tmpl = cfg_getstr  ( metric, "title");
                       float value_threshold = cfg_getfloat( metric, "value_threshold");
 
+                      pcre_ovector = pcre2_get_ovector_pointer(pcre_md);
+
                       if(title_tmpl != NULL)
                         {
                           struct iovec *ptrs;
@@ -2772,6 +2774,8 @@
               if (!found)
                   err_msg("Unable to find any metric information for '%s'. Possible that a module has not been loaded.\n", name_match);
  
+              pcre2_match_data_free(pcre_md);
+              pcre2_code_free(pcre_re);
             }
           else
 #endif

