~ruther/guix-local

e34bf9b63423f5846fa3b03be0c970cb3d33ac33 — David Elsing 3 years ago c152902
gnu: Add sajson.

* gnu/packages/cpp.scm (sajson): New variable.

Signed-off-by: Liliana Marie Prikler <liliana.prikler@gmail.com>
2 files changed, 110 insertions(+), 0 deletions(-)

M gnu/packages/cpp.scm
A gnu/packages/patches/sajson-build-with-gcc10.patch
M gnu/packages/cpp.scm => gnu/packages/cpp.scm +65 -0
@@ 57,6 57,7 @@
  #:use-module (guix build-system gnu)
  #:use-module (guix build-system meson)
  #:use-module (guix build-system python)
  #:use-module (guix build-system scons)
  #:use-module (guix modules)
  #:use-module (guix gexp)
  #:use-module (gnu packages)


@@ 2036,3 2037,67 @@ functions for the float and double types.")
computing Fast Fourier transformations.  It supports multidimensional arrays,
different floating point sizes and complex transformations.")
      (license license:bsd-3))))

(define-public sajson
  (let ((commit "ec644013e34f9984a3cc9ba568cab97a391db9cd")
        (revision "0"))
    (package
      (name "sajson")
      (version (git-version "1.0" revision commit))
      (source (origin
                (method git-fetch)
                (uri (git-reference
                      (url "https://github.com/chadaustin/sajson")
                      (commit commit)))
                (file-name (git-file-name name version))
                (patches
                 (search-patches "sajson-build-with-gcc10.patch"))
                (sha256
                 (base32
                  "0fjag27w7gvkc5pdhq3ad7yc09rabpzahndw1sgsg04ipznidmmq"))
                (modules '((guix build utils)))
                (snippet '(delete-file-recursively "third-party"))))
      (build-system scons-build-system)
      (arguments
       (list
        #:phases
        #~(modify-phases %standard-phases
            (add-after 'unpack 'disable-other-builds
              (lambda _
                (substitute* "SConstruct"
                  (("for name, tools in builds:")
                   "for name, tools in [('opt', [gcc, opt])]:"))))
            (add-after 'unpack 'use-external-unittest-cpp
              (lambda _
                (substitute* "SConscript"
                  (("unittestpp_env\\.Library") "_dummy = ")
                  (("test_env = env.Clone\\(tools=\\[unittestpp, sajson\\]\\)")
                   (string-append
                    "test_env = env.Clone(tools=[sajson])\n"
                    "test_env.Append(CPPPATH='"
                    (search-input-directory %build-inputs "/include/UnitTest++")
                    "', LIBPATH='"
                    (string-append #$(this-package-native-input "unittest-cpp")
                                   "/lib")
                    "', LIBS=['UnitTest++'])")))))
            (replace 'build
              (lambda* (#:key tests? #:allow-other-keys #:rest args)
                (when tests?
                  (apply (assoc-ref %standard-phases 'build)
                         args))))
            (replace 'check
              (lambda* (#:key tests? #:allow-other-keys)
                (when tests?
                  (invoke "build/opt/test")
                  (invoke "build/opt/test_unsorted"))))
            (replace 'install
              (lambda _
                (let ((out (string-append #$output "/include")))
                  (install-file "include/sajson.h" out)
                  (install-file "include/sajson_ostream.h" out)))))))
      (native-inputs (list unittest-cpp))
      (home-page "https://github.com/chadaustin/sajson")
      (synopsis "C++11 header-only, in-place JSON parser")
      (description "@code{sajson} is an in-place JSON parser with support for
parsing with only a single memory allocation.")
      (license license:expat))))

A gnu/packages/patches/sajson-build-with-gcc10.patch => gnu/packages/patches/sajson-build-with-gcc10.patch +45 -0
@@ 0,0 1,45 @@
This patch is from the upstream pull request
https://github.com/chadaustin/sajson/pull/54.
It fixes linking with GCC.

diff --git a/include/sajson.h b/include/sajson.h
index 8b4e05a..1bd045b 100644
--- a/include/sajson.h
+++ b/include/sajson.h
@@ -138,12 +138,17 @@ constexpr inline size_t make_element(tag t, size_t value) {
 // header. This trick courtesy of Rich Geldreich's Purple JSON parser.
 template <typename unused = void>
 struct globals_struct {
+    static const unsigned char parse_flags[256];
+};
+typedef globals_struct<> globals;
+
 // clang-format off
 
     // bit 0 (1) - set if: plain ASCII string character
     // bit 1 (2) - set if: whitespace
     // bit 4 (0x10) - set if: 0-9 e E .
-    constexpr static const uint8_t parse_flags[256] = {
+    template <typename unused>
+    const unsigned char globals_struct<unused>::parse_flags[256] = {
      // 0    1    2    3    4    5    6    7      8    9    A    B    C    D    E    F
         0,   0,   0,   0,   0,   0,   0,   0,     0,   2,   2,   0,   0,   2,   0,   0, // 0
         0,   0,   0,   0,   0,   0,   0,   0,     0,   0,   0,   0,   0,   0,   0,   0, // 1
@@ -162,15 +167,13 @@ struct globals_struct {
     };
 
 // clang-format on
-};
-typedef globals_struct<> globals;
 
-constexpr inline bool is_plain_string_character(char c) {
+inline bool is_plain_string_character(char c) {
     // return c >= 0x20 && c <= 0x7f && c != 0x22 && c != 0x5c;
     return (globals::parse_flags[static_cast<unsigned char>(c)] & 1) != 0;
 }
 
-constexpr inline bool is_whitespace(char c) {
+inline bool is_whitespace(char c) {
     // return c == '\r' || c == '\n' || c == '\t' || c == ' ';
     return (globals::parse_flags[static_cast<unsigned char>(c)] & 2) != 0;
 }