Subject: [bug#67755] [PATCH v4 8/8] gnu: Add imhex.

From: Sergio Pastor Pérez <[email-masked]>
Date: Tue, 27 Aug 2024 00:01:10 +0200

* gnu/packages/hexedit.scm (imhex): New variable.

Change-Id: I114d3a6c0dae32ea434a77a6bd88b8ff6870b70c
---
 gnu/packages/hexedit.scm | 151 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 151 insertions(+)

diff --git a/gnu/packages/hexedit.scm b/gnu/packages/hexedit.scm
index e5f58fcce0..0eb551b54e 100644
--- a/gnu/packages/hexedit.scm
+++ b/gnu/packages/hexedit.scm
@@ -27,11 +27,24 @@ (define-module (gnu packages hexedit)
   #:use-module (gnu packages)
   #:use-module (gnu packages autotools)
   #:use-module (gnu packages compression)
+  #:use-module (gnu packages gl)
   #:use-module (gnu packages man)
   #:use-module (gnu packages cpp)
   #:use-module (gnu packages gcc)
+  #:use-module (gnu packages tls)
+  #:use-module (gnu packages curl)
+  #:use-module (gnu packages llvm)
+  #:use-module (gnu packages ruby)
+  #:use-module (gnu packages glib)
+  #:use-module (gnu packages boost)
+  #:use-module (gnu packages backup)
   #:use-module (gnu packages python)
+  #:use-module (gnu packages libffi)
   #:use-module (gnu packages ncurses)
+  #:use-module (gnu packages fontutils)
+  #:use-module (gnu packages pkg-config)
+  #:use-module (gnu packages engineering)
+  #:use-module (gnu packages pretty-print)
   #:use-module (guix download)
   #:use-module (guix git-download)
   #:use-module (guix build-system gnu)
@@ -166,6 +179,144 @@ (define-public imhex-pattern-language
     (description "The Pattern Language used by the ImHex Hex Editor.")
     (license license:lgpl2.1)))
 
+(define-public imhex
+  (package
+    (name "imhex")
+    (version "1.35.4")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/WerWolv/ImHex")
+             (commit (string-append "v" version))
+             (recursive? #t)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "0gi5772w0fzgr1w403ckq2mkwiyvcxv08frs2fjr2hlc8hb6c2p9"))
+       (snippet
+        #~(begin
+            (use-modules (guix build utils))
+            (define (delete-files-from-list-recursively . args)
+              (for-each (lambda (path)
+                          (delete-file-recursively path))
+                        args))
+
+            (define (replace-files-from-list-recursively lst)
+              (for-each
+               (lambda (elt)
+                 (delete-file-recursively (cdr elt))
+                 (copy-recursively (car elt) (cdr elt)))
+               lst))
+
+            ;; NOTE: `libwolf' does not have an install target. Until the
+            ;; maintainers create one, it will remain bundled.
+            ;; NOTE: `libromfs' it's meant to be bundled and cannot be compiled
+            ;; independently. Until the maintainers support building it
+            ;; independently, it will remain bundled.
+            ;; NOTE: `imhex-pattern-language' it's meant to be bundled and
+            ;; cannot be linked independently. Until the maintainers support
+            ;; linking it independently, it's source will be replaced in-tree.
+            (replace-files-from-list-recursively
+             `((#$(package-source imhex-pattern-language)
+                . "lib/external/pattern_language")))
+            ;; NOTE: `hashlibplus' has been left as a submodule since it's a fork
+            ;; which only makes sense within ImHex.
+            (with-directory-excursion "lib/third_party"
+              (delete-files-from-list-recursively
+               "nlohmann_json" "capstone" "llvm-demangle" "fmt" "nativefiledialog"
+               ;; NOTE: for versions above c++20 it is not required.
+               "jthread/jthread")
+              (replace-files-from-list-recursively
+               `((#$(package-source lunasvg) . "lunasvg")
+                 (#$(package-source xdgpp) . "xdgpp")
+                 (#$(file-append miniaudio "/include/miniaudio.h")
+                    . "miniaudio/include/miniaudio.h"))))))))
+    (build-system cmake-build-system)
+    (arguments
+     (list
+      ;; NOTE: there is an issue with the way the test library is linked with
+      ;; the output binaries. Tests are intrusive and should not be shipped
+      ;; with the release, when the issue is fixed we could add a phase which
+      ;; builds the package with the tests and runs the testsuite and a second
+      ;; build phase which prepares the output binary.
+      #:configure-flags
+      ''("-DIMHEX_OFFLINE_BUILD=ON"
+         "-DIMHEX_ENABLE_UNIT_TESTS=ON"
+         ;; NOTE: required for the `validate-runpath' phase.
+         ;; If OFF, the pluggings won't be able to find `libimhex.so'.
+         "-DIMHEX_PLUGIN_ADD_INSTALL_PREFIX_TO_RPATH=ON"
+
+         "-DUSE_SYSTEM_NLOHMANN_JSON=ON"
+         "-DUSE_SYSTEM_CAPSTONE=ON"
+         "-DUSE_SYSTEM_CLI11=ON"
+         "-DUSE_SYSTEM_LLVM=ON"
+         "-DUSE_SYSTEM_FMT=ON"
+
+         "-DUSE_SYSTEM_BOOST=ON"
+         "-DUSE_SYSTEM_EDLIB=ON"
+         "-DUSE_SYSTEM_NFD=ON"
+
+         ;; NOTE: the build system doesn't correctly support
+         ;; locating these system libraries. Until fixed
+         ;; upstream, drop the sources where they are
+         ;; expected, this is done in the `<origin>' snippet.
+         "-DUSE_SYSTEM_MINIAUDIO=OFF"
+         "-DUSE_SYSTEM_LUNASVG=OFF"
+
+         ;; TODO: package them.
+         "-DUSE_SYSTEM_YARA=OFF")
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'unpack 'fix-paths
+            (lambda _
+              (substitute* "main/gui/source/window/linux_window.cpp"
+                (("dbus-send")
+                 #$(file-append dbus "/bin/dbus-send")))
+              (substitute* "cmake/build_helpers.cmake"
+                (("boost REQUIRED")
+                 "Boost COMPONENTS regex REQUIRED")
+                (("boost::regex")
+                 "Boost::regex"))
+              (substitute* "lib/libimhex/CMakeLists.txt"
+                (("boost")
+                 "Boost"))))
+          (add-before 'check 'build-tests
+            (lambda _
+              (invoke "make" "unit_tests"))))))
+    (native-inputs
+     (list cli11
+           nlohmann-json
+           pkg-config
+           python
+           python-wrapper
+           ruby
+           gcc-14))
+    (inputs
+     (list boost
+           capstone
+           curl
+           edlib
+           fmt
+           glfw
+           libarchive
+           libffi
+           llvm-17
+           mbedtls
+           mesa
+           nativefiledialog-extended
+           xz
+           zlib
+           freetype))
+    (home-page "https://imhex.werwolv.net")
+    (synopsis "Hex Editor to display, decode and analyze binary data")
+    (description "@command{imhex} is a hex editor with many advanced features
+that can often only be found in paid applications.  Such features are a
+completely custom binary template and pattern language to decode and highlight
+structures in the data, a graphical node-based data processor to pre-process
+values before they're displayed, a disassembler, diffing support, bookmarks
+and much much more.")
+    (license license:gpl2)))
+
 (define-public bvi
   (package
     (name "bvi")
-- 
2.45.2