~ruther/guix-local

878bdd7fb62cf2879667bb2de06c11db1166f26e — Hilton Chain 1 year, 2 months ago 5d294e2
build-system: cargo: Support packaging Cargo workspace.

* guix/build-system/cargo.scm (cargo-build, cargo-cross-build)
[#:cargo-package-crates]: New argument.
* guix/build/cargo-build-system.scm (package): Use it.
* doc/guix.texi (Build Systems)[cargo-build-system]: Document it.

Change-Id: I45ccd95e90827d47127015cb0bda2d41f792335b
3 files changed, 30 insertions(+), 2 deletions(-)

M doc/guix.texi
M guix/build-system/cargo.scm
M guix/build/cargo-build-system.scm
M doc/guix.texi => doc/guix.texi +7 -0
@@ 9576,6 9576,13 @@ to create a source crate for future use.  The @code{install} phase installs
the binaries defined by the crate.  Unless @code{install-source? #f} is
defined it will also install a source crate repository of itself and unpacked
sources, to ease in future hacking on rust packages.

This build system supports cargo workspaces.  Parameter
@code{#:cargo-package-crates} (default: @code{''()}) allows specifying names of
library crates to package in the @code{package} phase.  Specified crates are
packaged from left to right, in case there's dependency among them.  For
example, specifying @code{''("pcre2-sys" "pcre2")} will package
@code{"pcre2-sys"} first and then @code{"pcre2"}.
@end defvar

@defvar chicken-build-system

M guix/build-system/cargo.scm => guix/build-system/cargo.scm +4 -0
@@ 98,6 98,7 @@ to NAME and VERSION."
                      (vendor-dir "guix-vendor")
                      (cargo-build-flags ''("--release"))
                      (cargo-test-flags ''())
                      (cargo-package-crates ''())
                      (cargo-package-flags ''("--no-metadata" "--no-verify"))
                      (features ''())
                      (skip-build? #f)


@@ 126,6 127,7 @@ to NAME and VERSION."
                       #:vendor-dir #$vendor-dir
                       #:cargo-build-flags #$(sexp->gexp cargo-build-flags)
                       #:cargo-test-flags #$(sexp->gexp cargo-test-flags)
                       #:cargo-package-crates #$(sexp->gexp cargo-package-crates)
                       #:cargo-package-flags #$(sexp->gexp cargo-package-flags)
                       #:cargo-target #$(cargo-triplet system)
                       #:features #$(sexp->gexp features)


@@ 158,6 160,7 @@ to NAME and VERSION."
                            (vendor-dir "guix-vendor")
                            (cargo-build-flags ''("--release"))
                            (cargo-test-flags ''())
                            (cargo-package-crates ''())
                            (cargo-package-flags ''("--no-metadata" "--no-verify"))
                            (cargo-target (cargo-triplet (or target system)))
                            (features ''())


@@ 189,6 192,7 @@ to NAME and VERSION."
                       #:vendor-dir #$vendor-dir
                       #:cargo-build-flags #$(sexp->gexp cargo-build-flags)
                       #:cargo-test-flags #$(sexp->gexp cargo-test-flags)
                       #:cargo-package-crates #$(sexp->gexp cargo-package-crates)
                       #:cargo-package-flags #$(sexp->gexp cargo-package-flags)
                       #:cargo-target #$(cargo-triplet (or target system))
                       #:features #$(sexp->gexp features)

M guix/build/cargo-build-system.scm => guix/build/cargo-build-system.scm +19 -2
@@ 302,11 302,16 @@ directory = '" vendor-dir "'") port)
                  source
                  skip-build?
                  install-source?
                  (cargo-package-crates '())
                  (cargo-package-flags '("--no-metadata" "--no-verify"))
                  (vendor-dir "guix-vendor")
                  #:allow-other-keys)
  "Run 'cargo-package' for a given Cargo package."
  (if install-source?
    (if skip-build?
    ;; NOTE: Cargo workspace packaging support:
    ;; #:install-source? #t + #:cargo-package-crates.
    (if (and (null? cargo-package-crates)
             skip-build?)
      (begin
        (install-file source "target/package")
        (with-directory-excursion "target/package"


@@ 324,7 329,19 @@ directory = '" vendor-dir "'") port)
        ;;error: invalid inclusion of reserved file name Cargo.toml.orig in package source
        (when (file-exists? "Cargo.toml.orig")
          (delete-file "Cargo.toml.orig"))
        (apply invoke `("cargo" "package" "--offline" ,@cargo-package-flags))

        (if (null? cargo-package-crates)
            (apply invoke `("cargo" "package" "--offline" ,@cargo-package-flags))
            (for-each
             (lambda (pkg)
               (apply invoke "cargo" "package" "--offline" "--package" pkg
                      cargo-package-flags)
               (for-each
                (lambda (crate)
                  (invoke "tar" "xzf" crate "-C" vendor-dir))
                (find-files "target/package" "\\.crate$"))
               (patch-cargo-checksums #:vendor-dir vendor-dir))
             cargo-package-crates))

        ;; Then unpack the crate, reset the timestamp of all contained files, and
        ;; repack them.  This is necessary to ensure that they are reproducible.