From 7fb706951904f58cb3dd8963885024f7d9383c0b Mon Sep 17 00:00:00 2001 From: Vivien Kraus Date: Mon, 2 Aug 2021 16:07:08 +0200 Subject: [PATCH] gnu: Add jsonnet. * gnu/packages/cpp.scm (jsonnet): New variable. --- gnu/packages/cpp.scm | 105 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) diff --git a/gnu/packages/cpp.scm b/gnu/packages/cpp.scm index 42e9d50687..318e387069 100644 --- a/gnu/packages/cpp.scm +++ b/gnu/packages/cpp.scm @@ -63,6 +63,7 @@ #:use-module (gnu packages llvm) #:use-module (gnu packages logging) #:use-module (gnu packages maths) + #:use-module (gnu packages nettle) #:use-module (gnu packages onc-rpc) #:use-module (gnu packages perl) #:use-module (gnu packages pkg-config) @@ -1211,3 +1212,107 @@ of reading and writing XML.") ;; incompatible with the GPL v2. Refer to the file named FLOSSE for the ;; details. (license license:gpl2+))) + +(define-public jsonnet + (package + (name "jsonnet") + (version "0.17.0") + (source + (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/google/jsonnet") + (commit (string-append "v" version)))) + (file-name (git-file-name name version)) + (sha256 + (base32 "1ddz14699v5lqx3dh0mb7hfffr6fk5zhmzn3z8yxkqqvriqnciim")) + (modules '((guix build utils))) + (snippet + '(begin + (delete-file-recursively "third_party") + (delete-file-recursively "doc/third_party") + (substitute* + '("core/vm.cpp") + (("#include \"json.hpp\"") "#include ")) + (mkdir-p "third_party/md5") + (call-with-output-file "third_party/md5/CMakeLists.txt" + (lambda (port) + (format port "add_library(md5 STATIC md5.cpp md5.h) +find_package(PkgConfig REQUIRED) +pkg_check_modules(NETTLE REQUIRED nettle) +target_link_libraries(md5 ${NETTLE_LIBRARIES}) +target_include_directories(md5 PUBLIC ${NETTLE_INCLUDE_DIRS}) +"))) + (call-with-output-file "third_party/md5/md5.h" + (lambda (port) + (format port "#ifndef BZF_MD5_H +#define BZF_MD5_H +#include + +// Return the hexadecimal digest. +std::string md5 (const std::string str); + +#endif +"))) + (call-with-output-file "third_party/md5/md5.cpp" + (lambda (port) + (format port "#include \"md5.h\" +#include +#include +#include +#include + +std::string +md5 (const std::string str) +{ + // Convert str to a byte array + std::vector input (str.begin (), str.end ()); + + // Compute the digest + struct md5_ctx nettle_ctx; + md5_init (&nettle_ctx); + md5_update (&nettle_ctx, input.size (), input.data ()); + uint8_t digest[MD5_DIGEST_SIZE]; + md5_digest (&nettle_ctx, MD5_DIGEST_SIZE, digest); + + // Encode it to base16 + std::vector encoded (BASE16_ENCODE_LENGTH (MD5_DIGEST_SIZE)); + base16_encode_update (encoded.data (), MD5_DIGEST_SIZE, digest); + std::string final_digest (encoded.begin (), encoded.end ()); + return final_digest; +} +"))))))) + (build-system cmake-build-system) + (arguments + `(#:configure-flags '("-DUSE_SYSTEM_GTEST=ON" "-DUSE_SYSTEM_JSON=ON"))) + (propagated-inputs + '()) + (native-inputs + `(("googletest" ,googletest) + ("pkg-config" ,pkg-config))) + (inputs + `(("json-modern-cxx" ,json-modern-cxx) + ;; jsonnet uses a md5 implementation claiming to be from + ;; https://www.bzflag.org/, but they don’t use it anymore. We + ;; replace it with md5 from nettle. + ("nettle" ,nettle))) + (home-page "https://jsonnet.org/") + (synopsis "The data templating language") + (description "A data templating language for app and tool developers: +@itemize +@item Generate config data +@item Side-effect free +@item Organize, simplify, unify +@item Manage sprawling config +@end itemize + +A simple extension of JSON: +@itemize +@item Open source (Apache 2.0) +@item Familiar syntax +@item Reformatter, linter +@item Editor & IDE integrations +@item Formally specified +@end itemize +") + (license license:asl2.0))) -- 2.32.0