On Thu, 27 Feb 2025 22:26:59 +0800,
Hilton Chain wrote:
>
> Cargo workspace support!
>
> https://git.boiledscript.com/hako/guix/commits/branch/cargo

I have continued to experiment on this branch (now based on rust-team), with
following changes:

- Removed git checkout support for the importer, instead a warning of missing
  dependency is printed.

  These dependencies are really rare.  They are likely to be Cargo workspaces
  and should be packaged separately.

  Since these dependencies will be packaged, directory support for the build
  system is removed too.

- For crates with a "src" "sys" suffix, importer adds TODO comments to their
  definitions.

- Phase 'check-for-pregenerated-files moved after 'configure, since most
  dependencies are origins and unpacked in configure phase.

  Additionally the following command is invoked to print out all non-empty
  binary files under current directory:
  --8<---------------cut here---------------start------------->8---
  find . -type f ! -size 0 -exec grep -IL . {} ;
  --8<---------------cut here---------------end--------------->8---
  This command is pretty helpful, but doesn't perform well :(
  Quite a few seconds are added to the build time.

Now I think to move forward on this path we can replace all existing rust
packages to following definitions:

1. sources

  Origin definitions in (gnu packages rust-crates), addition and deletion are
  managed by importer and cleanup script.

  + crates published on crates.io that can be unbundled without extra dependency

2. source packages

  Packaged in (gnu packages crates-*) with #:skip-build? set to #t.

  + git repository (single crate)

  + git repository (workspace)

    When not all workspace members are packaged, or there's dependency among
    workspace members, #:cargo-package-crates (default: ‘''()’) should be set.

    Crates specefied in #:cargo-package-crates will be packaged in order.  For
    example rust-pipewire has such dependency among its workspace members:

    --8<---------------cut here---------------start------------->8---
                  - pipewire-sys <-
                 /                 \
    libspa-sys <- libspa <----- pipewire
                 \                 /
                  ----------------
    --8<---------------cut here---------------end--------------->8---

    As a result, #:cargo-package-crates for rust-pipewire should be set to
    ''("libspa-sys" "libspa" "pipewire-sys" "pipewire")

  + published on crates.io but require extra dependency to unbundle

    These crates will also have definitions imported to (gnu packages
    rust-crates).  These definitions should be replaced by symbol placeholders
    with references commented out.  For example:

    --8<---------------cut here---------------start------------->8---
    (define rust-ring-0.17.11 'crates-crypto-rust-ring-0.17)
    ...
    (define-public cargo-audit-cargo-inputs
      (list ...
            ;; rust-ring-0.17.11
            ...))
    --8<---------------cut here---------------end--------------->8---

    --8<---------------cut here---------------start------------->8---
    (define rust-openssl-src-300.4.2+3.4.1 'do-not-package-rust-openssl-src)
    ...
    (define-public rust-cargo-c-cargo-inputs
      (list ...
            ;; rust-openssl-src-300.4.2+3.4.1
            ...))
    --8<---------------cut here---------------end--------------->8---

    The comment is used to preserve reference for cleanup script (currently
    implemented in ‘grep -wc’).

    By preserving these definitons with placeholders, we can avoid checking
    known packages and help other packagers (the symbol placeholder appears in
    error message when the definition is used as input).

3. regular packages

  Packaged anywhere, install executables.

  #:install-source? may be set to #f.

  + workspace support

    When #:install-source? is #t (default value), 'package phase will be
    executed and #:cargo-package-crates will be honored.

    #:cargo-install-paths (default value ‘''(".")’) selects paths of workspace
    members to be installed.  For example atuin source contains following
    members (in path):

    --8<---------------cut here---------------start------------->8---
    crates/atuin
    crates/atuin-client
    crates/atuin-common
    crates/atuin-daemon
    crates/atuin-dotfiles
    ...
    --8<---------------cut here---------------end--------------->8---

    What we wan't is the "atuin" one, so we'll set #:cargo-install-paths to
    ''("crates/atuin")

    This argument uses path instead of crate name because ‘cargo install 
<crate>’
    requires <crate> to be packaged first, which is not the case when
    #:install-source? is set to #f.

Reply via email to