>From 4e7ce2bb7f21f0b423407a298868b7561390053f Mon Sep 17 00:00:00 2001 From: nixo Date: Tue, 19 Jan 2021 11:23:10 +0100 Subject: [PATCH 04/10] gnu: Add julia-jllwrappers. * gnu/packages/julia-xyz.scm (julia-jllwrappers): New variable. * doc/guix.texi (julia-build-system): Document how to use jllwrappers to use to guix binary packages. --- doc/guix.texi | 28 +++++++++++++++++++++---- gnu/packages/julia-xyz.scm | 43 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 4 deletions(-) diff --git a/doc/guix.texi b/doc/guix.texi index bb777707f0..eea1a1e0c9 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -7622,10 +7622,30 @@ The Julia package name is read from the file @file{Project.toml}. This value can be overridden by passing the argument @code{#:julia-package-name} (which must be correctly capitalized). -For packages requiring shared library dependencies, you may need to write the -@file{/deps/deps.jl} file manually. It's usually a line of @code{const -variable = /gnu/store/library.so} for each dependency, plus a void function -@code{check_deps() = nothing}. +Julia packages usually manage they binary dependencies via +@code{JLLWrappers.jl}, a Julia package that creates a module (named +after the wrapped library followed by @code{_jll.jl}. + +To add the binary path @code{_jll.jl} packages, you need to patch the +files under @file{src/wrappers/}, replacing the call to the macro +@code{JLLWrappers.@@generate_wrapper_header}, adding as a secound +argument containing the store path the binary. + +The package @code{MbetTLS} can be taken as an example: +@lisp +(add-after 'unpack 'override-binary-path + (lambda* (#:key inputs #:allow-other-keys) + (map + (lambda (wrapper) + (substitute* wrapper + (("generate_wrapper_header.*") + (string-append + "generate_wrapper_header(\"MbedTLS\", \"" + (assoc-ref inputs "mbedtls-apache") "\")\n")))) + ;; There's a Julia file for each platform, override them all + (find-files "src/wrappers/" "\\.jl$")) + #t)) +@end lisp Some older packages that aren't using @file{Package.toml} yet, will require this file to be created, too. The function @code{julia-create-package-toml} diff --git a/gnu/packages/julia-xyz.scm b/gnu/packages/julia-xyz.scm index 09043c593b..b89733c412 100644 --- a/gnu/packages/julia-xyz.scm +++ b/gnu/packages/julia-xyz.scm @@ -147,6 +147,49 @@ scaled by a constant factor. Consequently, they have a fixed number of digits (bits) after the decimal (radix) point.") (license license:expat))) +(define-public julia-jllwrappers + (package + (name "julia-jllwrappers") + (version "1.2.0") + (source + (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/JuliaPackaging/JLLWrappers.jl") + (commit (string-append "v" version)))) + (file-name (git-file-name name version)) + (sha256 + (base32 "1sj3mi2dcc13apqfpy401wic5n0pgbck1p98b2g3zw0mln9s83m4")))) + (arguments + ;; Wants to download stuff + '(#:tests? #f + #:phases + (modify-phases %standard-phases + (add-after 'unpack 'custom-override-path + (lambda* (#:key inputs #:allow-other-keys) + ;; Make @generate_wrapper_header take an optional argument that + ;; guix packagers can pass to override the default "override" + ;; binary path. This won't be needed when something like + ;; https://github.com/JuliaPackaging/JLLWrappers.jl/pull/27 + ;; will be merged. + (substitute* "src/wrapper_generators.jl" + (("generate_wrapper_header.*") + "generate_wrapper_header(src_name, override_path = nothing)\n") + (("pkg_dir = .*" all) + (string-append + all "\n" "override = something(override_path," + "joinpath(dirname(pkg_dir), \"override\"))\n")) + (("@static if isdir.*") "@static if isdir($override)\n") + (("return joinpath.*") "return $override\n")) + #t))))) + (build-system julia-build-system) + (home-page "https://github.com/JuliaPackaging/JLLWrappers.jl") + (synopsis "Julia macros used by JLL packages") + (description "This package contains Julia macros that enable JLL packages +to generate themselves. It is not intended to be used by users, but rather is +used in autogenerated packages via @code{BinaryBuilder.jl}.") + (license license:expat))) + (define-public julia-json (package (name "julia-json") -- 2.30.0