@@ -31,12 +31,17 @@ (define-module (gnu packages antivirus)
#:use-module (gnu packages)
#:use-module (gnu packages check)
#:use-module (gnu packages compression)
+ #:use-module (gnu packages cmake)
+ #:use-module (gnu packages crates-crypto)
+ #:use-module (gnu packages crates-graphics)
+ #:use-module (gnu packages crates-io)
#:use-module (gnu packages curl)
#:use-module (gnu packages ncurses)
#:use-module (gnu packages pcre)
#:use-module (gnu packages pkg-config)
#:use-module (gnu packages python)
#:use-module (gnu packages python-check)
+ #:use-module (gnu packages rust-apps)
#:use-module (gnu packages rust)
#:use-module (gnu packages tls)
#:use-module (gnu packages web)
@@ -62,49 +67,107 @@ (define-public clamav
(snippet
'(begin
(delete-file "Cargo.lock")
- (for-each
- delete-file
- (find-files ".cargo/vendor" ".cargo-checksum\\.json"))
(for-each delete-file-recursively
- '("win32" ; unnecessary
+ '(".cargo" ; vendored rust inputs
+ "win32" ; unnecessary
"libclamunrar")))))) ; non-free license
- (build-system cmake-build-system)
+ (build-system cargo-build-system)
(arguments
- (list
- #:configure-flags
- #~(list "-DENABLE_MILTER=OFF" "-DENABLE_UNRAR=OFF")
- #:imported-modules `((guix build cargo-utils)
- ,@%cmake-build-system-modules)
- #:phases
- #~(modify-phases %standard-phases
- (add-after 'unpack 'inject-rust-onenote
- (lambda _
- (substitute* "libclamav_rust/Cargo.toml"
- (("onenote_parser = .*")
- "onenote_parser = \"0.3.1\"\n"))))
- (add-after 'patch-source-shebangs 'patch-cargo-checksums
- (lambda _
- (use-modules
- (srfi srfi-1) (ice-9 ftw) (guix build cargo-utils))
- (with-directory-excursion ".cargo/vendor"
- (for-each generate-all-checksums
- (delete "." (delete ".." (scandir ".")))))))
- (add-after 'unpack 'skip-clamd-tests
- ;; XXX: The check?_clamd tests fail inside the build
- ;; chroot, but pass outside.
- (lambda* (#:key tests? #:allow-other-keys)
- (when tests?
- (substitute* "unit_tests/CMakeLists.txt"
- (("clamd_test\\.py" test)
- (string-append
- test " -k \"not test_clamd_08_VirusEvent\"")))))))))
+ (let ((cargo-inputs
+ `(("rust-flate2" ,rust-flate2-1)
+ ("rust-hex" ,rust-hex-0.4)
+ ("rust-libc" ,rust-libc-0.2)
+ ("rust-log" ,rust-log-0.4)
+ ("rust-sha2" ,rust-sha2-0.10)
+ ("rust-tempfile" ,rust-tempfile-3)
+ ("rust-thiserror" ,rust-thiserror-1)
+ ("rust-image" ,rust-image-0.24)
+ ("rust-rustdct" ,rust-rustdct-0.7)
+ ("rust-transpose" ,rust-transpose-0.2)
+ ("rust-num-traits" ,rust-num-traits-0.2)
+ ("rust-base64" ,rust-base64-0.21)
+ ("rust-sha1" ,rust-sha1-0.10)
+ ("rust-unicode-segmentation" ,rust-unicode-segmentation-1)
+ ("rust-bindgen" ,rust-bindgen-0.66)
+ ("rust-onenote-parser" ,rust-onenote-parser-for-clamav)
+ ("rust-hex-literal" ,rust-hex-literal-0.4)
+ ("rust-inflate" ,rust-inflate-0.4)
+ ("rust-bzip2-rs" ,rust-bzip2-rs-0.1)
+ ("rust-byteorder" ,rust-byteorder-1)
+ ("rust-delharc" ,rust-delharc-0.6)))
+ (cargo-development-inputs
+ `(("rust-cbindgen" ,rust-cbindgen-0.26)
+ ("rust-bindgen" ,rust-bindgen-0.66))))
+ (list
+ #:cargo-inputs cargo-inputs
+ #:cargo-development-inputs cargo-development-inputs
+ #:vendor-dir ".cargo/vendor"
+ #:imported-modules `(,@%cmake-build-system-modules
+ ,@%cargo-build-system-modules)
+ #:modules '((guix build cargo-build-system)
+ ((guix build cmake-build-system) #:prefix cmake:)
+ (guix build utils))
+ #:phases
+ #~(modify-phases %standard-phases
+ ;; There is a .exe file used in unit tests.
+ (delete 'check-for-pregenerated-files)
+ (add-after 'configure 'fix-cargo-inputs-vendoring
+ (lambda _
+ ;; Reproduce the original layout, fails with config.
+ (rename-file ".cargo/config" ".cargo/config.toml")
+ ;; Wrongly placed by configure
+ (delete-file-recursively
+ (string-append ".cargo/vendor/clamav-" #$version ".tar.zst"))))
+ (add-after 'patch-cargo-checksums 'cmake-configure
+ (lambda* (#:key outputs #:allow-other-keys)
+ ((assoc-ref cmake:%standard-phases 'configure)
+ #:configure-flags
+ (list "-DENABLE_MILTER=OFF" "-DENABLE_UNRAR=OFF")
+ #:outputs outputs)))
+ (replace 'build
+ (assoc-ref cmake:%standard-phases 'build))
+ (add-after 'patch-cargo-checksums 'patch-rust-requirements
+ (lambda _
+ (substitute* "libclamav_rust/Cargo.toml"
+ (("onenote_parser = .*")
+ (format #f "onenote_parser = ~s~%"
+ #$(package-version
+ (car (assoc-ref cargo-inputs
+ "rust-onenote-parser")))))
+ (("^bindgen = .*")
+ (format #f "bindgen = ~s~%"
+ #$(package-version
+ (car (assoc-ref cargo-inputs
+ "rust-bindgen")))))
+ (("cbindgen = \\{ version =\".*\",")
+ (format #f "cbindgen = { version =~s,"
+ #$(package-version
+ (car (assoc-ref cargo-development-inputs
+ "rust-cbindgen"))))))))
+ (delete 'package)
+ (replace 'install
+ (assoc-ref cmake:%standard-phases 'install))
+ (replace 'check
+ (lambda* (#:key tests? #:allow-other-keys)
+ ((assoc-ref cmake:%standard-phases 'check)
+ #:tests? tests?
+ #:parallel-tests? #t
+ #:test-target "test")))
+ (add-after 'unpack 'skip-clamd-tests
+ ;; XXX: The check?_clamd tests fail inside the build
+ ;; chroot, but pass outside.
+ (lambda* (#:key tests? #:allow-other-keys)
+ (when tests?
+ (substitute* "unit_tests/CMakeLists.txt"
+ (("clamd_test\\.py" test)
+ (string-append
+ test " -k \"not test_clamd_08_VirusEvent\""))))))))))
(native-inputs
(list check ; for tests
+ cmake-minimal
pkg-config
python-minimal
- python-pytest
- rust
- (list rust "cargo")))
+ python-pytest))
(inputs
(list bzip2
curl