~ruther/guix-local

5494343bfc80521339ca69199e48124f1fd313ca — Hilton Chain 1 year, 2 months ago 878bdd7
build-system: cargo: Support installing Cargo workspace.

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

Change-Id: I74ed1972a5716da05afeac8edb2b0e4b6834bf40
3 files changed, 21 insertions(+), 5 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 +4 -1
@@ 9582,7 9582,10 @@ This build system supports cargo workspaces.  Parameter
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"}.
@code{"pcre2-sys"} first and then @code{"pcre2"}.  Parameter
@code{#:cargo-install-paths} (default: @code{''()}) allows specifying paths of
binary crates to install in the @code{install} phase, @code{''("crates/atuin")},
for example.
@end defvar

@defvar chicken-build-system

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


@@ 129,6 130,7 @@ to NAME and VERSION."
                       #: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-install-paths #$(sexp->gexp cargo-install-paths)
                       #:cargo-target #$(cargo-triplet system)
                       #:features #$(sexp->gexp features)
                       #:skip-build? #$skip-build?


@@ 162,6 164,7 @@ to NAME and VERSION."
                            (cargo-test-flags ''())
                            (cargo-package-crates ''())
                            (cargo-package-flags ''("--no-metadata" "--no-verify"))
                            (cargo-install-paths ''())
                            (cargo-target (cargo-triplet (or target system)))
                            (features ''())
                            (skip-build? #f)


@@ 194,6 197,7 @@ to NAME and VERSION."
                       #: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-install-paths #$(sexp->gexp cargo-install-paths)
                       #:cargo-target #$(cargo-triplet (or target system))
                       #:features #$(sexp->gexp features)
                       #:skip-build? #$skip-build?

M guix/build/cargo-build-system.scm => guix/build/cargo-build-system.scm +13 -4
@@ 379,6 379,7 @@ directory = '" vendor-dir "'") port)
                  skip-build?
                  install-source?
                  features
                  (cargo-install-paths '())
                  #:allow-other-keys)
  "Install a given Cargo package."
  (let* ((out      (assoc-ref outputs "out"))


@@ 393,10 394,18 @@ directory = '" vendor-dir "'") port)
    ;; Only install crates which include binary targets,
    ;; otherwise cargo will raise an error.
    (or skip-build?
        (not (has-executable-target?))
        (invoke "cargo" "install" "--offline" "--no-track"
                "--path" "." "--root" out
                "--features" (string-join features)))
        ;; NOTE: Cargo workspace installation support:
        ;; #:skip-build? #f + #:cargo-install-paths.
        (and (null? cargo-install-paths)
             (not (has-executable-target?)))
        (for-each
         (lambda (path)
           (invoke "cargo" "install" "--offline" "--no-track"
                   "--path" path "--root" out
                   "--features" (string-join features)))
         (if (null? cargo-install-paths)
             '(".")
             cargo-install-paths)))

    (when install-source?
      ;; Install crate tarballs and unpacked sources for later use.