summaryrefslogtreecommitdiff
path: root/packages
diff options
context:
space:
mode:
Diffstat (limited to 'packages')
-rw-r--r--packages/komodo/cmake.scm442
-rw-r--r--packages/komodo/cppdap.scm40
-rw-r--r--packages/komodo/cpprestsdk.scm42
-rw-r--r--packages/komodo/komodo-libsodium-cmakelists.txt744
-rw-r--r--packages/komodo/komodo-libsodium-sodiumconfig.cmake.in61
-rw-r--r--packages/komodo/komodo.scm178
-rw-r--r--packages/komodo/libsodium-komodo.scm36
-rw-r--r--packages/komodo/vcpkg.scm168
8 files changed, 1711 insertions, 0 deletions
diff --git a/packages/komodo/cmake.scm b/packages/komodo/cmake.scm
new file mode 100644
index 0000000..3c6f924
--- /dev/null
+++ b/packages/komodo/cmake.scm
@@ -0,0 +1,442 @@
+;;; GNU Guix --- Functional package management for GNU
+;;; Copyright © 2013 Cyril Roelandt <tipecaml@gmail.com>
+;;; Copyright © 2014 Mark H Weaver <mhw@netris.org>
+;;; Copyright © 2014 Eric Bavier <bavier@member.fsf.org>
+;;; Copyright © 2014 Ian Denhardt <ian@zenhack.net>
+;;; Copyright © 2015 Sou Bunnbu <iyzsong@gmail.com>
+;;; Copyright © 2016 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2017, 2018, 2020, 2021 Marius Bakke <marius@gnu.org>
+;;; Copyright © 2018 Arun Isaac <arunisaac@systemreboot.net>
+;;; Copyright © 2018, 2020 Tobias Geerinckx-Rice <me@tobias.gr>
+;;; Copyright © 2019, 2020, 2021, 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com>
+;;; Copyright © 2019 Pierre-Moana Levesque <pierre.moana.levesque@gmail.com>
+;;; Copyright © 2020, 2023 Janneke Nieuwenhuizen <janneke@gnu.org>
+;;; Copyright © 2021 Ricardo Wurmus <rekado@elephly.net>
+;;;
+;;; This file is part of GNU Guix.
+;;;
+;;; GNU Guix is free software; you can redistribute it and/or modify it
+;;; under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation; either version 3 of the License, or (at
+;;; your option) any later version.
+;;;
+;;; GNU Guix is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
+
+(define-module (cmake)
+ #:use-module (cppdap)
+ #:use-module ((guix licenses) #:prefix license:)
+ #:use-module (guix packages)
+ #:use-module (guix gexp)
+ #:use-module (guix download)
+ #:use-module (guix git-download)
+ #:use-module (guix utils)
+ #:use-module (guix deprecation)
+ #:use-module (guix build-system gnu)
+ #:use-module (guix build-system cmake)
+ #:use-module (guix build-system emacs)
+ #:use-module ((guix search-paths) #:select ($SSL_CERT_DIR $SSL_CERT_FILE))
+ #:use-module (gnu packages)
+ #:use-module (gnu packages backup)
+ #:use-module (gnu packages compression)
+ #:use-module (gnu packages cpp)
+ #:use-module (gnu packages crypto)
+ #:use-module (gnu packages curl)
+ #:use-module (gnu packages file)
+ #:use-module (gnu packages kde-frameworks)
+ #:use-module (gnu packages libevent)
+ #:use-module (gnu packages ncurses)
+ #:use-module (gnu packages serialization)
+ #:use-module (gnu packages sphinx)
+ #:use-module (gnu packages texinfo)
+ #:use-module (gnu packages xml)
+ #:use-module (ice-9 match)
+ #:use-module (srfi srfi-1))
+
+(define-public cmake-shared
+ (let ((commit "8122f2b96c8da38ea41b653cf69958e75fe2129d")
+ (revision "32"))
+ (package
+ (name "cmake-shared")
+ (version
+ (git-version "1.1.0" revision commit))
+ (source
+ (origin
+ (method git-fetch)
+ (uri
+ (git-reference
+ (url "https://github.com/lirios/cmake-shared.git")
+ (commit commit)))
+ (file-name
+ (git-file-name name version))
+ (sha256
+ (base32 "05avwzqcnliwx9h7qi1kl0iz4smqmxc4vkavyjbmlc6h2b97i58g"))
+ (modules '((guix build utils)
+ (ice-9 ftw)
+ (srfi srfi-1)))
+ (snippet
+ `(begin
+ (delete-file-recursively "3rdparty")))))
+ (build-system cmake-build-system)
+ (arguments
+ `(#:tests? #f)) ; No target
+ (native-inputs
+ (list extra-cmake-modules))
+ (synopsis "Shared CMake functions and macros")
+ (description "CMake-Shared are shared functions and macros for projects
+using the CMake build system.")
+ (home-page "https://github.com/lirios/cmake-shared/")
+ (license license:bsd-3))))
+
+;;; Build phases shared between 'cmake-bootstrap' and the later variants
+;;; that use cmake-build-system.
+(define (%common-build-phases)
+ `((add-after 'unpack 'split-package
+ ;; Remove files that have been packaged in other package recipes.
+ (lambda _
+ (delete-file "Auxiliary/cmake-mode.el")
+ (substitute* "Auxiliary/CMakeLists.txt"
+ ((".*cmake-mode.el.*") ""))))
+ ,@(if (target-x86-32?)
+ '((add-after 'unpack 'skip-cpack-txz-test
+ (lambda _
+ ;; In 'RunCMake.CPack_TXZ', the 'TXZ/THREADED_ALL' test
+ ;; would occasionally fail on i686 with "Internal error
+ ;; initializing compression library: Cannot allocate
+ ;; memory": <https://issues.guix.gnu.org/50617>. Skip it.
+ (substitute* "Tests/RunCMake/CPack/RunCMakeTest.cmake"
+ (("THREADED_ALL \"TXZ;DEB\"")
+ "THREADED_ALL \"DEB\"")))))
+ '())
+ (add-before 'configure 'patch-bin-sh
+ (lambda _
+ ;; Replace "/bin/sh" by the right path in... a lot of
+ ;; files.
+ (substitute*
+ '("Modules/CompilerId/Xcode-3.pbxproj.in"
+ "Modules/Internal/CPack/CPack.RuntimeScript.in"
+ "Source/cmGlobalXCodeGenerator.cxx"
+ "Source/cmLocalUnixMakefileGenerator3.cxx"
+ "Source/cmExecProgramCommand.cxx"
+ "Tests/CMakeLists.txt"
+ "Tests/RunCMake/File_Generate/RunCMakeTest.cmake")
+ (("/bin/sh") (which "sh")))))))
+
+(define %common-disabled-tests
+ '(;; This test copies libgcc_s.so.1 from GCC and tries to modify its RPATH,
+ ;; but does not cope with the file being read-only.
+ "BundleUtilities"
+ ;; These tests require network access.
+ "CTestTestUpload" "CMake.FileDownload"
+ ;; This test requires 'ldconfig' which is not available in Guix.
+ "RunCMake.install"
+ ;; This test fails for unknown reason.
+ "RunCMake.file-GET_RUNTIME_DEPENDENCIES"
+
+ "CMakeLib.testDebuggerNamedPipe-Project"
+ "CMakeLib.testDebuggerNamedPipe-Script"))
+
+(define %common-disabled-tests/hurd
+ '("CTestTestTimeout"
+ "CTestTestRerunFailed"
+ "RunCMake.CompilerChange"
+ "RunCMake.ctest_test"
+ "RunCMake.file"
+ "RunCMake.BundleUtilities"
+ "RunCMake.configure_file"
+ "RunCMake.CTestTimeout"
+ "RunCMake.CTestTimeoutAfterMatch"
+ "RunCMake.CommandLine"
+ "RunCMake.CTestCommandLine"))
+
+(define %preserved-third-party-files
+ '(;; 'Source/cm_getdate.c' includes archive_getdate.c wholesale, so it must
+ ;; be available along with the required headers.
+ "Utilities/cmlibarchive/libarchive/archive_getdate.c"
+ "Utilities/cmlibarchive/libarchive/archive_getdate.h"
+ ;; ELF headers.
+ "Utilities/cmelf"
+ ;; CMake header wrappers.
+ "Utilities/cm3p"))
+
+;;; The "bootstrap" CMake. It is used to build 'cmake-minimal' below, as well
+;;; as any dependencies that need cmake-build-system.
+(define-public cmake-bootstrap
+ (package
+ (name "cmake-bootstrap")
+ (version "3.27.1")
+ (source (origin
+ (method url-fetch)
+ (uri (string-append "https://cmake.org/files/v"
+ (version-major+minor version)
+ "/cmake-" version ".tar.gz"))
+ (sha256
+ (base32
+ "01102g2j5klqxl6jvwhwz45libcg9hnb7xchdr3r86x1bw9v19mi"))
+ (patches (search-patches "cmake-curl-certificates-3.24.patch"))))
+ (build-system gnu-build-system)
+ (arguments
+ (list
+ #:test-target "test"
+ #:configure-flags
+ #~(let ((parallel-job-count (number->string (parallel-job-count))))
+ (list "--verbose"
+ (string-append "--parallel=" parallel-job-count)
+ (string-append "--prefix=" #$output)
+ "--system-libs"
+ "--no-system-cppdap"
+ ;; By default, the man pages and other docs land
+ ;; in PREFIX/man and PREFIX/doc, but we want them
+ ;; in share/{man,doc}. Note that unlike
+ ;; autoconf-generated configure scripts, cmake's
+ ;; configure prepends "PREFIX/" to what we pass
+ ;; to --mandir and --docdir.
+ "--mandir=share/man"
+ (string-append "--docdir=share/doc/cmake-"
+ #$(version-major+minor version))
+
+ ;; By default CMake is built without any optimizations. Use
+ ;; the recommended Release target for a ~2.5x speedup.
+ "--" "-DCMAKE_BUILD_TYPE=Release"))
+ #:make-flags
+ #~(let ((skipped-tests
+ (list #$@%common-disabled-tests
+ "CTestTestSubdir" ; This test fails to build 2 of the 3 tests.
+ ;; This test fails when ARGS (below) is in use, see
+ ;; <https://gitlab.kitware.com/cmake/cmake/issues/17165>.
+ "CTestCoverageCollectGCOV"
+ #$@(if (target-hurd?)
+ %common-disabled-tests/hurd
+ #~()))))
+ (list
+ (string-append
+ ;; These arguments apply for the tests only.
+ "ARGS=-j " (number->string (parallel-job-count))
+ " --output-on-failure"
+ " --exclude-regex ^\\(" (string-join skipped-tests "\\|") "\\)$")))
+ #:phases
+ #~(modify-phases %standard-phases
+ #$@(%common-build-phases)
+ (add-before 'configure 'set-paths
+ (lambda _
+ ;; Help cmake's bootstrap process to find system libraries
+ (begin
+ (setenv "CMAKE_LIBRARY_PATH" (getenv "LIBRARY_PATH"))
+ (setenv "CMAKE_INCLUDE_PATH" (or (getenv "CPATH")
+ (getenv "C_INCLUDE_PATH"))))))
+ ;; CMake uses its own configure script.
+ (replace 'configure
+ (lambda* (#:key (configure-flags '()) #:allow-other-keys)
+ (apply invoke "./configure" configure-flags)))
+ #$@(if (target-hurd?)
+ #~((add-after 'unpack 'patch-hurd
+ (lambda _
+ ;; Version 3.25.0 has a similar fix.
+ (substitute* "Utilities/cmlibuv/src/unix/udp.c"
+ (("!defined\\(__QNX__\\)")
+ "!defined(__GNU__)")))))
+ #~()))))
+ (inputs
+ (list
+ libuv bzip2 cppdap curl expat file jsoncpp libarchive nlohmann-json rhash
+ zlib))
+ (native-search-paths
+ (list (search-path-specification
+ (variable "CMAKE_PREFIX_PATH")
+ (files '("")))
+ ;; "cmake-curl-certificates.patch" changes CMake to honor 'SSL_CERT_DIR'
+ ;; and 'SSL_CERT_FILE', hence these search path entries.
+ $SSL_CERT_DIR
+ $SSL_CERT_FILE))
+ (home-page "https://cmake.org/")
+ (synopsis "Cross-platform build system")
+ (description
+ "CMake is a family of tools designed to build, test and package software.
+CMake is used to control the software compilation process using simple platform
+and compiler independent configuration files. CMake generates native makefiles
+and workspaces that can be used in the compiler environment of your choice.")
+ (properties '((hidden? . #t)))
+ (license (list license:bsd-3 ; cmake
+ license:expat ; cmjsoncpp is dual MIT/public domain
+ license:public-domain)))) ; cmlibarchive/archive_getdate.c
+
+;;; This minimal variant of CMake does not include the documentation. It is
+;;; used by the cmake-build-system.
+(define-public cmake-minimal
+ (package
+ (inherit cmake-bootstrap)
+ (name "cmake-minimal")
+ (properties (alist-delete 'hidden? (package-properties cmake-bootstrap)))
+ (source (origin
+ (inherit (package-source cmake-bootstrap))
+ ;; Purge CMakes bundled dependencies as they are no longer needed.
+ (modules '((ice-9 ftw)))
+ (snippet
+ `(begin
+ (define preserved-files ',%preserved-third-party-files)
+
+ ;; (file-system-fold (lambda (dir stat result) ;enter?
+ ;; (or (string=? "Utilities" dir) ;init
+ ;; ;; The bundled dependencies are
+ ;; ;; distinguished by having a "cm"
+ ;; ;; prefix to their upstream names.
+ ;; (and (string-prefix? "Utilities/cm" dir)
+ ;; (not (member dir preserved-files)))))
+ ;; (lambda (file stat result) ;leaf
+ ;; (unless (or (member file preserved-files)
+ ;; ;; Preserve top-level files.
+ ;; (string=? "Utilities"
+ ;; (dirname file)))
+ ;; (delete-file file)))
+ ;; (const #t) ;down
+ ;; (lambda (dir stat result) ;up
+ ;; (when (equal? (scandir dir) '("." ".."))
+ ;; (rmdir dir)))
+ ;; (const #t) ;skip
+ ;; (lambda (file stat errno result)
+ ;; (format (current-error-port)
+ ;; "warning: failed to delete ~a: ~a~%"
+ ;; file (strerror errno)))
+ ;; #t
+ ;; "Utilities"
+ ;; lstat)
+ #t))))
+ (build-system cmake-build-system)
+ (arguments
+ (list
+ #:configure-flags
+ #~(list "-DCMAKE_USE_SYSTEM_LIBRARIES=ON"
+ (string-append "-DCMAKE_DOC_DIR=share/doc/cmake-"
+ #$(version-major+minor (package-version
+ cmake-bootstrap))))
+
+ ;; This is the CMake used in cmake-build-system. Ensure compiler
+ ;; optimizations are enabled to save size and CPU cycles.
+ #:build-type "Release"
+ #:phases
+ #~(modify-phases %standard-phases
+ #$@(%common-build-phases)
+ (add-after 'install 'delete-help-documentation
+ (lambda _
+ (delete-file-recursively
+ (string-append #$output
+ "/share/cmake-"
+ #$(version-major+minor
+ (package-version cmake-bootstrap))
+ "/Help"))))
+ (replace 'check
+ (lambda* (#:key tests? parallel-tests? #:allow-other-keys)
+ (let ((skipped-tests (list #$@%common-disabled-tests
+ ;; This test requires the bundled libuv.
+ "BootstrapTest"
+ #$@(if (system-hurd?)
+ %common-disabled-tests/hurd
+ #~()))))
+ (if tests?
+ (begin
+ (invoke "ctest" "-j" (if parallel-tests?
+ (number->string (parallel-job-count))
+ "1")
+ "--exclude-regex"
+ (string-append "^(" (string-join skipped-tests "|") ")$")))
+ (format #t "test suite not run~%"))))))
+ #:cmake (if (%current-target-system)
+ cmake-minimal-cross
+ cmake-bootstrap)))))
+
+;;; The "user-facing" CMake, now with manuals and HTML documentation.
+(define-public cmake
+ (package
+ (inherit cmake-minimal)
+ (name "cmake")
+ (version "3.27.1")
+ (source (origin
+ (inherit (package-source cmake-minimal))
+ (method url-fetch)
+ (uri (string-append "https://cmake.org/files/v"
+ (version-major+minor version)
+ "/cmake-" version ".tar.gz"))
+ (snippet (match (origin-snippet (package-source cmake-minimal))
+ (('begin ('define 'preserved-files ('quote x))
+ rest ...)
+ `(begin (define preserved-files
+ ',(cons "Utilities/cmelf" x))
+ ,@rest))))
+ (sha256
+ (base32
+ "01102g2j5klqxl6jvwhwz45libcg9hnb7xchdr3r86x1bw9v19mi"))
+ (patches (search-patches "cmake-curl-certificates-3.24.patch"))))
+ (outputs '("out" "doc"))
+ (arguments
+ (substitute-keyword-arguments (package-arguments cmake-minimal)
+ ;; Use cmake-minimal this time.
+ ((#:cmake _ #f)
+ (if (%current-target-system)
+ cmake-minimal-cross
+ cmake-minimal))
+
+ ;; Enable debugging information for convenience.
+ ((#:build-type _ #f) "RelWithDebInfo")
+
+ ((#:configure-flags flags ''())
+ #~(append (list "-DSPHINX_INFO=ON" "-DSPHINX_MAN=ON" "-DSPHINX_HTML=ON"
+ (string-append "-DCMAKE_DOC_DIR=share/doc/cmake-"
+ #$(version-major+minor (package-version
+ cmake-minimal)))
+ "-DCMAKE_INFO_DIR=share/info"
+ "-DCMAKE_MAN_DIR=share/man")
+ #$flags))
+ ((#:phases phases)
+ #~(modify-phases #$phases
+ (delete 'delete-help-documentation)
+ (add-after 'install 'move-html-doc
+ (lambda _
+ (let ((html (string-append "/share/doc/cmake-"
+ #$(version-major+minor
+ (package-version cmake-minimal))
+ "/html")))
+ (copy-recursively (string-append #$output html)
+ (string-append #$output:doc html))
+ (delete-file-recursively (string-append #$output html)))))))))
+ (inputs
+ (modify-inputs (package-inputs cmake-minimal)
+ (prepend ncurses))) ;required for ccmake
+ ;; Extra inputs required to build the documentation.
+ (native-inputs
+ (modify-inputs (package-native-inputs cmake-minimal)
+ (append python-sphinx
+ texinfo)))
+ (properties (alist-delete 'hidden? (package-properties cmake-minimal)))))
+
+(define-public cmake-minimal-cross
+ (package
+ (inherit cmake-minimal)
+ (name "cmake-minimal-cross")
+ (native-search-paths '())
+ (search-paths
+ (package-native-search-paths cmake-minimal))))
+
+(define-public emacs-cmake-mode
+ (package
+ (inherit cmake)
+ (name "emacs-cmake-mode")
+ (native-inputs '())
+ (inputs '())
+ (outputs '("out"))
+ (build-system emacs-build-system)
+ (arguments
+ (list #:phases
+ #~(modify-phases %standard-phases
+ (add-after 'unpack 'chdir-elisp
+ ;; Elisp directory is not in root of the source.
+ (lambda _
+ (chdir "Auxiliary"))))))
+ (synopsis "Emacs major mode for editing Cmake expressions")
+ (description "@code{cmakeos-mode} provides an Emacs major mode for editing
+Cmake files. It supports syntax highlighting, indenting and refilling of
+comments.")))
diff --git a/packages/komodo/cppdap.scm b/packages/komodo/cppdap.scm
new file mode 100644
index 0000000..1278e9d
--- /dev/null
+++ b/packages/komodo/cppdap.scm
@@ -0,0 +1,40 @@
+(define-module (cppdap)
+ #:use-module (gnu packages cpp)
+ #:use-module (guix build-system cmake)
+ #:use-module (guix git-download)
+ #:use-module
+ ((guix licenses)
+ #:prefix license:)
+ #:use-module (guix packages))
+
+(define-public cppdap
+ (let ((cppdap-commit "5857b55c151c2efc1aea1ee0501e8d09f740d41b")
+ (cppdap-github "https://github.com/google/cppdap"))
+ (package
+ (name "cppdap")
+ (version cppdap-commit)
+ (source
+ (origin
+ (uri
+ (git-reference
+ (url (string-append cppdap-github ".git"))
+ (commit cppdap-commit)))
+ (method git-fetch)
+ (hash
+ (content-hash "08bdsn0568hidq51fzw63ph0wkri8siid74fxp7sqvxjv04164pr"))))
+ (build-system cmake-build-system)
+ (arguments
+ (list
+ #:phases '(modify-phases %standard-phases (delete 'check))
+ #:configure-flags
+ '(list "-DCPPDAP_USE_EXTERNAL_NLOHMANN_JSON_PACKAGE=ON")))
+ (native-inputs (list nlohmann-json))
+ (synopsis "C++ library for the Debug Adapter Protocol")
+ (description
+ (string-append
+ "cppdap is a C++11 library (\"SDK\") implementation of the Debug Adapter "
+ "Protocol, providing an API for implementing a DAP client or server. "
+ "cppdap provides C++ type-safe structures for the full DAP specification, "
+ "and provides a simple way to add custom protocol messages."))
+ (license license:asl2.0)
+ (home-page cppdap-github))))
diff --git a/packages/komodo/cpprestsdk.scm b/packages/komodo/cpprestsdk.scm
new file mode 100644
index 0000000..a558b25
--- /dev/null
+++ b/packages/komodo/cpprestsdk.scm
@@ -0,0 +1,42 @@
+(define-module (cpprestsdk)
+ #:use-module (gnu packages boost)
+ #:use-module (gnu packages compression)
+ #:use-module (gnu packages tls)
+ #:use-module (gnu packages web)
+ #:use-module (guix build-system cmake)
+ #:use-module (guix gexp)
+ #:use-module (guix git-download)
+ #:use-module ((guix licenses)
+ #:prefix license:)
+ #:use-module (guix packages))
+
+(define-public cpprestsdk
+ (package
+ (name "cpprestsdk")
+ (version "v2.10.16")
+ (source
+ (origin
+ (uri
+ (git-reference
+ ;; This fork includes a fix to an out-of-bounds error.
+ (url "https://github.com/priv-kweihmann/cpprestsdk")
+ (commit "gcc10-64bit")))
+ (method git-fetch)
+ (hash
+ (content-hash
+ "03cd0p0fjvfi94avqvf00g89a9qqkj2r7skm4xnvr4p7hihw1ikd"))))
+ (build-system cmake-build-system)
+ (arguments
+ (list
+ #:phases
+ #~ (modify-phases %standard-phases (delete 'check))))
+ (native-inputs (list boost openssl websocketpp zlib))
+ (synopsis "The Microsoft C++ REST SDK")
+ (description
+ (string-append
+ "The C++ REST SDK is a Microsoft project for cloud-based client-server "
+ "communication in native code using a modern asynchronous C++ API "
+ "design. This project aims to help C++ developers connect to and "
+ "interact with services."))
+ (license license:expat)
+ (home-page "https://github.com/microsoft/cpprestsdk")))
diff --git a/packages/komodo/komodo-libsodium-cmakelists.txt b/packages/komodo/komodo-libsodium-cmakelists.txt
new file mode 100644
index 0000000..cb26b36
--- /dev/null
+++ b/packages/komodo/komodo-libsodium-cmakelists.txt
@@ -0,0 +1,744 @@
+cmake_minimum_required(VERSION 3.9)
+
+include(CheckCSourceRuns)
+
+file(STRINGS ${CMAKE_CURRENT_LIST_DIR}/configure.ac config_ac_contents)
+
+foreach (line ${config_ac_contents})
+ if (line MATCHES "AC_INIT\\(\\[libsodium\\],\\[([0-9.]+)\\],")
+ set(VERSION ${CMAKE_MATCH_1})
+ elseif (line MATCHES "SODIUM_LIBRARY_VERSION_(MAJOR|MINOR)=([0-9]+)")
+ set(SODIUM_LIBRARY_VERSION_${CMAKE_MATCH_1} ${CMAKE_MATCH_2})
+ endif ()
+endforeach ()
+
+message("VERSION: ${VERSION}")
+message("SODIUM_LIBRARY_VERSION_MAJOR: ${SODIUM_LIBRARY_VERSION_MAJOR}")
+message("SODIUM_LIBRARY_VERSION_MINOR: ${SODIUM_LIBRARY_VERSION_MINOR}")
+
+project(sodium VERSION ${VERSION} LANGUAGES C ASM)
+
+include(CheckCSourceCompiles)
+include(CheckFunctionExists)
+include(CheckIncludeFile)
+include(CMakePackageConfigHelpers)
+include(CTest)
+include(GNUInstallDirs)
+include(TestBigEndian)
+
+set(CMAKE_C_STANDARD 99)
+set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
+set(CMAKE_DISABLE_SOURCE_CHANGES ON)
+set(CMAKE_DISABLE_IN_SOURCE_BUILD ON)
+
+option(BUILD_SHARED_LIBS "Build shared library" ${BUILD_SHARED_LIBS})
+option(ENABLE_SSP "Compile with -fstack-protector" ON)
+option(ENABLE_PIE "Compile with -fPIE" ON)
+option(ENABLE_BLOCKING_RANDOM "Enable blocking random" OFF)
+option(ENABLE_MINIMAL "Only compile the minimum set of functions required for the high-level API" OFF)
+option(ENABLE_PTHREADS "Use pthreads library" ON)
+option(ENABLE_RETPOLINE "Use return trampolines for indirect calls" OFF)
+
+if (ENABLE_MINIMAL)
+ set(SODIUM_LIBRARY_MINIMAL_DEF "#define SODIUM_LIBRARY_MINIMAL 1")
+endif ()
+
+configure_file(
+ src/libsodium/include/sodium/version.h.in
+ ${CMAKE_BINARY_DIR}/sodium/version.h
+)
+
+file(GLOB sodium_headers
+ ${PROJECT_SOURCE_DIR}/src/libsodium/include/sodium/*.h
+ ${PROJECT_SOURCE_DIR}/src/libsodium/include/sodium.h
+ ${CMAKE_BINARY_DIR}/sodium/version.h
+)
+
+if (UNIX)
+ file(GLOB_RECURSE sodium_sources
+ ${PROJECT_SOURCE_DIR}/src/libsodium/*.c
+ ${PROJECT_SOURCE_DIR}/src/libsodium/*.S # HAVE_AVX_ASM
+ )
+else ()
+ file(GLOB_RECURSE sodium_sources
+ ${PROJECT_SOURCE_DIR}/src/libsodium/*.c
+ )
+endif ()
+
+if (MSVC)
+ enable_language(RC)
+
+ list(APPEND sodium_sources
+ builds/msvc/resource.rc
+ )
+endif ()
+
+add_library(${PROJECT_NAME}
+ ${sodium_headers}
+ ${sodium_sources}
+)
+
+set_target_properties(${PROJECT_NAME}
+ PROPERTIES
+ PREFIX ""
+ OUTPUT_NAME "lib${PROJECT_NAME}"
+)
+
+test_big_endian(IS_BIG_ENDIAN)
+
+if (IS_BIG_ENDIAN)
+ target_compile_definitions(${PROJECT_NAME} PRIVATE NATIVE_BIG_ENDIAN)
+else ()
+ target_compile_definitions(${PROJECT_NAME} PRIVATE NATIVE_LITTLE_ENDIAN)
+endif ()
+
+macro (sodium_check_func func var)
+ check_function_exists(${func} ${var})
+ if (${var})
+ target_compile_definitions(${PROJECT_NAME} PRIVATE ${var}=1)
+ endif ()
+endmacro ()
+
+if (MSVC)
+ target_compile_options(${PROJECT_NAME}
+ PRIVATE
+ /D_CONSOLE
+ /D_CRT_SECURE_NO_WARNINGS
+ /DCPU_UNALIGNED_ACCESS=1
+ /MP
+ /Dinline=__inline
+ /wd4068 # Unknown pragma
+ /wd4197
+ /wd4244 # Macro redefinition
+ )
+
+ target_link_libraries(${PROJECT_NAME}
+ PUBLIC
+ advapi32
+ )
+else ()
+ if (ENABLE_BLOCKING_RANDOM)
+ target_compile_definitions(${PROJECT_NAME} PRIVATE USE_BLOCKING_RANDOM)
+ endif ()
+
+ if (ENABLE_PTHREADS)
+ target_compile_definitions(${PROJECT_NAME} PRIVATE HAVE_PTHREAD)
+ target_compile_options(${PROJECT_NAME} PRIVATE -ftls-model=local-dynamic)
+ target_compile_options(${PROJECT_NAME} PUBLIC -pthread)
+ endif ()
+
+ if (ENABLE_SSP)
+ target_compile_options(${PROJECT_NAME} PRIVATE -fstack-protector-all)
+ endif ()
+
+ if (ENABLE_PIE)
+ target_compile_options(${PROJECT_NAME} PRIVATE -fPIE)
+ endif ()
+
+ if (ENABLE_RETPOLINE)
+ target_compile_options(${PROJECT_NAME}
+ PRIVATE
+ -mindirect-branch=thunk-inline
+ -mindirect-branch-register
+ )
+ endif ()
+
+ target_compile_options(${PROJECT_NAME}
+ PRIVATE
+ -flax-vector-conversions
+ -fvisibility=hidden
+ -fPIC
+ -fwrapv
+ -Wall
+ -Wextra
+ -Wbad-function-cast
+ -Wcast-qual
+ #-Wdiv-by-zero
+ #-Wduplicated-branches
+ #-Wduplicated-cond
+ -Wfloat-equal
+ -Wformat=2
+ -Wlogical-op
+ -Wmaybe-uninitialized
+ #-Wmisleading-indentation
+ -Wmissing-declarations
+ -Wmissing-prototypes
+ -Wnested-externs
+ #-Wno-type-limits
+ #-Wno-unknown-pragmas
+ -Wnormalized=id
+ #-Wnull-dereference
+ -Wold-style-declaration
+ -Wpointer-arith
+ -Wredundant-decls
+ #-Wrestrict
+ #-Wsometimes-uninitialized
+ -Wstrict-prototypes
+ -Wswitch-enum
+ #-Wvariable-decl
+ -Wwrite-strings
+ -Wl,-z,relro
+ -Wl,-z,now
+ -Wl,-z,noexecstack
+ )
+
+ if (CMAKE_C_COMPILER_ID STREQUAL "Clang" OR
+ CMAKE_C_COMPILER_ID STREQUAL "AppleClang")
+ target_compile_options(${PROJECT_NAME}
+ PRIVATE
+ -Wno-unknown-warning-option
+ -Wshorten-64-to-32
+ )
+ endif ()
+
+ check_include_file(sys/mman.h HAVE_SYS_MMAN_H)
+ if (HAVE_SYS_MMAN_H)
+ target_compile_definitions(${PROJECT_NAME} PRIVATE HAVE_SYS_MMAN_H)
+ endif ()
+
+ sodium_check_func(arc4random HAVE_SAFE_ARC4RANDOM)
+ sodium_check_func(mmap HAVE_MMAP)
+ sodium_check_func(mlock HAVE_MLOCK)
+ sodium_check_func(madvise HAVE_MADVISE)
+ sodium_check_func(mprotect HAVE_MPROTECT)
+ sodium_check_func(memset_s HAVE_MEMSET_S)
+ sodium_check_func(explicit_bzero HAVE_EXPLICIT_BZERO)
+ sodium_check_func(explicit_memset HAVE_EXPLICIT_MEMSET)
+ sodium_check_func(nanosleep HAVE_NANOSLEEP)
+ sodium_check_func(posix_memalign HAVE_POSIX_MEMALIGN)
+ sodium_check_func(getpid HAVE_GETPID)
+
+ check_c_source_runs(
+ "
+ #pragma GCC target(\"mmx\")
+ #include <mmintrin.h>
+ int main(void)
+ {
+ __m64 x = _mm_setzero_si64();
+ }
+ "
+ HAVE_MMINTRIN_H
+ )
+
+ if (HAVE_MMINTRIN_H)
+ target_compile_definitions(${PROJECT_NAME} PRIVATE HAVE_MMINTRIN_H=1)
+ target_compile_options(${PROJECT_NAME} PRIVATE -mmmx)
+ endif ()
+
+ check_c_source_runs(
+ "
+ #pragma GCC target(\"sse2\")
+ #ifndef __SSE2__
+ # define __SSE2__
+ #endif
+
+ #include <emmintrin.h>
+ int main(void) {
+ __m128d x = _mm_setzero_pd();
+ __m128i z = _mm_srli_epi64(_mm_setzero_si128(), 26);
+ }
+ "
+ HAVE_EMMINTRIN_H
+ )
+
+ if (HAVE_EMMINTRIN_H)
+ target_compile_definitions(${PROJECT_NAME} PRIVATE HAVE_EMMINTRIN_H=1)
+ target_compile_options(${PROJECT_NAME} PRIVATE -msse2)
+ endif ()
+
+ check_c_source_runs(
+ "
+ #pragma GCC target(\"sse3\")
+ #include <pmmintrin.h>
+ int main(void) {
+ __m128 x = _mm_addsub_ps(_mm_cvtpd_ps(_mm_setzero_pd()), _mm_cvtpd_ps(_mm_setzero_pd()));
+ }
+ "
+ HAVE_PMMINTRIN_H
+ )
+
+ if (HAVE_PMMINTRIN_H)
+ target_compile_definitions(${PROJECT_NAME} PRIVATE HAVE_PMMINTRIN_H=1)
+ target_compile_options(${PROJECT_NAME} PRIVATE -msse3)
+ endif ()
+
+ check_c_source_runs(
+ "
+ #pragma GCC target(\"ssse3\")
+ #include <tmmintrin.h>
+ int main(void) {
+ __m64 x = _mm_abs_pi32(_m_from_int(0));
+ }
+ "
+ HAVE_TMMINTRIN_H
+ )
+
+ if (HAVE_TMMINTRIN_H)
+ target_compile_definitions(${PROJECT_NAME} PRIVATE HAVE_TMMINTRIN_H=1)
+ target_compile_options(${PROJECT_NAME} PRIVATE -mssse3)
+ endif ()
+
+ check_c_source_runs(
+ "
+ #pragma GCC target(\"sse4.1\")
+ #include <smmintrin.h>
+ int main(void) {
+ __m128i x = _mm_minpos_epu16(_mm_setzero_si128());
+ }
+ "
+ HAVE_SMMINTRIN_H
+ )
+
+ if (HAVE_SMMINTRIN_H)
+ target_compile_definitions(${PROJECT_NAME} PRIVATE HAVE_SMMINTRIN_H=1)
+ target_compile_options(${PROJECT_NAME} PRIVATE -msse4.1)
+ endif ()
+
+ check_c_source_runs(
+ "
+ #ifdef __native_client__
+ # error NativeClient detected - Avoiding AVX opcodes
+ #endif
+ #pragma GCC target(\"avx\")
+ #include <immintrin.h>
+ int main(void) {
+ _mm256_zeroall();
+ }
+ "
+ HAVE_AVXINTRIN_H
+ )
+
+ if (HAVE_AVXINTRIN_H)
+ target_compile_definitions(${PROJECT_NAME} PRIVATE HAVE_AVXINTRIN_H=1)
+ target_compile_options(${PROJECT_NAME} PRIVATE -mavx)
+ endif ()
+
+ check_c_source_runs(
+ "
+ #ifdef __native_client__
+ # error NativeClient detected - Avoiding AVX2 opcodes
+ #endif
+ #pragma GCC target(\"avx2\")
+ #include <immintrin.h>
+ int main(void) {
+ __m256 x = _mm256_set1_ps(3.14);
+ __m256 y = _mm256_permutevar8x32_ps(x, _mm256_set1_epi32(42));
+ return _mm256_movemask_ps(_mm256_cmp_ps(x, y, _CMP_NEQ_OQ));
+ }
+ "
+ HAVE_AVX2INTRIN_H
+ )
+
+ if (HAVE_AVX2INTRIN_H)
+ target_compile_definitions(${PROJECT_NAME} PRIVATE HAVE_AVX2INTRIN_H=1)
+ target_compile_options(${PROJECT_NAME} PRIVATE -mavx2)
+
+ check_c_source_runs(
+ "
+ #ifdef __native_client__
+ # error NativeClient detected - Avoiding AVX2 opcodes
+ #endif
+ #pragma GCC target(\"avx2\")
+ #include <immintrin.h>
+ int main(void) {
+ __m256i y = _mm256_broadcastsi128_si256(_mm_setzero_si128());
+ }
+ "
+ _mm256_broadcastsi128_si256_DEFINED
+ )
+
+ if (NOT _mm256_broadcastsi128_si256_DEFINED)
+ target_compile_definitions(${PROJECT_NAME}
+ PRIVATE
+ _mm256_broadcastsi128_si256=_mm_broadcastsi128_si256
+ )
+ endif ()
+ endif ()
+
+ check_c_source_runs(
+ "
+ #ifdef __native_client__
+ # error NativeClient detected - Avoiding AVX512F opcodes
+ #endif
+ #pragma GCC target(\"avx512f\")
+ #include <immintrin.h>
+
+ #ifndef __AVX512F__
+ # error No AVX512 support
+ #elif defined(__clang__)
+ # if __clang_major__ < 4
+ # error Compiler AVX512 support may be broken
+ # endif
+ #elif defined(__GNUC__)
+ # if __GNUC__ < 6
+ # error Compiler AVX512 support may be broken
+ # endif
+ #endif
+
+ int main(void) {
+ __m512i x = _mm512_setzero_epi32();
+ __m512i y = _mm512_permutexvar_epi64(_mm512_setr_epi64(0, 1, 4, 5, 2, 3, 6, 7), x);
+ }
+ "
+ HAVE_AVX512FINTRIN_H
+ )
+
+ if (HAVE_AVX512FINTRIN_H)
+ target_compile_definitions(${PROJECT_NAME} PRIVATE HAVE_AVX512FINTRIN_H=1)
+ target_compile_options(${PROJECT_NAME} PRIVATE -mavx512f)
+ else ()
+ target_compile_options(${PROJECT_NAME} PRIVATE -mno-avx512f)
+ endif ()
+
+ check_c_source_runs(
+ "
+ #ifdef __native_client__
+ # error NativeClient detected - Avoiding AESNI opcodes
+ #endif
+ #pragma GCC target(\"aes\")
+ #pragma GCC target(\"pclmul\")
+ #include <wmmintrin.h>
+
+ int main(void) {
+ __m128i x = _mm_aesimc_si128(_mm_setzero_si128());
+ __m128i y = _mm_clmulepi64_si128(_mm_setzero_si128(), _mm_setzero_si128(), 0);
+ }
+ "
+ HAVE_WMMINTRIN_H
+ )
+
+ if (HAVE_WMMINTRIN_H)
+ target_compile_definitions(${PROJECT_NAME} PRIVATE HAVE_WMMINTRIN_H=1)
+ target_compile_options(${PROJECT_NAME} PRIVATE -maes -mpclmul)
+ endif ()
+
+ check_c_source_runs(
+ "
+ #ifdef __native_client__
+ # error NativeClient detected - Avoiding RDRAND opcodes
+ #endif
+ #pragma GCC target(\"rdrnd\")
+ #include <immintrin.h>
+
+ int main(void) {
+ unsigned long long x;
+ _rdrand64_step(&x);
+ }
+ "
+ HAVE_RDRAND
+ )
+
+ if (HAVE_RDRAND)
+ target_compile_definitions(${PROJECT_NAME} PRIVATE HAVE_RDRAND=1)
+ target_compile_options(${PROJECT_NAME} PRIVATE -mrdrnd)
+ endif ()
+
+ check_c_source_runs(
+ "
+ #include <intrin.h>
+
+ int main(void) {
+ (void) _xgetbv(0);
+ }
+ "
+ HAVE__XGETBV
+ )
+
+ if (HAVE__XGETBV)
+ target_compile_definitions(${PROJECT_NAME} PRIVATE HAVE__XGETBV=1)
+ endif ()
+
+ check_c_source_runs(
+ "
+ int main(void) {
+ int a = 42;
+ int *pnt = &a;
+ __asm__ __volatile__ (\"\" : : \"r\"(pnt) : \"memory\");
+ }
+ "
+ HAVE_INLINE_ASM
+ )
+
+ if (HAVE_INLINE_ASM)
+ target_compile_definitions(${PROJECT_NAME} PRIVATE HAVE_INLINE_ASM=1)
+ endif ()
+
+ check_c_source_runs(
+ "
+ int main(void) {
+ #if defined(__amd64) || defined(__amd64__) || defined(__x86_64__)
+ # if defined(__CYGWIN__) || defined(__MINGW32__) || defined(__MINGW64__) || defined(_WIN32) || defined(_WIN64)
+ # error Windows x86_64 calling conventions are not supported yet
+ # endif
+ /* neat */
+ #else
+ # error !x86_64
+ #endif
+ unsigned char i = 0, o = 0, t;
+ __asm__ __volatile__ (\"pxor %%xmm12, %%xmm6 \n\"
+ \"movb (%[i]), %[t] \n\"
+ \"addb %[t], (%[o]) \n\"
+ : [t] \"=&r\"(t)
+ : [o] \"D\"(&o), [i] \"S\"(&i)
+ : \"memory\", \"flags\", \"cc\");
+ }
+ "
+ HAVE_AMD64_ASM
+ )
+
+ if (HAVE_AMD64_ASM)
+ target_compile_definitions(${PROJECT_NAME} PRIVATE HAVE_AMD64_ASM=1)
+ endif ()
+
+ check_c_source_runs(
+ "
+ int main(void) {
+ #if defined(__amd64) || defined(__amd64__) || defined(__x86_64__)
+ # if defined(__CYGWIN__) || defined(__MINGW32__) || defined(__MINGW64__) || defined(_WIN32) || defined(_WIN64)
+ # error Windows x86_64 calling conventions are not supported yet
+ # endif
+ /* neat */
+ #else
+ # error !x86_64
+ #endif
+ __asm__ __volatile__ (\"vpunpcklqdq %xmm0,%xmm13,%xmm0\");
+ }
+ "
+ HAVE_AVX_ASM
+ )
+
+ if (HAVE_AVX_ASM)
+ target_compile_definitions(${PROJECT_NAME} PRIVATE HAVE_AVX_ASM=1)
+ endif ()
+
+ check_c_source_runs(
+ "
+ #if !defined(__clang__) && !defined(__GNUC__) && !defined(__SIZEOF_INT128__)
+ # error mode(TI) is a gcc extension, and __int128 is not available
+ #endif
+ #if defined(__clang__) && !defined(__x86_64__) && !defined(__aarch64__)
+ # error clang does not properly handle the 128-bit type on 32-bit systems
+ #endif
+ #ifndef NATIVE_LITTLE_ENDIAN
+ # error libsodium currently expects a little endian CPU for the 128-bit type
+ #endif
+ #ifdef __EMSCRIPTEN__
+ # error emscripten currently doesn't support some operations on integers larger than 64 bits
+ #endif
+ #include <stddef.h>
+ #include <stdint.h>
+ #if defined(__SIZEOF_INT128__)
+ typedef unsigned __int128 uint128_t;
+ #else
+ typedef unsigned uint128_t __attribute__((mode(TI)));
+ #endif
+ void fcontract(uint128_t *t) {
+ *t += 0x8000000000000 - 1;
+ *t *= *t;
+ *t >>= 84;
+ }
+
+ int main(void) {
+ (void) fcontract;
+ }
+ "
+ HAVE_TI_MODE
+ )
+
+ if (HAVE_TI_MODE)
+ target_compile_definitions(${PROJECT_NAME} PRIVATE HAVE_TI_MODE=1)
+ endif ()
+
+ check_c_source_runs(
+ "
+ int main(void) {
+ unsigned int cpu_info[4];
+ __asm__ __volatile__ (\"xchgl %%ebx, %k1; cpuid; xchgl %%ebx, %k1\" :
+ \"=a\" (cpu_info[0]), \"=&r\" (cpu_info[1]),
+ \"=c\" (cpu_info[2]), \"=d\" (cpu_info[3]) :
+ \"0\" (0U), \"2\" (0U));
+ }
+ "
+ HAVE_CPUID
+ )
+
+ if (HAVE_CPUID)
+ target_compile_definitions(${PROJECT_NAME} PRIVATE HAVE_CPUID=1)
+ endif ()
+
+ check_c_source_runs(
+ "
+ #if !defined(__ELF__) && !defined(__APPLE_CC__)
+ # error Support for weak symbols may not be available
+ #endif
+ __attribute__((weak)) void __dummy(void *x) { }
+ void f(void *x) { __dummy(x); }
+ int main(void) {}
+ "
+ HAVE_WEAK_SYMBOLS
+ )
+
+ if (HAVE_WEAK_SYMBOLS)
+ target_compile_definitions(${PROJECT_NAME} PRIVATE HAVE_WEAK_SYMBOLS=1)
+ endif ()
+
+ check_c_source_runs(
+ "
+ int main(void) {
+ static volatile int _sodium_lock;
+ __sync_lock_test_and_set(&_sodium_lock, 1);
+ __sync_lock_release(&_sodium_lock);
+ }
+ "
+ HAVE_ATOMIC_OPS
+ )
+
+ if (HAVE_ATOMIC_OPS)
+ target_compile_definitions(${PROJECT_NAME} PRIVATE HAVE_ATOMIC_OPS=1)
+ endif ()
+
+ check_c_source_runs(
+ "
+ #include <limits.h>
+ #include <stdint.h>
+ int main(void) {
+ (void) SIZE_MAX;
+ (void) UINT64_MAX;
+ }
+ "
+ STDC_LIMIT_MACROS_REQUIRED
+ )
+
+ if (STDC_LIMIT_MACROS_REQUIRED)
+ target_compile_definitions(${PROJECT_NAME}
+ PRIVATE
+ __STDC_LIMIT_MACROS
+ __STDC_CONSTANT_MACROS
+ )
+ endif ()
+
+ # include/sodium/private/common.h
+ target_compile_definitions(${PROJECT_NAME} PRIVATE CONFIGURED=1)
+endif ()
+
+if (BUILD_SHARED_LIBS)
+ if (MSVC)
+ target_compile_definitions(${PROJECT_NAME}
+ PRIVATE
+ SODIUM_DLL_EXPORT
+ )
+ endif ()
+else ()
+ target_compile_definitions(${PROJECT_NAME}
+ PUBLIC
+ SODIUM_STATIC
+ )
+endif ()
+
+target_include_directories(${PROJECT_NAME}
+ PRIVATE
+ $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src/libsodium/include/sodium>
+ $<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/sodium>
+)
+
+if (BUILD_TESTING)
+ file(GLOB sodium_test_sources ${PROJECT_SOURCE_DIR}/test/default/*.c)
+
+ foreach (test_src ${sodium_test_sources})
+ get_filename_component(test_name ${test_src} NAME_WE)
+
+ add_executable(${test_name} ${test_src})
+
+ if (MSVC)
+ target_compile_definitions(${test_name} PRIVATE _CRT_SECURE_NO_WARNINGS)
+ endif ()
+
+ target_include_directories(${test_name}
+ PRIVATE
+ $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src/libsodium/include>
+ $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src/libsodium/include/sodium>
+ $<BUILD_INTERFACE:${CMAKE_BINARY_DIR}>
+ $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/test/quirks>
+ )
+
+ target_link_libraries(${test_name} PRIVATE ${PROJECT_NAME})
+
+ add_custom_command(TARGET ${test_name} POST_BUILD
+ COMMAND ${CMAKE_COMMAND} -E copy_if_different
+ "${CMAKE_CURRENT_LIST_DIR}/test/default/${test_name}.exp"
+ $<TARGET_FILE_DIR:${test_name}>)
+
+ add_test(
+ NAME ${test_name}
+ COMMAND ${test_name}
+ WORKING_DIRECTORY $<TARGET_FILE_DIR:${test_name}>
+ )
+ endforeach ()
+endif ()
+
+install(DIRECTORY src/libsodium/include/
+ DESTINATION include/
+ USE_SOURCE_PERMISSIONS
+ PATTERN "*.h"
+ PATTERN "*.h.in" EXCLUDE
+ REGEX "private($|/)" EXCLUDE
+)
+
+install(FILES ${CMAKE_BINARY_DIR}/sodium/version.h
+ DESTINATION include/sodium
+)
+
+install(TARGETS ${PROJECT_NAME}
+ EXPORT ${PROJECT_NAME}-targets
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+ INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+)
+
+install(EXPORT ${PROJECT_NAME}-targets
+ FILE unofficial-${PROJECT_NAME}Targets.cmake
+ NAMESPACE unofficial-${PROJECT_NAME}::
+ DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/unofficial-${PROJECT_NAME}
+)
+
+set(TARGET_NAME unofficial-${PROJECT_NAME}::${PROJECT_NAME})
+
+configure_package_config_file(
+ ${PROJECT_NAME}Config.cmake.in
+ ${CMAKE_CURRENT_BINARY_DIR}/unofficial-${PROJECT_NAME}Config.cmake
+ INSTALL_DESTINATION ${PROJECT_BINARY_DIR}
+)
+
+write_basic_package_version_file(
+ ${CMAKE_CURRENT_BINARY_DIR}/unofficial-${PROJECT_NAME}ConfigVersion.cmake
+ VERSION ${VERSION}
+ COMPATIBILITY AnyNewerVersion
+)
+
+unset(TARGET_NAME)
+
+install(
+ FILES
+ ${CMAKE_CURRENT_BINARY_DIR}/unofficial-${PROJECT_NAME}Config.cmake
+ ${CMAKE_CURRENT_BINARY_DIR}/unofficial-${PROJECT_NAME}ConfigVersion.cmake
+ DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/unofficial-${PROJECT_NAME}
+)
+
+# References:
+# https://github.com/boost-cmake/bcm/wiki/Cmake-best-practices-and-guidelines
+# https://github.com/jedisct1/libsodium/pull/74/files
+# https://github.com/jedisct1/libsodium/pull/156/files
+# https://github.com/jedisct1/libsodium/pull/181/files
+# https://github.com/jedisct1/libsodium/issues/378
+# https://github.com/jedisct1/libsodium/issues/636
+# https://github.com/jedisct1/libsodium/issues/771
+# https://github.com/jedisct1/libsodium/blob/gyp/sodium.gyp
+# https://github.com/imefisto/cmake-libsodium
+# https://github.com/Cyberunner23/libsodium-CMake
+# https://stackoverflow.com/questions/29901352/appending-to-cmake-c-flags
+# https://stackoverflow.com/questions/986426/what-do-stdc-limit-macros-and-stdc-constant-macros-mean
+# https://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html
+# https://stackoverflow.com/questions/15132185/mixing-c-and-assembly-sources-and-build-with-cmake
+# https://stackoverflow.com/questions/647892/how-to-check-header-files-and-library-functions-in-cmake-like-it-is-done-in-auto
+# https://stackoverflow.com/questions/31038963/how-do-you-rename-a-library-filename-in-cmake
diff --git a/packages/komodo/komodo-libsodium-sodiumconfig.cmake.in b/packages/komodo/komodo-libsodium-sodiumconfig.cmake.in
new file mode 100644
index 0000000..9673dab
--- /dev/null
+++ b/packages/komodo/komodo-libsodium-sodiumconfig.cmake.in
@@ -0,0 +1,61 @@
+# sodium cmake module
+# This module sets the following variables in your project:
+#
+# sodium_FOUND - true if sodium found on the system
+# sodium_INCLUDE_DIR - the directory containing sodium headers
+# sodium_LIBRARY_DEBUG
+# sodium_LIBRARY_RELEASE
+# sodium_LIBRARIES
+# sodium_VERSION
+#
+
+include(FindPackageHandleStandardArgs)
+include(SelectLibraryConfigurations)
+
+@PACKAGE_INIT@
+
+if (NOT TARGET @TARGET_NAME@)
+ include("${CMAKE_CURRENT_LIST_DIR}/unofficial-@PROJECT_NAME@Targets.cmake")
+
+ set(@PROJECT_NAME@_VERSION @VERSION@)
+
+ get_target_property(@PROJECT_NAME@_INCLUDE_DIR @TARGET_NAME@ INTERFACE_INCLUDE_DIRECTORIES)
+
+ get_target_property(@PROJECT_NAME@_LIBRARY_DEBUG @TARGET_NAME@ IMPORTED_IMPLIB_DEBUG)
+ if (@PROJECT_NAME@_LIBRARY_DEBUG MATCHES ".*-NOTFOUND")
+ get_target_property(@PROJECT_NAME@_LIBRARY_DEBUG @TARGET_NAME@ IMPORTED_LOCATION_DEBUG)
+ else ()
+ get_target_property(@PROJECT_NAME@_DLL_DEBUG @TARGET_NAME@ IMPORTED_LOCATION_DEBUG)
+ endif ()
+
+ get_target_property(@PROJECT_NAME@_LIBRARY_RELEASE @TARGET_NAME@ IMPORTED_IMPLIB_RELEASE)
+ if (@PROJECT_NAME@_LIBRARY_RELEASE MATCHES ".*-NOTFOUND")
+ get_target_property(@PROJECT_NAME@_LIBRARY_RELEASE @TARGET_NAME@ IMPORTED_LOCATION_RELEASE)
+ else ()
+ get_target_property(@PROJECT_NAME@_DLL_RELEASE @TARGET_NAME@ IMPORTED_LOCATION_RELEASE)
+ endif ()
+
+ select_library_configurations(@PROJECT_NAME@)
+endif ()
+
+find_package_handle_standard_args(
+ @PROJECT_NAME@
+ REQUIRED_VARS
+ @PROJECT_NAME@_INCLUDE_DIR
+ @PROJECT_NAME@_LIBRARIES
+ VERSION_VAR
+ @PROJECT_NAME@_VERSION
+)
+
+mark_as_advanced(@PROJECT_NAME@_INCLUDE_DIR)
+
+if (WIN32)
+ mark_as_advanced(@PROJECT_NAME@_DLL_DEBUG)
+ mark_as_advanced(@PROJECT_NAME@_DLL_RELEASE)
+endif()
+
+
+# References:
+# https://github.com/jedisct1/libsodium/blob/master/contrib/Findsodium.cmake
+# https://github.com/QuantStack/xeus/blob/master/xeusConfig.cmake.in
+# https://github.com/zeromq/libzmq/blob/master/builds/cmake/ZeroMQConfig.cmake.in \ No newline at end of file
diff --git a/packages/komodo/komodo.scm b/packages/komodo/komodo.scm
new file mode 100644
index 0000000..7ee7eae
--- /dev/null
+++ b/packages/komodo/komodo.scm
@@ -0,0 +1,178 @@
+(define-module (komodo)
+ #:use-module (cpprestsdk)
+ #:use-module (gnu packages)
+ #:use-module (gnu packages boost)
+ #:use-module (gnu packages calendar)
+ #:use-module (gnu packages check)
+ #:use-module (gnu packages compression)
+ #:use-module (gnu packages cpp)
+ #:use-module (gnu packages game-development)
+ #:use-module (gnu packages logging)
+ #:use-module (gnu packages pretty-print)
+ #:use-module (gnu packages qt)
+ #:use-module (gnu packages tls)
+ #:use-module (gnu packages version-control)
+ #:use-module (guix build utils)
+ #:use-module (guix build-system qt)
+ #:use-module (guix download)
+ #:use-module (guix gexp)
+ #:use-module (guix git-download)
+ #:use-module ((guix licenses)
+ #:prefix license:)
+ #:use-module (guix packages)
+ #:use-module (libsodium-komodo))
+
+(define komodo-wallet-version "0.7.0-beta")
+
+;;; Git References
+
+(define expected-git-reference
+ (git-reference (url "https://github.com/TartanLlama/expected")
+ (commit "v1.1.0")
+ (recursive? #t)))
+
+(define komodo-wallet-git-reference
+ (git-reference (url "https://github.com/KomodoPlatform/komodo-wallet-desktop")
+ (commit komodo-wallet-version)))
+
+;;; Hashes
+
+(define expected-hash
+ (content-hash "17akrv80h0n4cfmxwvlvbb8ycqza7y3qqygjyphv95rrabqm9r02"))
+
+(define jl777-coins-hash
+ (content-hash "1icbd6f8nridzc93vz7hsr5dnkrf328zfsw6rrzifc7nvsr559w8"))
+
+(define komodo-wallet-hash
+ (content-hash "0pfkgas0xkixf99zqzyri80ksp89b7dw7hbcgpp60ni2cnchxk2n"))
+
+(define mm2-hash
+ (content-hash "1bn2sjcrp9ih44h3p96prnwg74aids7fgzcnlv3c68nan6y2lysi"))
+
+;;; Package Origins
+
+(define expected-file-name
+ (git-file-name "libexpected" "1.1.0"))
+
+(define expected-patches
+ (search-patches "libexpected-use-provided-catch2.patch"))
+
+(define expected-origin
+ (origin (uri expected-git-reference)
+ (method git-fetch)
+ (hash expected-hash)
+ (file-name expected-file-name)
+ (patches expected-patches)))
+
+(define jl777-coins-origin
+ (origin (uri "https://github.com/KomodoPlatform/coins/archive/master.zip")
+ (method url-fetch)
+ (hash jl777-coins-hash)))
+
+(define komodo-wallet-origin
+ (origin (uri komodo-wallet-git-reference)
+ (method git-fetch)
+ (hash komodo-wallet-hash)))
+
+(define mm2-origin
+ (origin (uri "https://sdk.devbuilds.komodo.earth/main/mm2_b0fd99e-linux-x86-64.zip")
+ (method url-fetch)
+ (hash mm2-hash)))
+
+;;; Path Constructors
+
+(define build-deps-prefix "../build/_deps/")
+
+(define expected-src "expected-src/")
+
+(define jl777-coins-src "jl777-coins-src/")
+
+(define mm2-src "mm2-src/")
+
+(define build-path-mm2
+ (string-append build-deps-prefix
+ mm2-src))
+
+(define build-path-jl777-coins
+ (string-append build-deps-prefix
+ jl777-coins-src))
+
+(define build-path-expected
+ (string-append build-deps-prefix
+ expected-src))
+
+;;; Phase Definitions
+
+(define prepare-build-paths
+ `(string-append "file(MAKE_DIRECTORY \"" ,build-path-expected "\")\n"
+ "file(MAKE_DIRECTORY \"" ,build-path-jl777-coins "\")\n"
+ "file(MAKE_DIRECTORY \"" ,build-path-mm2 "\")\n"))
+
+(define prepare-expected-src
+ `(string-append "file(COPY " ,expected-origin "/ "
+ "DESTINATION " ,build-path-expected " "
+ "NO_SOURCE_PERMISSIONS FOLLOW_SYMLINK_CHAIN)\n"))
+
+(define prepare-jl777-coins-src
+ `(string-append "file(ARCHIVE_EXTRACT INPUT " ,jl777-coins-origin " "
+ "DESTINATION " ,build-path-jl777-coins ")\n"
+ "file(COPY " ,build-path-jl777-coins "/coins-master/ "
+ "DESTINATION " ,build-path-jl777-coins ")\n"))
+
+(define prepare-mm2-src
+ `(string-append "file(ARCHIVE_EXTRACT INPUT " ,mm2-origin " "
+ "DESTINATION " ,build-path-mm2 ")\n"))
+
+(define vcpkg-replacement
+ `(string-append "\n"
+ ,prepare-build-paths
+ ,prepare-expected-src
+ ,prepare-jl777-coins-src
+ ,prepare-mm2-src
+ "\n"))
+
+(define replace-vcpkg
+ `(substitute* "CMakeLists.txt"
+ (("include\\(vcpkg_prerequisites\\)")
+ ,vcpkg-replacement)))
+
+;;; Build Arguments
+
+(define komodo-wallet-configure-flags
+ '(list "-DFETCHCONTENT_FULLY_DISCONNECTED=ON"
+ "-Wno-dev"))
+
+(define komodo-wallet-phases
+ #~ (modify-phases %standard-phases
+ (add-after 'unpack
+ 'delete-vcpkg
+ (lambda _ #+ replace-vcpkg))))
+
+;;; Package Definitions
+
+(define komodo-wallet-arguments
+ (list #:phases komodo-wallet-phases
+ #:configure-flags komodo-wallet-configure-flags))
+
+(define komodo-wallet-description
+ (string-append "Komodo Wallet is a secure wallet and non-custodial "
+ "decentralized exchange rolled into one application. Store "
+ "your coins, trade peer-to-peer with minimal fees and never "
+ "give up control over your digital assets."))
+
+(define komodo-wallet-native-inputs
+ (list boost cpprestsdk date doctest entt fmt git libsodium-komodo
+ nlohmann-json openssl qtcharts qtdeclarative-5 qttools-5 qtsvg-5
+ qtwebengine-5 range-v3 spdlog zlib))
+
+(define-public komodo-wallet
+ (package (name "komodo-wallet")
+ (version komodo-wallet-version)
+ (source komodo-wallet-origin)
+ (build-system qt-build-system)
+ (arguments komodo-wallet-arguments)
+ (native-inputs komodo-wallet-native-inputs)
+ (synopsis "Komodo Wallet Desktop GUI")
+ (description komodo-wallet-description)
+ (license license:gpl2)
+ (home-page "https://atomicdex.io/")))
diff --git a/packages/komodo/libsodium-komodo.scm b/packages/komodo/libsodium-komodo.scm
new file mode 100644
index 0000000..b1fe8b9
--- /dev/null
+++ b/packages/komodo/libsodium-komodo.scm
@@ -0,0 +1,36 @@
+(define-module (libsodium-komodo)
+ #:use-module (gnu packages crypto)
+ #:use-module (guix build-system cmake)
+ #:use-module (guix gexp)
+ #:use-module (guix packages))
+
+(define get-komodo-cmake
+ (local-file "komodo-libsodium-cmakelists.txt"))
+
+(define get-komodo-sodiumconfig
+ (local-file "komodo-libsodium-sodiumconfig.cmake.in"))
+
+(define copy-komodo-cmake
+ `(copy-recursively ,get-komodo-cmake
+ "CMakeLists.txt"))
+
+(define copy-komodo-sodiumconfig
+ `(copy-recursively ,get-komodo-sodiumconfig
+ "sodiumConfig.cmake.in"))
+
+(define phases
+ #~ (modify-phases %standard-phases
+ (add-after
+ 'unpack
+ 'add-cmakelists
+ (lambda _
+ #+ copy-komodo-cmake
+ #+ copy-komodo-sodiumconfig))))
+
+(define arguments
+ (list #:phases phases))
+
+(define-public libsodium-komodo
+ (package (inherit libsodium)
+ (build-system cmake-build-system)
+ (arguments arguments)))
diff --git a/packages/komodo/vcpkg.scm b/packages/komodo/vcpkg.scm
new file mode 100644
index 0000000..260ce19
--- /dev/null
+++ b/packages/komodo/vcpkg.scm
@@ -0,0 +1,168 @@
+(define-module (vcpkg)
+ ;; #:use-module (cmake)
+ ;; #:use-module (gnu packages commencement)
+ ;; #:use-module (gnu packages compression)
+ ;; #:use-module (gnu packages cpp)
+ ;; #:use-module (gnu packages curl)
+ ;; #:use-module (gnu packages ncurses)
+ ;; #:use-module (gnu packages ninja)
+ ;; #:use-module (guix build utils)
+ #:use-module (guix build-system copy)
+ #:use-module (guix build-system cmake)
+ ;; #:use-module (guix build-system qt)
+ #:use-module (guix download)
+ ;; #:use-module (guix gexp)
+ ;; #:use-module (guix git-download)
+ #:use-module ((guix licenses)
+ #:prefix license:)
+ #:use-module (guix packages)
+ ;; #:use-module (nonguix build-system binary)
+ )
+
+
+;;; ABSTRACTION -2
+
+(define-public vcpkg-tool-cmrc
+ (let ((version "2.0.1"))
+ (package
+ (name "vcpkg-cmrc")
+ (version version)
+ (source
+ (origin
+ (uri
+ (string-append
+ "https://github.com/vector-of-bool/cmrc/archive/refs/tags/"
+ version
+ ".tar.gz"))
+ (method url-fetch)
+ (hash
+ (content-hash
+ "06xpnnwbqv3r8v0vblzcrjp2zgddy05v132y9c9dz8dyl2m5zbgd"))))
+ (build-system copy-build-system)
+ (arguments
+ '(#:install-plan '(("CMakeRC.cmake" "CMakeRCConfig.cmake"))))
+ (synopsis "A Resource Compiler in a Single CMake Script")
+ (description
+ (string-append
+ "CMakeRC is a resource compiler provided in a single CMake "
+ "script that can easily be included in another project."))
+ (license license:expat)
+ (home-page "https://github.com/vector-of-bool/cmrc/"))))
+
+(define-public vcpkg-tool-fmt
+ (let ((version "10.1.0"))
+ (package
+ (name "vcpkg-fmt")
+ (version version)
+ (source
+ (origin
+ (uri
+ (string-append
+ "https://github.com/fmtlib/fmt/archive/refs/tags/"
+ version ".tar.gz"))
+ (method url-fetch)
+ (hash
+ (content-hash
+ "02na80r7yrkda89s7mz35llqh904dbsppb7g5s7na9ji5yns7c6y"))))
+ (build-system cmake-build-system)
+ (synopsis "A modern formatting library")
+ (description
+ (string-append
+ "{fmt} is an open-source formatting library providing a fast "
+ "and safe alternative to C stdio and C++ iostreams."))
+ (license license:expat)
+ (home-page "https://fmt.dev/"))))
+
+;;; ABSTRACTION -1
+
+(define vcpkg
+ (let ((version "2024.02.14"))
+ (package
+ (name "vcpkg")
+ (version version)
+ (source
+ (origin
+ (uri
+ (string-append
+ "https://github.com/microsoft/vcpkg/archive/refs/tags/"
+ version
+ ".tar.gz"))
+ (method url-fetch)
+ (hash
+ (content-hash
+ "1wbhxfbi964bc93f69rsr1h6z82ypc9lyz2rb0kp3sfwp0m9jhhf"))))
+ (build-system copy-build-system)
+ (arguments
+ (list
+ #:install-plan '(list (list "vcpkg" "vcpkg"))
+ #:phases
+ #~ (modify-phases
+ %standard-phases
+ (add-after
+ 'unpack
+ 'unpack-vcpkg-tool
+ (lambda _
+ (invoke "mkdir" "downloads")
+ (copy-recursively
+ #+ (origin
+ (uri
+ (string-append
+ "https://github.com/microsoft/vcpkg-tool/archive/"
+ "2024-02-07"
+ ".tar.gz"))
+ (method url-fetch)
+ (hash
+ (content-hash
+ "1j08vw8l8zf6pv6n1kvyjwvj0h7y667shs72sf69hg7p8zj5k9p4")))
+ "downloads/2024-02-07.tar.gz")))
+ (add-after
+ 'unpack-vcpkg-tool
+ 'patch-vcpkg-tool
+ (lambda* _
+ (invoke "chmod" "+w" "downloads/2024-02-07.tar.gz")
+ (invoke "gunzip" "downloads/2024-02-07.tar.gz")
+ (invoke
+ "tar" "-xf" "downloads/2024-02-07.tar" "-C" "downloads"
+ "vcpkg-tool-2024-02-07/cmake/Findfmt.cmake"
+ "vcpkg-tool-2024-02-07/cmake/FindCMakeRC.cmake")
+ (invoke
+ "tar" "--delete" "-f" "downloads/2024-02-07.tar"
+ "vcpkg-tool-2024-02-07/cmake/Findfmt.cmake"
+ "vcpkg-tool-2024-02-07/cmake/FindCMakeRC.cmake")
+ (substitute*
+ "downloads/vcpkg-tool-2024-02-07/cmake/Findfmt.cmake"
+ (("the fmt library\" OFF")
+ "the fmt library\" ON"))
+ (substitute*
+ "downloads/vcpkg-tool-2024-02-07/cmake/FindCMakeRC.cmake"
+ (("resource compiler\" OFF")
+ "resource compiler\" ON"))
+ (invoke
+ "tar" "-rf" "downloads/2024-02-07.tar"
+ "downloads/vcpkg-tool-2024-02-07/cmake/Findfmt.cmake"
+ "downloads/vcpkg-tool-2024-02-07/cmake/FindCMakeRC.cmake")
+ (invoke "gzip" "downloads/2024-02-07.tar")))
+ (add-after
+ 'patch-generated-file-shebangs
+ 'bootstrap-vcpkg
+ (lambda* _
+ (substitute*
+ "scripts/bootstrap.sh"
+ (("vcpkgDownloadTool=\"ON\"")
+ "vcpkgDownloadTool=\"OFF\"")
+ (("\\$actualHash")
+ "$expectedHash"))
+ (invoke "./bootstrap-vcpkg.sh" "--disableMetrics")))
+ (delete 'configure)
+ (delete 'build)
+ (delete 'check))))
+ (native-inputs
+ (list cmake curl ninja unzip vcpkg-tool-cmrc vcpkg-tool-fmt zip))
+ (synopsis "C++ Library Manager for Windows, Linux, and MacOS")
+ (description
+ (string-append
+ "Vcpkg helps you manage C and C++ libraries on Windows, Linux "
+ "and MacOS. This tool and ecosystem are constantly evolving, "
+ "and we always appreciate contributions!"))
+ (license license:expat)
+ (home-page "https://vcpkg.io"))))