changeset 28751:699bba597610

Use specific configure test to detect RapidJSON PrettyWriter functionality (bug #59114) * configure.ac: Use an AC_COMPILE_IFELSE test to determine whether system has a working RapidJSON PrettyWriter implementation. Rename feature to HAVE_RAPIDJSON_PRETTYWRITER. Us AC_CACHE_CHECK to cache value since compilations are expensive. * jsonencode.cc: Rename HAVE_RAPIDJSON_DEV to HAVE_RAPIDJSON_PRETTYWRITER. Conditionally #include <rapidjson/prettywrite.h> based on HAVE_RAPIDJSON_PRETTYWRITER.
author Rik <rik@octave.org>
date Thu, 17 Sep 2020 07:42:22 -0700
parents 80857685105b
children 810eb29fc227
files configure.ac libinterp/corefcn/jsonencode.cc
diffstat 2 files changed, 32 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/configure.ac	Thu Sep 17 05:07:02 2020 -0700
+++ b/configure.ac	Thu Sep 17 07:42:22 2020 -0700
@@ -1333,20 +1333,34 @@
 
 ### Check for RapidJSON header only library.
 
-AC_LANG_PUSH([C++])
-AC_CHECK_HEADER([rapidjson/rapidjson.h], [have_rapidjson=yes], [have_rapidjson=no
-  rapid_json_warning="RapidJSON library not found.  Octave will not be able to read or write JSON files."])
-if test "$have_rapidjson" = yes; then
-  AC_CHECK_HEADER([rapidjson/cursorstreamwrapper.h], [have_rapidjson_dev=yes], [have_rapidjson_dev=no
-    rapid_json_warning="RapidJSON 1.1.0 or older found.  Octave will not support the 'PrettyWriter' option in 'jsonencode'."])
-fi
-if test "$have_rapidjson" = yes; then
+AC_LANG_PUSH(C++)
+AC_CHECK_HEADER([rapidjson/rapidjson.h],
+                [have_rapidjson=yes], [have_rapidjson=no])
+
+if test $have_rapidjson = yes; then
   AC_DEFINE(HAVE_RAPIDJSON, 1, [Define to 1 if RapidJSON is available.])
-  if test "$have_rapidjson_dev" = yes; then
-    AC_DEFINE(HAVE_RAPIDJSON_DEV, 1, [Define to 1 if the development version of RapidJSON is available.])
+
+  ## Additional check on RapidJSON library that was found
+  AC_CACHE_CHECK([for working PrettyWriter in RapidJSON],
+    [octave_cv_rapidjson_has_prettywriter],
+    [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
+      #include <rapidjson/prettywriter.h>
+      ]], [[
+      rapidjson::StringBuffer json;
+      rapidjson::PrettyWriter<rapidjson::StringBuffer, rapidjson::UTF8<>,
+                              rapidjson::UTF8<>, rapidjson::CrtAllocator,
+                              rapidjson::kWriteNanAndInfFlag> writer (json);
+      ]])],
+      [octave_cv_rapidjson_has_prettywriter=yes],
+      [octave_cv_rapidjson_has_prettywriter=no])
+    ])
+  if test $octave_cv_rapidjson_has_prettywriter = yes; then
+    AC_DEFINE(HAVE_RAPIDJSON_PRETTYWRITER, 1,
+      [Define to 1 if the RapidJSON PrettyWriter function is available.])
+  else
+    rapid_json_warning='Older RapidJSON library found.  The "PrettyWriter" option in jsonencode will be disabled.'
+    OCTAVE_CONFIGURE_WARNING([rapid_json_warning])
   fi
-else
-  OCTAVE_CONFIGURE_WARNING([rapid_json_warning])
 fi
 AC_LANG_POP([C++])
 
--- a/libinterp/corefcn/jsonencode.cc	Thu Sep 17 05:07:02 2020 -0700
+++ b/libinterp/corefcn/jsonencode.cc	Thu Sep 17 07:42:22 2020 -0700
@@ -35,9 +35,11 @@
 #include "ovl.h"
 
 #if defined (HAVE_RAPIDJSON)
-#  include <rapidjson/prettywriter.h>
 #  include <rapidjson/stringbuffer.h>
 #  include <rapidjson/writer.h>
+#  if defined (HAVE_RAPIDJSON_PRETTYWRITER)
+#    include <rapidjson/prettywriter.h>
+#  endif
 #endif
 
 #if defined (HAVE_RAPIDJSON)
@@ -593,11 +595,7 @@
                R"(Valid options are "ConvertInfAndNaN" and "PrettyWriter")");
     }
 
-  // FIXME: RapidJSON 1.1.0 (2016-08-25) is the latest release (2020-08-18)
-  //        and does not support the "PrettyWriter" option.  Once a newer
-  //        RapidJSON version is released and established with major
-  //        distributions, make that version a requirement.
-# if ! defined (HAVE_RAPIDJSON_DEV)
+# if ! defined (HAVE_RAPIDJSON_PRETTYWRITER)
   if (PrettyWriter)
     {
       warn_disabled_feature ("jsonencode",
@@ -609,7 +607,7 @@
   rapidjson::StringBuffer json;
   if (PrettyWriter)
     {
-# if defined (HAVE_RAPIDJSON_DEV)
+# if defined (HAVE_RAPIDJSON_PRETTYWRITER)
       rapidjson::PrettyWriter<rapidjson::StringBuffer, rapidjson::UTF8<>,
                               rapidjson::UTF8<>, rapidjson::CrtAllocator,
                               rapidjson::kWriteNanAndInfFlag> writer (json);
@@ -650,7 +648,7 @@
 %! fail ("jsonencode (1, 'string', ones (2,2))", "option value must be a logical scalar");
 %! fail ("jsonencode (1, 'foobar', true)", 'Valid options are "ConvertInfAndNaN"');
 
-%!testif HAVE_RAPIDJSON; ! __have_feature__ ("HAVE_RAPIDJSON_DEV")
+%!testif HAVE_RAPIDJSON; ! __have_feature__ ("RAPIDJSON_PRETTYWRITER")
 %! fail ("jsonencode (1, 'PrettyWriter', true)", ...
 %!       "warning", 'the "PrettyWriter" option of RapidJSON was unavailable');