[bug#67755,v5,9/9] gnu: Add imhex.

Message ID bb3e92e932c691ab0be00f28cd61611fcf1edff3.1741720525.git.sergio.pastorperez@gmail.com
State New
Headers
Series [bug#67755,v5,1/9] gnu: Add edlib. |

Commit Message

Sergio Pastor Pérez March 11, 2025, 7:15 p.m. UTC
  From: Sergio Pastor Pérez <sergio.pastorperez@outlook.es>

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

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

Comments

Divya Ranjan March 13, 2025, 3:40 a.m. UTC | #1
Hello Sergio, thank you for tenaciously working on this series and revising it. v5 seems to build fine, and =guix lint= doesn’t complain either. I do see that for each package =guix style= tries to reindent the package definitions. But since this series has already been long enough, what I recommend is that the committers do a round of =guix style= before applying each patch. I’ll CC members of the electronics-team.

Reviewed-by: Divya Ranjan Pattanaik <divya@subvertising.org>
(for the whole series)
  
Sergio Pastor Pérez March 13, 2025, 3:34 p.m. UTC | #2
Hello, Divyá.

Divya Ranjan <divya@subvertising.org> writes:
> [...] I do see that for each package =guix style= tries to reindent the package definitions. [...]

I'm aware of those, I decided not to follow the `guix style' for some of them because
it hindered readability. The commiter can decide if it is appropriate to
style all the packages but I think they will prefer to leve them as they
are, anyways `guix style' is not applied on every definition in Guix.


Thanks for the review!
  

Patch

diff --git a/gnu/packages/hexedit.scm b/gnu/packages/hexedit.scm
index 2eab13e239..e9b9698c22 100644
--- a/gnu/packages/hexedit.scm
+++ b/gnu/packages/hexedit.scm
@@ -28,11 +28,25 @@  (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 antivirus)
+  #: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 gexp)
@@ -209,6 +223,161 @@  (define-public imhex-pattern-language
     (description "The Pattern Language used by the ImHex Hex Editor.")
     (license license:lgpl2.1)))
 
+(define-public imhex
+  ;; NOTE: imhex-patterns does not support using `imhex-pattern-language'
+  ;; system package. Until it does, there is no point in making it a package.
+  (let ((version "1.37.4"))
+    (define-public imhex-patterns
+      (let ((name "imhex-patterns"))
+        (origin
+          (method git-fetch)
+          (uri (git-reference
+                (url "https://github.com/WerWolv/ImHex-Patterns")
+                (commit (string-append "ImHex-v" version))))
+          (file-name (git-file-name name version))
+          (sha256
+           (base32
+            "0m9g93fzmj2rsgaq25y4mmfigjh1xxyh41zjs6lp5ydsl5hhrn6q")))))
+    (package
+      (name "imhex")
+      (version version)
+      (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 "0l3fpizkz2ykdirbn9alddnnsg75w6kwpp92nvmird13l80z1sdr"))
+         (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 xdgpp) . "xdgpp")
+                   (#$(file-append miniaudio "/include/miniaudio.h")
+                    . "miniaudio/include/miniaudio.h"))))
+
+              ;; Drop `imhex-patters' in the source tree.
+              (copy-recursively #$imhex-patterns "ImHex-Patterns")))))
+      (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_ENABLE_UNIT_TESTS=ON"
+           "-DIMHEX_OFFLINE_BUILD=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_LUNASVG=ON"
+           "-DUSE_SYSTEM_CLI11=ON"
+           "-DUSE_SYSTEM_BOOST=ON"
+           "-DUSE_SYSTEM_EDLIB=ON"
+           "-DUSE_SYSTEM_YARA=ON"
+           "-DUSE_SYSTEM_LLVM=ON"
+           "-DUSE_SYSTEM_FMT=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")
+        #: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"))))
+            (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 yara
+             boost
+             capstone
+             curl
+             edlib
+             fmt
+             glfw
+             libarchive
+             libffi
+             llvm-17
+             lunasvg
+             plutovg
+             mbedtls
+             mesa
+             nativefiledialog-extended
+             xz
+             fontconfig
+             lz4
+             `(,zstd "lib")
+             zlib
+             freetype))
+      (home-page "https://imhex.werwolv.net")
+      (synopsis "Hex Editor to display, decode and analyze binary data")
+      (description "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")