From 7b7543376bd495c269536d04d97b381ad89da5c4 Mon Sep 17 00:00:00 2001 From: Justus Winter Date: Mon, 27 Jul 2020 15:44:13 +0200 Subject: gnu: Add rnp. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * gnu/packages/openpgp.scm (rnp): New variable. * gnu/packages/patches/rnp-add-version.cmake.patch: New file. * gnu/packages/patches/rnp-disable-ruby-rnp-tests.patch: New file. * gnu/packages/patches/rnp-unbundle-googletest.patch: New file. Signed-off-by: Ludovic Courtès --- gnu/packages/openpgp.scm | 94 +++++++++++- gnu/packages/patches/rnp-add-version.cmake.patch | 169 +++++++++++++++++++++ .../patches/rnp-disable-ruby-rnp-tests.patch | 26 ++++ gnu/packages/patches/rnp-unbundle-googletest.patch | 43 ++++++ 4 files changed, 331 insertions(+), 1 deletion(-) create mode 100644 gnu/packages/patches/rnp-add-version.cmake.patch create mode 100644 gnu/packages/patches/rnp-disable-ruby-rnp-tests.patch create mode 100644 gnu/packages/patches/rnp-unbundle-googletest.patch (limited to 'gnu/packages') diff --git a/gnu/packages/openpgp.scm b/gnu/packages/openpgp.scm index 94beab9929..a5b8f1b09d 100644 --- a/gnu/packages/openpgp.scm +++ b/gnu/packages/openpgp.scm @@ -19,11 +19,19 @@ (define-module (gnu packages openpgp) #:use-module (guix packages) #:use-module (guix download) + #:use-module (guix git-download) + #:use-module (guix build-system cmake) #:use-module (guix build-system gnu) #:use-module ((guix licenses) #:prefix license:) + #:use-module (gnu packages) + #:use-module (gnu packages check) #:use-module (gnu packages compression) + #:use-module (gnu packages crypto) #:use-module (gnu packages gnupg) - #:use-module (gnu packages multiprecision)) + #:use-module (gnu packages multiprecision) + #:use-module (gnu packages pkg-config) + #:use-module (gnu packages python) + #:use-module (gnu packages web)) (define-public libtmcg (package @@ -92,3 +100,87 @@ (define-public dkgpg environments.") (home-page "https://www.nongnu.org/dkgpg/") (license license:gpl2+))) + +(define-public rnp + ;; Packaging the currently released version requires a large number of + ;; patches. For now, we package a snapshot instead. + (let ((commit "203224f0b1505dba17837c03da603e5b98ab125a") + (revision "0") + (last-version "0.13.1") + (day-of-release "2020-07-21")) + (package + (name "rnp") + (version (git-version last-version revision commit)) + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/rnpgp/rnp") + (commit commit))) + (file-name + (string-append name "-" (string-take commit 7) "-checkout")) + (sha256 + (base32 + "1rnwhc9ys4v4mv584hmmrl0ycnqmsaigpffzm31qq337hz24zqya")) + (patches + (search-patches "rnp-unbundle-googletest.patch" + "rnp-disable-ruby-rnp-tests.patch" + "rnp-add-version.cmake.patch")))) + (build-system cmake-build-system) + (arguments `(#:configure-flags + '("-DBUILD_SHARED_LIBS=on" + "-DBUILD_TESTING=on") + #:phases + (modify-phases %standard-phases + (add-after 'unpack 'fixes + (lambda* (#:key inputs #:allow-other-keys) + (copy-recursively (assoc-ref inputs "googletest-source") + "src/tests/googletest-src") + (substitute* "src/tests/support.cpp" + (("\"cp\"") (string-append "\"" (which "cp") "\""))) + ;; Produce a version stamp in the format the upstream + ;; project uses for unreleased revisions. + (with-output-to-file "version.txt" + (lambda _ + (display + (string-append ,last-version + "-" ,revision + "-g" ,(string-take commit 7))))) + #t)) + (replace 'check + (lambda _ + ;; Some OpenPGP certificates used by the tests expire. + ;; To work around that, set the time to roughly the + ;; release date. + (invoke "faketime" ,day-of-release "make" "test")))))) + (native-inputs + `(("gnupg" ,gnupg) ; for tests + ("googletest-source" ,(package-source googletest)) ; for tests + ("libfaketime" ,libfaketime) ; for tests + ("pkg-config" ,pkg-config) + ("python" ,python) + ("python2" ,python-2.7))) + (inputs `(("botan" ,botan) + ("bzip2" ,bzip2) + ("json-c" ,json-c) + ("zlib" ,zlib))) + (synopsis + "RFC4880-compliant OpenPGP library written in C++") + (description + "Set of OpenPGP (RFC4880) tools that works on Linux, *BSD and macOS as a +replacement of GnuPG. It is maintained by Ribose after being forked from +NetPGP, itself originally written for NetBSD. + +librnp is the library used by rnp for all OpenPGP functions, useful for +developers to build against. It is a “real” library, not a wrapper like GPGME +of GnuPG.") + (home-page "https://www.rnpgp.com/") + (license + ;; RNP contains code written by Ribose and code derived from netpgp. + (list + ;; Ribose's BSD 2-Clause License and NetBSD's BSD 2-Clause License + ;; (netpgp). + license:bsd-2 + ;; Nominet UK's Apache 2.0 Licence (netpgp). + license:asl2.0 + ;; Nominet UK's BSD 3-Clause License (netpgp). + license:bsd-3))))) diff --git a/gnu/packages/patches/rnp-add-version.cmake.patch b/gnu/packages/patches/rnp-add-version.cmake.patch new file mode 100644 index 0000000000..67e3b75457 --- /dev/null +++ b/gnu/packages/patches/rnp-add-version.cmake.patch @@ -0,0 +1,169 @@ +From b4326f4649ceb146d5cc74f8579b68d8dc8f51e6 Mon Sep 17 00:00:00 2001 +From: Justus Winter +Date: Mon, 27 Jul 2020 14:00:25 +0200 +Subject: [PATCH 3/3] Add external version.cmake. + +This file is maintained in an external repository. It is only +included in released versions. For building snapshots of RNP, a fixed +snapshot of version.cmake is downloaded on demand. To avoid this, +this patch explicitly provides the file. +--- + cmake/version.cmake | 146 ++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 146 insertions(+) + create mode 100644 cmake/version.cmake + +diff --git a/cmake/version.cmake b/cmake/version.cmake +new file mode 100644 +index 00000000..514027aa +--- /dev/null ++++ b/cmake/version.cmake +@@ -0,0 +1,146 @@ ++# Copyright (c) 2018 Ribose Inc. ++# All rights reserved. ++# ++# Redistribution and use in source and binary forms, with or without ++# modification, are permitted provided that the following conditions ++# are met: ++# 1. Redistributions of source code must retain the above copyright ++# notice, this list of conditions and the following disclaimer. ++# 2. Redistributions in binary form must reproduce the above copyright ++# notice, this list of conditions and the following disclaimer in the ++# documentation and/or other materials provided with the distribution. ++# ++# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED ++# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ++# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS ++# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ++# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ++# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS ++# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN ++# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ++# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ++# POSSIBILITY OF SUCH DAMAGE. ++ ++# desired length of commit hash ++set(GIT_REV_LEN 7) ++ ++# call git, store output in var (can fail) ++macro(_git var) ++ execute_process( ++ COMMAND "${GIT_EXECUTABLE}" ${ARGN} ++ WORKING_DIRECTORY "${source_dir}" ++ RESULT_VARIABLE _git_ec ++ OUTPUT_VARIABLE ${var} ++ OUTPUT_STRIP_TRAILING_WHITESPACE ++ ERROR_QUIET ++ ) ++endmacro() ++ ++# call git, store output in var (can not fail) ++macro(git var) ++ _git(${var} ${ARGN}) ++ if (NOT _git_ec EQUAL 0) ++ string(REPLACE ";" " " args "${ARGN}") ++ message(FATAL_ERROR "Failed to execute: git ${args}") ++ endif() ++endmacro() ++ ++function(extract_version_info version var_prefix) ++ # extract the main components ++ # v1.9.0-3-g5b92266+1546836556 ++ # v1.9.0-3-g5b92266-dirty+1546836556 ++ string(REGEX MATCH "^v?([0-9]+\\.[0-9]+\\.[0-9]+)(-([0-9]+)-g([0-9a-f]+)(-dirty)?)?(\\+([0-9]+))?$" matches "${version}") ++ if (NOT matches) ++ message(FATAL_ERROR "Failed to extract version components.") ++ endif() ++ set(${var_prefix}_VERSION "${CMAKE_MATCH_1}" PARENT_SCOPE) # 1.9.0 ++ if (NOT CMAKE_MATCH_3) ++ set(CMAKE_MATCH_3 "0") ++ endif() ++ set(${var_prefix}_VERSION_NCOMMITS "${CMAKE_MATCH_3}" PARENT_SCOPE) # 3 ++ if (NOT CMAKE_MATCH_4) ++ set(CMAKE_MATCH_4 "0") ++ endif() ++ set(${var_prefix}_VERSION_GIT_REV "${CMAKE_MATCH_4}" PARENT_SCOPE) # 5b92266 ++ if (CMAKE_MATCH_5 STREQUAL "-dirty") ++ set(${var_prefix}_VERSION_IS_DIRTY TRUE PARENT_SCOPE) ++ else() ++ set(${var_prefix}_VERSION_IS_DIRTY FALSE PARENT_SCOPE) ++ endif() ++ # timestamp is optional, default to 0 ++ if (NOT CMAKE_MATCH_7) ++ set(CMAKE_MATCH_7 "0") ++ endif() ++ set(${var_prefix}_VERSION_COMMIT_TIMESTAMP "${CMAKE_MATCH_7}" PARENT_SCOPE) # 1546836556 ++endfunction() ++ ++function(determine_version source_dir var_prefix) ++ if (EXISTS "${source_dir}/.git") ++ # for GIT_EXECUTABLE ++ find_package(Git REQUIRED) ++ # get a description of the version, something like: ++ # v1.9.1-0-g38ffe82 (a tagged release) ++ # v1.9.1-0-g38ffe82-dirty (a tagged release with local modifications) ++ # v1.9.0-3-g5b92266 (post-release snapshot) ++ # v1.9.0-3-g5b92266-dirty (post-release snapshot with local modifications) ++ _git(version describe --abbrev=${GIT_REV_LEN} --match "v[0-9]*" --long --dirty) ++ if (NOT _git_ec EQUAL 0) ++ # no annotated tags, fake one ++ git(revision rev-parse --short=${GIT_REV_LEN} --verify HEAD) ++ set(version "v0.0.0-0-g${revision}") ++ # check if dirty (this won't detect untracked files, but should be ok) ++ _git(changes diff-index --quiet HEAD --) ++ if (NOT _git_ec EQUAL 0) ++ string(APPEND version "-dirty") ++ endif() ++ # append the commit timestamp of the most recent commit (only ++ # in non-release branches -- typically master) ++ git(commit_timestamp show -s --format=%ct) ++ string(APPEND version "+${commit_timestamp}") ++ endif() ++ else() ++ # same as above, but used for snapshots ++ file(STRINGS "${source_dir}/version.txt" version) ++ endif() ++ set(local_prefix "_determine_ver") ++ extract_version_info("${version}" "${local_prefix}") ++ foreach(suffix VERSION VERSION_NCOMMITS VERSION_GIT_REV VERSION_IS_DIRTY VERSION_COMMIT_TIMESTAMP) ++ if (NOT DEFINED ${local_prefix}_${suffix}) ++ message(FATAL_ERROR "Unable to determine version.") ++ endif() ++ set(${var_prefix}_${suffix} "${${local_prefix}_${suffix}}" PARENT_SCOPE) ++ message(STATUS "${var_prefix}_${suffix}: ${${local_prefix}_${suffix}}") ++ endforeach() ++ # Set VERSION_SUFFIX and VERSION_FULL. When making changes, be aware that ++ # this is used in packaging as well and will affect ordering. ++ # | state | version_full | ++ # |------------------------------------------------| ++ # | exact tag | 0.9.0 | ++ # | exact tag, dirty | 0.9.0+git20180604 | ++ # | after tag | 0.9.0+git20180604.1.085039f | ++ # | no tag | 0.0.0+git20180604.2ee02af | ++ string(TIMESTAMP date "%Y%m%d" UTC) ++ set(version_suffix "") ++ if ((NOT ${local_prefix}_VERSION_NCOMMITS EQUAL 0) OR (${local_prefix}_VERSION STREQUAL "0.0.0")) ++ # 0.9.0+git20150604.4.289818b ++ string(APPEND version_suffix "+git${date}") ++ if (NOT ${local_prefix}_VERSION_NCOMMITS EQUAL 0) ++ string(APPEND version_suffix ".${${local_prefix}_VERSION_NCOMMITS}") ++ endif() ++ string(APPEND version_suffix ".${${local_prefix}_VERSION_GIT_REV}") ++ else() ++ if (${local_prefix}_VERSION_IS_DIRTY) ++ # 0.9.0+git20150604 ++ string(APPEND version_suffix "+git${date}") ++ endif() ++ endif() ++ set(version_full "${${local_prefix}_VERSION}${version_suffix}") ++ # set the results ++ set(${var_prefix}_VERSION_SUFFIX "${version_suffix}" PARENT_SCOPE) ++ set(${var_prefix}_VERSION_FULL "${version_full}" PARENT_SCOPE) ++ # for informational purposes ++ message(STATUS "${var_prefix}_VERSION_SUFFIX: ${version_suffix}") ++ message(STATUS "${var_prefix}_VERSION_FULL: ${version_full}") ++endfunction() ++ +-- +2.20.1 + diff --git a/gnu/packages/patches/rnp-disable-ruby-rnp-tests.patch b/gnu/packages/patches/rnp-disable-ruby-rnp-tests.patch new file mode 100644 index 0000000000..5a75b6f40f --- /dev/null +++ b/gnu/packages/patches/rnp-disable-ruby-rnp-tests.patch @@ -0,0 +1,26 @@ +From 40e53d639d86337cf58be3a2b9750b6c97a3c740 Mon Sep 17 00:00:00 2001 +From: Justus Winter +Date: Tue, 21 Jul 2020 16:10:21 +0200 +Subject: [PATCH 2/2] Disable ruby-rnp tests. + +Prevents cmake from cloning the ruby-rnp repository in order to run its tests. +--- + src/tests/CMakeLists.txt | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt +index d3c4fbe6..e7e1965e 100644 +--- a/src/tests/CMakeLists.txt ++++ b/src/tests/CMakeLists.txt +@@ -125,7 +125,7 @@ gtest_discover_tests(rnp_tests + + # ruby-rnp + # cruby does not currently play nice with ASaN et al. +-if (NOT ENABLE_SANITIZERS AND BUILD_SHARED_LIBS AND NOT WIN32) ++if (NOT ENABLE_SANITIZERS AND BUILD_SHARED_LIBS AND NOT WIN32 AND IGNORE) + include(ExternalProject) + set(_sourcedir "${CMAKE_BINARY_DIR}/ruby-rnp") + if (DEFINED ENV{RUBY_RNP_INSTALL}) +-- +2.20.1 + diff --git a/gnu/packages/patches/rnp-unbundle-googletest.patch b/gnu/packages/patches/rnp-unbundle-googletest.patch new file mode 100644 index 0000000000..b85bfd1f0e --- /dev/null +++ b/gnu/packages/patches/rnp-unbundle-googletest.patch @@ -0,0 +1,43 @@ +From 4b4697c8dd66bd2b1e4d6b831bbde46e27d62c46 Mon Sep 17 00:00:00 2001 +From: Justus Winter +Date: Tue, 21 Jul 2020 16:10:12 +0200 +Subject: [PATCH 1/2] Unbundle googletest. + +--- + src/tests/CMakeLists.txt | 2 +- + src/tests/gtest-CMakeLists.txt.in | 6 +++--- + 2 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt +index 0a841666..d3c4fbe6 100644 +--- a/src/tests/CMakeLists.txt ++++ b/src/tests/CMakeLists.txt +@@ -53,7 +53,7 @@ endif() + # maintain compiler/linker settings on Windows + set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) + # add to our build (provides gtest_main target) +-add_subdirectory(${CMAKE_CURRENT_BINARY_DIR}/googletest-src ++add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/googletest-src + ${CMAKE_CURRENT_BINARY_DIR}/googletest-build + EXCLUDE_FROM_ALL) + +diff --git a/src/tests/gtest-CMakeLists.txt.in b/src/tests/gtest-CMakeLists.txt.in +index a43e8e5d..3cc0ddd5 100644 +--- a/src/tests/gtest-CMakeLists.txt.in ++++ b/src/tests/gtest-CMakeLists.txt.in +@@ -4,9 +4,9 @@ project(googletest-download NONE) + + include(ExternalProject) + ExternalProject_Add(googletest +- GIT_REPOSITORY https://github.com/google/googletest.git +- GIT_TAG c43f710 +- SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}/googletest-src" ++# GIT_REPOSITORY https://github.com/google/googletest.git ++# GIT_TAG c43f710 ++ SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/googletest-src" + BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/googletest-build" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" +-- +2.20.1 + -- cgit v1.2.3