all messages for Guix-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* [bug#51845] [PATCH 0/2] Add librsvg-bootstrap
@ 2021-11-14 14:07 Efraim Flashner
  2021-11-14 14:14 ` [bug#51845] [PATCH 1/2] gnu: " Efraim Flashner
                   ` (3 more replies)
  0 siblings, 4 replies; 13+ messages in thread
From: Efraim Flashner @ 2021-11-14 14:07 UTC (permalink / raw)
  To: 51845; +Cc: Efraim Flashner

librsvg is an input for emacs, gtk+@2 and gtk+@3. With the rust inputs
this leads to (unknown) rust libraries causing the rebuild of over 3000
packages on core-updates-frozen. Rather than hunt them down I tracked
down the packages which would have many rebuilds and added a copy of
librsvg for them to use.

Efraim Flashner (2):
  Add librsvg-bootstrap.
  gnu: Use librsvg-bootstrap.

 gnu/packages/emacs.scm |  2 +-
 gnu/packages/gnome.scm | 23 +++++++++++++++++++++++
 gnu/packages/gtk.scm   |  4 ++--
 3 files changed, 26 insertions(+), 3 deletions(-)


base-commit: 75b5ad6aa3b55b2cbd7f333411cbc9e21ab1e186
-- 
2.33.1





^ permalink raw reply	[flat|nested] 13+ messages in thread

* [bug#51845] [PATCH 1/2] gnu: Add librsvg-bootstrap.
  2021-11-14 14:07 [bug#51845] [PATCH 0/2] Add librsvg-bootstrap Efraim Flashner
@ 2021-11-14 14:14 ` Efraim Flashner
  2021-11-14 14:14 ` [bug#51845] [PATCH 2/2] gnu: Use librsvg-bootstrap Efraim Flashner
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 13+ messages in thread
From: Efraim Flashner @ 2021-11-14 14:14 UTC (permalink / raw)
  To: 51845; +Cc: Efraim Flashner

* gnu/packages/gnome.scm (librsvg-bootstrap): New variable.
---
 gnu/packages/gnome.scm | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/gnu/packages/gnome.scm b/gnu/packages/gnome.scm
index 924d1326cc..a0436a4edb 100644
--- a/gnu/packages/gnome.scm
+++ b/gnu/packages/gnome.scm
@@ -3580,6 +3580,29 @@ (define-public librsvg
     (home-page "https://wiki.gnome.org/LibRsvg")
     (license license:lgpl2.1+)))
 
+;; This copy of librsvg uses the bundled rust libraries. It is useful for
+;; packages which have too many dependencies to be rebuilt as frequently
+;; as the rust inputs are updated.
+(define-public librsvg-bootstrap
+  (package
+    (inherit librsvg)
+    (name "librsvg")
+    (version "2.50.7")
+    (source (origin
+              (method url-fetch)
+              (uri (string-append "mirror://gnome/sources/librsvg/"
+                                  (version-major+minor version)  "/"
+                                  "librsvg-" version ".tar.xz"))
+              (sha256
+               (base32
+                "1g3f8byg5w08fx1bka12mmpl59v6a4q2p827w6m2la6mijq63yzz"))))
+    (arguments
+     (substitute-keyword-arguments (package-arguments librsvg)
+       ((#:vendor-dir _ "vendor") "vendor")
+       ((#:cargo-inputs _) '())
+       ((#:cargo-development-inputs _) '())))
+    (properties '((hidden? . #t)))))
+
 (define-public libidl
   (package
     (name "libidl")
-- 
2.33.1





^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [bug#51845] [PATCH 2/2] gnu: Use librsvg-bootstrap.
  2021-11-14 14:07 [bug#51845] [PATCH 0/2] Add librsvg-bootstrap Efraim Flashner
  2021-11-14 14:14 ` [bug#51845] [PATCH 1/2] gnu: " Efraim Flashner
@ 2021-11-14 14:14 ` Efraim Flashner
  2021-11-14 17:27 ` [bug#51845] [PATCH 0/2] Add librsvg-bootstrap Liliana Marie Prikler
  2021-12-06 12:17 ` Ludovic Courtès
  3 siblings, 0 replies; 13+ messages in thread
From: Efraim Flashner @ 2021-11-14 14:14 UTC (permalink / raw)
  To: 51845; +Cc: Efraim Flashner

* gnu/packages/emacs.scm (inputs): Use librsvg-bootstrap.
* gnu/pacakges/gtk.scm (gtk+-2, gtk+)[propagated-inputs]: Same.
---
 gnu/packages/emacs.scm | 2 +-
 gnu/packages/gtk.scm   | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/gnu/packages/emacs.scm b/gnu/packages/emacs.scm
index 734f3dfaa3..3a5215b31a 100644
--- a/gnu/packages/emacs.scm
+++ b/gnu/packages/emacs.scm
@@ -269,7 +269,7 @@ (define* (emacs-byte-compile-directory dir)
        ;; supported well on every architecture yet.
        ,@(if (string-prefix? "x86_64" (or (%current-target-system)
                                           (%current-system)))
-             `(("librsvg" ,librsvg))
+             `(("librsvg" ,librsvg-bootstrap))
              '())
        ("libxpm" ,libxpm)
        ("libxml2" ,libxml2)
diff --git a/gnu/packages/gtk.scm b/gnu/packages/gtk.scm
index 199ca13981..4dfeba4b7f 100644
--- a/gnu/packages/gtk.scm
+++ b/gnu/packages/gtk.scm
@@ -867,7 +867,7 @@ (define-public gtk+-2
        ;; Rust is not supported well on every architecture yet.
        ("gdk-pixbuf" ,(if (string-prefix? "x86_64" (or (%current-target-system)
                                                        (%current-system)))
-                          librsvg
+                          librsvg-bootstrap
                           gdk-pixbuf))
        ("glib" ,glib)
        ("pango" ,pango)))
@@ -969,7 +969,7 @@ (define-public gtk+
        ;; SVG support is optional and requires librsvg, which pulls in rust.
        ;; Rust is not supported well on every architecture yet.
        ("gdk-pixbuf" ,(if (target-x86-64?)
-                          librsvg
+                          librsvg-bootstrap
                           gdk-pixbuf))
        ("glib" ,glib)
        ("libcloudproviders" ,libcloudproviders-minimal)
-- 
2.33.1





^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [bug#51845] [PATCH 0/2] Add librsvg-bootstrap
  2021-11-14 14:07 [bug#51845] [PATCH 0/2] Add librsvg-bootstrap Efraim Flashner
  2021-11-14 14:14 ` [bug#51845] [PATCH 1/2] gnu: " Efraim Flashner
  2021-11-14 14:14 ` [bug#51845] [PATCH 2/2] gnu: Use librsvg-bootstrap Efraim Flashner
@ 2021-11-14 17:27 ` Liliana Marie Prikler
  2021-11-14 18:07   ` Efraim Flashner
  2021-12-06 12:17 ` Ludovic Courtès
  3 siblings, 1 reply; 13+ messages in thread
From: Liliana Marie Prikler @ 2021-11-14 17:27 UTC (permalink / raw)
  To: Efraim Flashner, 51845

Hi,

Am Sonntag, den 14.11.2021, 16:07 +0200 schrieb Efraim Flashner:
> librsvg is an input for emacs, gtk+@2 and gtk+@3. With the rust
> inputs this leads to (unknown) rust libraries causing the rebuild of
> over 3000 packages on core-updates-frozen. Rather than hunt them down
> I tracked down the packages which would have many rebuilds and added
> a copy of librsvg for them to use.
In my opinion, one of the selling points of Guix is that of
bootstrappability.  I don't think adding big blobs to Emacs of all
things is a great way of delivering on that promise.  I think we ought
to rather "invest" in alternatives to Rust and Rust-locked libraries or
make Rust packaging itself sane (if it can at all).

I think librsvg is optional already and people who want to save on
compilation time can decide to replace it with e.g. GNU hello using the
--input option.  In the similar case of mozjs, a replacement with
duktape is discussed on guix-devel, at least for polkit.

As a temporary resolution to the rebuild issue, we could pin the
dependencies of librsvg to some specific versions and only bump them
when something awful happens.  I'm not sure whether librsvg exposes any
of the Rust nastiness to its dependencies, ideally hoping that it would
not.

WDYT?





^ permalink raw reply	[flat|nested] 13+ messages in thread

* [bug#51845] [PATCH 0/2] Add librsvg-bootstrap
  2021-11-14 17:27 ` [bug#51845] [PATCH 0/2] Add librsvg-bootstrap Liliana Marie Prikler
@ 2021-11-14 18:07   ` Efraim Flashner
  2021-11-14 19:05     ` Liliana Marie Prikler
  0 siblings, 1 reply; 13+ messages in thread
From: Efraim Flashner @ 2021-11-14 18:07 UTC (permalink / raw)
  To: Liliana Marie Prikler; +Cc: 51845

[-- Attachment #1: Type: text/plain, Size: 2555 bytes --]

On Sun, Nov 14, 2021 at 06:27:02PM +0100, Liliana Marie Prikler wrote:
> Hi,
> 
> Am Sonntag, den 14.11.2021, 16:07 +0200 schrieb Efraim Flashner:
> > librsvg is an input for emacs, gtk+@2 and gtk+@3. With the rust
> > inputs this leads to (unknown) rust libraries causing the rebuild of
> > over 3000 packages on core-updates-frozen. Rather than hunt them down
> > I tracked down the packages which would have many rebuilds and added
> > a copy of librsvg for them to use.
> In my opinion, one of the selling points of Guix is that of
> bootstrappability.  I don't think adding big blobs to Emacs of all
> things is a great way of delivering on that promise.  I think we ought
> to rather "invest" in alternatives to Rust and Rust-locked libraries or
> make Rust packaging itself sane (if it can at all).
> 
> I think librsvg is optional already and people who want to save on
> compilation time can decide to replace it with e.g. GNU hello using the
> --input option.  In the similar case of mozjs, a replacement with
> duktape is discussed on guix-devel, at least for polkit.

It seems I was wrong about emacs; both emacs-minimal and emacs-no-x are
built without librsvg.

> As a temporary resolution to the rebuild issue, we could pin the
> dependencies of librsvg to some specific versions and only bump them
> when something awful happens.  I'm not sure whether librsvg exposes any
> of the Rust nastiness to its dependencies, ideally hoping that it would
> not.

I don't believe librsvg exposes any rust-y stuff.

> WDYT?

(ins)efraim@3900XT /tmp/librsvg-2.50.7$ ls vendor/ | wc -l
226

There are 226 crates that upstream bundles with their source. I suppose
we could pare it down to about 200 by careful pruning but it's part of
librsvg and not going away.

(ins)efraim@3900XT ~/workspace/guix-core-updates$ git grep \,librsvg | wc -l
103

I'm suggesting that for gtk+@2 and gtk+@3 we use the bundled crates and
for the other 101 packages we continue to use our current version, where
we replace all of the bundled crates with our own copies, which get
updated more often than librsvg does.

With our current rust tooling I don't think it'd be that easy to find
the ~226 crates that librsvg depends on, and it wouldn't be great to
lock them due to librsvg being an input for gtk2/3.

-- 
Efraim Flashner   <efraim@flashner.co.il>   רנשלפ םירפא
GPG key = A28B F40C 3E55 1372 662D  14F7 41AA E7DC CA3D 8351
Confidentiality cannot be guaranteed on emails sent or received unencrypted

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [bug#51845] [PATCH 0/2] Add librsvg-bootstrap
  2021-11-14 18:07   ` Efraim Flashner
@ 2021-11-14 19:05     ` Liliana Marie Prikler
  0 siblings, 0 replies; 13+ messages in thread
From: Liliana Marie Prikler @ 2021-11-14 19:05 UTC (permalink / raw)
  To: Efraim Flashner; +Cc: 51845

Hi,

Am Sonntag, den 14.11.2021, 20:07 +0200 schrieb Efraim Flashner:
> > As a temporary resolution to the rebuild issue, we could pin the
> > dependencies of librsvg to some specific versions and only bump 
> > them something awful happens.  I'm not sure whether librsvg
> > exposes any of the Rust nastiness to its dependencies, ideally
> > hoping that it would not.
> 
> I don't believe librsvg exposes any rust-y stuff.
That sounds like a good start for once.

> > WDYT?
> 
> (ins)efraim@3900XT /tmp/librsvg-2.50.7$ ls vendor/ | wc -l
> 226
> 
> There are 226 crates that upstream bundles with their source. I
> suppose we could pare it down to about 200 by careful pruning but
> it's part of librsvg and not going away.
Well, I'd suggest snippeting them away, but that's a different topic.

> (ins)efraim@3900XT ~/workspace/guix-core-updates$ git grep \,librsvg
> | wc -l
> 103
I'd hazard a guess that most if not all of these 103 packages are
themselves gtk-adjacent, so what really is the issue we're solving
here?  What is the point of maintaining an extra version for 101 of
them when a potentially vulnerable GTK sits right next to them?

> I'm suggesting that for gtk+@2 and gtk+@3 we use the bundled crates
> and for the other 101 packages we continue to use our current
> version, where we replace all of the bundled crates with our own
> copies, which get updated more often than librsvg does.
> 
> With our current rust tooling I don't think it'd be that easy to find
> the ~226 crates that librsvg depends on, and it wouldn't be great to
> lock them due to librsvg being an input for gtk2/3.
Said input exists due to gdk-pixbuf+svg, with the +svg part being
largely optional – the most common failure mode of it not being
included are broken button textures, which we could fix by pre-
rendering images with a suitable tool, such as inkscape.  We could
easily do a minimal gtk[+]? without it.

As for the lock, why can't we?  gtk+ is already core-updates material,
so it stands to reason that anything causing it to rebuild is too. 
Rather than push down blobs to the users because we can't deal with
Rust, we should fix Rust or make it go away from the build.

WDYT?





^ permalink raw reply	[flat|nested] 13+ messages in thread

* [bug#51845] [PATCH 0/2] Add librsvg-bootstrap
  2021-11-14 14:07 [bug#51845] [PATCH 0/2] Add librsvg-bootstrap Efraim Flashner
                   ` (2 preceding siblings ...)
  2021-11-14 17:27 ` [bug#51845] [PATCH 0/2] Add librsvg-bootstrap Liliana Marie Prikler
@ 2021-12-06 12:17 ` Ludovic Courtès
  2021-12-06 13:06   ` Efraim Flashner
  3 siblings, 1 reply; 13+ messages in thread
From: Ludovic Courtès @ 2021-12-06 12:17 UTC (permalink / raw)
  To: Efraim Flashner; +Cc: 51845

Hi Efraim,

I had completely overlooked these patches, oops!

Efraim Flashner <efraim@flashner.co.il> skribis:

> librsvg is an input for emacs, gtk+@2 and gtk+@3. With the rust inputs
> this leads to (unknown) rust libraries causing the rebuild of over 3000
> packages on core-updates-frozen. Rather than hunt them down I tracked
> down the packages which would have many rebuilds and added a copy of
> librsvg for them to use.

[...]

> I'm suggesting that for gtk+@2 and gtk+@3 we use the bundled crates and
> for the other 101 packages we continue to use our current version, where
> we replace all of the bundled crates with our own copies, which get
> updated more often than librsvg does.
>
> With our current rust tooling I don't think it'd be that easy to find
> the ~226 crates that librsvg depends on, and it wouldn't be great to
> lock them due to librsvg being an input for gtk2/3.

Yes, that’s a problem, though Liliana is right that bundling isn’t great
either.

I’m annoyed by this whole librsvg situation.  On non-x86_64, we now
depend on librsvg 2.40, the old C version, and guess what, it just
works.  That has me tempted to stick with 2.40 all along because these
Rust problems don’t seem to have a pleasant, or even an easy solution.

Now, using the proposed ‘librsvg-bootstrap’ in GTK+ looks like a lesser
evil.

Thoughts?

Ludo’.




^ permalink raw reply	[flat|nested] 13+ messages in thread

* [bug#51845] [PATCH 0/2] Add librsvg-bootstrap
  2021-12-06 12:17 ` Ludovic Courtès
@ 2021-12-06 13:06   ` Efraim Flashner
  2021-12-06 16:37     ` Ludovic Courtès
  0 siblings, 1 reply; 13+ messages in thread
From: Efraim Flashner @ 2021-12-06 13:06 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: 51845

[-- Attachment #1: Type: text/plain, Size: 2807 bytes --]

On Mon, Dec 06, 2021 at 01:17:47PM +0100, Ludovic Courtès wrote:
> Hi Efraim,
> 
> I had completely overlooked these patches, oops!
> 
> Efraim Flashner <efraim@flashner.co.il> skribis:
> 
> > librsvg is an input for emacs, gtk+@2 and gtk+@3. With the rust inputs
> > this leads to (unknown) rust libraries causing the rebuild of over 3000
> > packages on core-updates-frozen. Rather than hunt them down I tracked
> > down the packages which would have many rebuilds and added a copy of
> > librsvg for them to use.
> 
> [...]
> 
> > I'm suggesting that for gtk+@2 and gtk+@3 we use the bundled crates and
> > for the other 101 packages we continue to use our current version, where
> > we replace all of the bundled crates with our own copies, which get
> > updated more often than librsvg does.
> >
> > With our current rust tooling I don't think it'd be that easy to find
> > the ~226 crates that librsvg depends on, and it wouldn't be great to
> > lock them due to librsvg being an input for gtk2/3.
> 
> Yes, that’s a problem, though Liliana is right that bundling isn’t great
> either.
> 
> I’m annoyed by this whole librsvg situation.  On non-x86_64, we now
> depend on librsvg 2.40, the old C version, and guess what, it just
> works.  That has me tempted to stick with 2.40 all along because these
> Rust problems don’t seem to have a pleasant, or even an easy solution.
> 
> Now, using the proposed ‘librsvg-bootstrap’ in GTK+ looks like a lesser
> evil.
> 
> Thoughts?

Unbundling the rust crates is the right option, but not the easy option.
With the assumption that rust-libc-0.2 is in the graph for librsvg, we
add another copy named rust-libc-0.2.101 (the current version) and a
comment that it only gets adjusted on core-updates or that it causes
XXXX package rebuilds.

On a small tangent, the work I do sometimes to try to actually have a
dependency graph with the crates would only make these easier to find,
not actually address the issue here.

I'm not sure if it'd be better to mostly copy the packages with a new
name and keep the cargo-inputs or to actually adjust the
cargo-inputs->inputs and cargo-development-inputs->native-inputs  so we
get the dependency graph from rust-libc-0.2.101 to librsvg. I'd like to
make the change but if we don't get the others changed then we
effectively really have two sets of rust crates.

If we have both cargo-inputs and inputs then the cargo-build-system
doesn't have issues with using either type with later packages, so that
might be the best option for now.

-- 
Efraim Flashner   <efraim@flashner.co.il>   רנשלפ םירפא
GPG key = A28B F40C 3E55 1372 662D  14F7 41AA E7DC CA3D 8351
Confidentiality cannot be guaranteed on emails sent or received unencrypted

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [bug#51845] [PATCH 0/2] Add librsvg-bootstrap
  2021-12-06 13:06   ` Efraim Flashner
@ 2021-12-06 16:37     ` Ludovic Courtès
  2021-12-06 17:02       ` Efraim Flashner
  0 siblings, 1 reply; 13+ messages in thread
From: Ludovic Courtès @ 2021-12-06 16:37 UTC (permalink / raw)
  To: Efraim Flashner; +Cc: 51845

Hi Efraim,

Efraim Flashner <efraim@flashner.co.il> skribis:

> On a small tangent, the work I do sometimes to try to actually have a
> dependency graph with the crates would only make these easier to find,
> not actually address the issue here.
>
> I'm not sure if it'd be better to mostly copy the packages with a new
> name and keep the cargo-inputs or to actually adjust the
> cargo-inputs->inputs and cargo-development-inputs->native-inputs  so we
> get the dependency graph from rust-libc-0.2.101 to librsvg. I'd like to
> make the change but if we don't get the others changed then we
> effectively really have two sets of rust crates.
>
> If we have both cargo-inputs and inputs then the cargo-build-system
> doesn't have issues with using either type with later packages, so that
> might be the best option for now.

Thinking out loud… would it work to change:

  (arguments '(#:cargo-inputs X #:cargo-development-inputs Y))

to:

  (native-inputs (map package-source Y))
  (inputs (map package-source X))

?

Or am I just saying nonsense?

Thanks,
Ludo’.




^ permalink raw reply	[flat|nested] 13+ messages in thread

* [bug#51845] [PATCH 0/2] Add librsvg-bootstrap
  2021-12-06 16:37     ` Ludovic Courtès
@ 2021-12-06 17:02       ` Efraim Flashner
  2021-12-06 22:17         ` [bug#51845] Using ‘native-inputs’ and ‘inputs’ for Cargo packages? Ludovic Courtès
  0 siblings, 1 reply; 13+ messages in thread
From: Efraim Flashner @ 2021-12-06 17:02 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: 51845



On December 6, 2021 4:37:12 PM UTC, "Ludovic Courtès" <ludo@gnu.org> wrote:
>Hi Efraim,
>
>Efraim Flashner <efraim@flashner.co.il> skribis:
>
>> On a small tangent, the work I do sometimes to try to actually have a
>> dependency graph with the crates would only make these easier to find,
>> not actually address the issue here.
>>
>> I'm not sure if it'd be better to mostly copy the packages with a new
>> name and keep the cargo-inputs or to actually adjust the
>> cargo-inputs->inputs and cargo-development-inputs->native-inputs  so we
>> get the dependency graph from rust-libc-0.2.101 to librsvg. I'd like to
>> make the change but if we don't get the others changed then we
>> effectively really have two sets of rust crates.
>>
>> If we have both cargo-inputs and inputs then the cargo-build-system
>> doesn't have issues with using either type with later packages, so that
>> might be the best option for now.
>
>Thinking out loud… would it work to change:
>
>  (arguments '(#:cargo-inputs X #:cargo-development-inputs Y))
>
>to:
>
>  (native-inputs (map package-source Y))
>  (inputs (map package-source X))
>
>?
>
>Or am I just saying nonsense?
>
>Thanks,
>Ludo’.

Then we lose the transitive package sources, which is how we ended up where we are today.

I can go and change the cargo-build-system to use the skip-build flag in more phases to skip them when we aren't going to be building them anyway. No need to generate cargo checksums if we're not building I think.
-- 
Sent from my Android device with K-9 Mail. Please excuse my brevity.




^ permalink raw reply	[flat|nested] 13+ messages in thread

* [bug#51845] Using ‘native-inputs’ and ‘inputs’ for Cargo packages?
  2021-12-06 17:02       ` Efraim Flashner
@ 2021-12-06 22:17         ` Ludovic Courtès
  2021-12-07 10:11           ` Efraim Flashner
  0 siblings, 1 reply; 13+ messages in thread
From: Ludovic Courtès @ 2021-12-06 22:17 UTC (permalink / raw)
  To: Efraim Flashner; +Cc: 51845

[-- Attachment #1: Type: text/plain, Size: 1149 bytes --]

Efraim Flashner <efraim@flashner.co.il> skribis:

> On December 6, 2021 4:37:12 PM UTC, "Ludovic Courtès" <ludo@gnu.org> wrote:

[...]

>>Thinking out loud… would it work to change:
>>
>>  (arguments '(#:cargo-inputs X #:cargo-development-inputs Y))
>>
>>to:
>>
>>  (native-inputs (map package-source Y))
>>  (inputs (map package-source X))
>>
>>?

[...]

> Then we lose the transitive package sources, which is how we ended up where we are today.

True.

With the minimal changes to (guix build-system cargo) below, one can use
either the current style or pass “development inputs” as ‘native-inputs’
and other dependencies as ‘inputs’.  Source transitivity is preserved
but you can write packages the normal way.

I modified some of the dependencies of librsvg to use
native-inputs/inputs and you can see when applying this part of the
patch that the librsvg derivation is unchanged.  Good thing is that
‘guix graph’ and ‘guix refresh -l’ work for these packages.

Is this a direction we want to take?

If so, we can have ‘guix style’ automate transformations.

Thanks,
Ludo’.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Type: text/x-patch, Size: 18535 bytes --]

diff --git a/gnu/packages/crates-io.scm b/gnu/packages/crates-io.scm
index b8c4c7bd39..d7214e2d4f 100644
--- a/gnu/packages/crates-io.scm
+++ b/gnu/packages/crates-io.scm
@@ -5728,18 +5728,26 @@ (define-public rust-bitflags-1.3
         (file-name (string-append name "-" version ".tar.gz"))
         (sha256
          (base32 "12ki6w8gn1ldq7yz9y680llwk5gmrhrzszaa17g1sbrw2r2qvwxy"))))
-    (arguments
-     `(#:tests? #f      ; Tests require rust-1.46 or newer.
-       #:cargo-inputs
-       (("rust-compiler-builtins" ,rust-compiler-builtins-0.1)
-        ("rust-rustc-std-workspace-core" ,rust-rustc-std-workspace-core-1))
-       #:cargo-development-inputs
-       (("rust-rustversion" ,rust-rustversion-1)
-        ("rust-serde" ,rust-serde-1)
-        ("rust-serde-derive" ,rust-serde-derive-1)
-        ("rust-serde-json" ,rust-serde-json-1)
-        ("rust-trybuild" ,rust-trybuild-1)
-        ("rust-walkdir" ,rust-walkdir-2))))))
+    (arguments `(#:tests? #f ; Tests require rust-1.46 or newer.
+                         ))
+    (native-inputs `(("rust-rustversion" ,rust-rustversion-1) (
+                                                               "rust-serde" ,
+                                                                       rust-serde-1)
+                                                               (
+                                                               "rust-serde-derive" ,
+                                                                                  rust-serde-derive-1)
+                                                               (
+                                                               "rust-serde-json" ,
+                                                                                rust-serde-json-1)
+                                                               (
+                                                               "rust-trybuild" ,
+                                                                              rust-trybuild-1)
+                                                               (
+                                                               "rust-walkdir" ,
+                                                                             rust-walkdir-2)))
+    (inputs `(("rust-compiler-builtins" ,rust-compiler-builtins-0.1) (
+                                                                      "rust-rustc-std-workspace-core" ,
+                                                                                                 rust-rustc-std-workspace-core-1)))))
 
 (define-public rust-bitflags-0.9
   (package
@@ -8391,12 +8399,9 @@ (define-public rust-cast-0.2
         (base32
          "1c5z7zryj0zwnhdgs6rw5dfvnlwc1vm19jzrlgx5055alnwk952b"))))
     (build-system cargo-build-system)
-    (arguments
-     `(#:skip-build? #t
-       #:cargo-inputs
-       (("rust-rustc-version" ,rust-rustc-version-0.2))
-       #:cargo-development-inputs
-       (("rust-quickcheck" ,rust-quickcheck-0.9))))
+    (arguments `(#:skip-build? #t))
+    (native-inputs `(("rust-quickcheck" ,rust-quickcheck-0.9)))
+    (inputs `(("rust-rustc-version" ,rust-rustc-version-0.2)))
     (home-page "https://github.com/japaric/cast.rs")
     (synopsis
      "Ergonomic, checked cast functions for primitive types")
@@ -12459,19 +12464,34 @@ (define-public rust-cssparser-0.28
        (sha256
         (base32 "1h924c5g2rwlmgk8hllciyky3ih3z9vf04xz3xsp3cv1jyd5kf0x"))))
     (build-system cargo-build-system)
-    (arguments
-     `(#:skip-build? #t
-       #:cargo-inputs
-       (("rust-cssparser-macros" ,rust-cssparser-macros-0.6)
-        ("rust-dtoa-short" ,rust-dtoa-short-0.3)
-        ("rust-itoa" ,rust-itoa-0.4)
-        ("rust-matches" ,rust-matches-0.1)
-        ("rust-phf" ,rust-phf-0.8)
-        ("rust-proc-macro2" ,rust-proc-macro2-1)
-        ("rust-quote" ,rust-quote-1)
-        ("rust-serde" ,rust-serde-1)
-        ("rust-smallvec" ,rust-smallvec-1)
-        ("rust-syn" ,rust-syn-1))))
+    (arguments `(#:skip-build? #t))
+    (inputs `(("rust-cssparser-macros" ,rust-cssparser-macros-0.6) (
+                                                                    "rust-dtoa-short" ,
+                                                                                 rust-dtoa-short-0.3)
+                                                                    (
+                                                                    "rust-itoa" ,
+                                                                               rust-itoa-0.4)
+                                                                    (
+                                                                    "rust-matches" ,
+                                                                                  rust-matches-0.1)
+                                                                    (
+                                                                    "rust-phf" ,
+                                                                              rust-phf-0.8)
+                                                                    (
+                                                                    "rust-proc-macro2" ,
+                                                                                      rust-proc-macro2-1)
+                                                                    (
+                                                                    "rust-quote" ,
+                                                                                rust-quote-1)
+                                                                    (
+                                                                    "rust-serde" ,
+                                                                                rust-serde-1)
+                                                                    (
+                                                                    "rust-smallvec" ,
+                                                                                   rust-smallvec-1)
+                                                                    (
+                                                                    "rust-syn" ,
+                                                                              rust-syn-1)))
     (home-page "https://github.com/servo/rust-cssparser")
     (synopsis "Rust implementation of CSS Syntax Level 3")
     (description
@@ -13601,13 +13621,13 @@ (define-public rust-data-url-0.1
          (base32
           "176wa1n8h71iwyaxhar4sqwrgrvb5sxk26az0fy88vnxrsffjgyk"))))
     (build-system cargo-build-system)
-    (arguments
-     `(#:cargo-inputs
-       (("rust-matches" ,rust-matches-0.1))
-       #:cargo-development-inputs
-       (("rust-rustc-test" ,rust-rustc-test-0.3)
-        ("rust-serde" ,rust-serde-1)
-        ("rust-serde-json" ,rust-serde-json-1))))
+    (native-inputs `(("rust-rustc-test" ,rust-rustc-test-0.3) (
+                                                               "rust-serde" ,
+                                                                       rust-serde-1)
+                                                               (
+                                                               "rust-serde-json" ,
+                                                                                rust-serde-json-1)))
+    (inputs `(("rust-matches" ,rust-matches-0.1)))
     (home-page "https://github.com/servo/rust-url")
     (synopsis "Processing of data: URL according to WHATWG's Fetch Standard")
     (description
@@ -16336,21 +16356,21 @@ (define-public rust-encoding-0.2
         (base32
          "1v1ndmkarh9z3n5hk53da4z56hgk9wa5kcsm7cnx345raqw983bb"))))
     (build-system cargo-build-system)
-    (arguments
-     `(#:skip-build? #t
-       #:cargo-inputs
-       (("rust-encoding-index-japanese"
-         ,rust-encoding-index-japanese-1.20141219)
-        ("rust-encoding-index-korean"
-         ,rust-encoding-index-korean-1.20141219)
-        ("rust-encoding-index-simpchinese"
-         ,rust-encoding-index-simpchinese-1.20141219)
-        ("rust-encoding-index-singlebyte"
-         ,rust-encoding-index-singlebyte-1.20141219)
-        ("rust-encoding-index-tradchinese"
-         ,rust-encoding-index-tradchinese-1.20141219))
-       #:cargo-development-inputs
-       (("rust-getopts" ,rust-getopts-0.2))))
+    (arguments `(#:skip-build? #t))
+    (native-inputs `(("rust-getopts" ,rust-getopts-0.2)))
+    (inputs `(("rust-encoding-index-japanese" ,
+                                            rust-encoding-index-japanese-1.20141219) (
+                                                                                 "rust-encoding-index-korean" ,
+                                                                                                         rust-encoding-index-korean-1.20141219)
+                                                                                 (
+                                                                                 "rust-encoding-index-simpchinese" ,
+                                                                                                                  rust-encoding-index-simpchinese-1.20141219)
+                                                                                 (
+                                                                                 "rust-encoding-index-singlebyte" ,
+                                                                                                                 rust-encoding-index-singlebyte-1.20141219)
+                                                                                 (
+                                                                                 "rust-encoding-index-tradchinese" ,
+                                                                                                                  rust-encoding-index-tradchinese-1.20141219)))
     (home-page
      "https://github.com/lifthrasiir/rust-encoding")
     (synopsis "Character encoding support for Rust")
@@ -18388,8 +18408,7 @@ (define-public rust-float-cmp-0.8
          (base32
           "1i56hnzjn5pmrcm47fwkmfxiihk7wz5vvcgpb0kpfhzkqi57y9p1"))))
     (build-system cargo-build-system)
-    (arguments
-     `(#:cargo-inputs (("rust-num-traits" ,rust-num-traits-0.2))))
+    (inputs `(("rust-num-traits" ,rust-num-traits-0.2)))
     (home-page "https://github.com/mikedilger/float-cmp")
     (synopsis "Floating point approximate comparison traits")
     (description
@@ -26818,11 +26837,8 @@ (define-public rust-libm-0.2
         (base32
          "0akh56sh51adhagmk9l84dyrlz60gv8ri05xhr13i1b18czkpmy7"))))
     (build-system cargo-build-system)
-    (arguments
-     `(#:cargo-inputs
-       (("rust-rand" ,rust-rand-0.6))
-       #:cargo-development-inputs
-       (("rust-no-panic" ,rust-no-panic-0.1))))
+    (native-inputs `(("rust-no-panic" ,rust-no-panic-0.1)))
+    (inputs `(("rust-rand" ,rust-rand-0.6)))
     (home-page "https://github.com/rust-lang/libm")
     (synopsis "Libm in pure Rust")
     (description "This package provides an implementation of libm in pure Rust.")
diff --git a/guix/build-system/cargo.scm b/guix/build-system/cargo.scm
index 60c35eed07..b2d97beb2f 100644
--- a/guix/build-system/cargo.scm
+++ b/guix/build-system/cargo.scm
@@ -125,17 +125,21 @@ (define builder
                     #:target #f
                     #:guile-for-build guile))
 
+(define (cargo-input? input)
+  (match input
+    ((label (? package? p))
+     (eq? cargo-build-system (package-build-system p)))
+    (_ #f)))
+
 (define (package-cargo-inputs p)
-  (apply
-    (lambda* (#:key (cargo-inputs '()) #:allow-other-keys)
-      cargo-inputs)
-    (package-arguments p)))
+  (match (member #:cargo-inputs (package-arguments p))
+    (#f (filter cargo-input? (package-inputs p)))
+    ((_ inputs . _) inputs)))
 
 (define (package-cargo-development-inputs p)
-  (apply
-    (lambda* (#:key (cargo-development-inputs '()) #:allow-other-keys)
-      cargo-development-inputs)
-    (package-arguments p)))
+  (match (member #:cargo-development-inputs (package-arguments p))
+    (#f (filter cargo-input? (package-native-inputs p)))
+    ((_ inputs . _) inputs)))
 
 (define (crate-closure inputs)
   "Return the closure of INPUTS when considering the 'cargo-inputs' and
@@ -235,8 +239,8 @@ (define (expand-crate-sources cargo-inputs cargo-development-inputs)
 (define* (lower name
                 #:key source inputs native-inputs outputs system target
                 (rust (default-rust))
-                (cargo-inputs '())
-                (cargo-development-inputs '())
+                (cargo-inputs (filter cargo-input? inputs))
+                (cargo-development-inputs (filter cargo-input? native-inputs))
                 #:allow-other-keys
                 #:rest arguments)
   "Return a bag for NAME."
@@ -260,7 +264,9 @@ (define private-keywords
          (build-inputs `(("cargo" ,rust "cargo")
                          ("rustc" ,rust)
                          ,@(expand-crate-sources cargo-inputs cargo-development-inputs)
-                         ,@native-inputs))
+                         ,@(if (eq? native-inputs cargo-development-inputs)
+                               '()
+                               native-inputs)))
          (outputs outputs)
          (build cargo-build)
          (arguments (strip-keyword-arguments private-keywords arguments)))))
diff --git a/guix/packages.scm b/guix/packages.scm
index b3c5a00011..275cc3675c 100644
--- a/guix/packages.scm
+++ b/guix/packages.scm
@@ -660,7 +660,8 @@ (define (deprecated-package old-name p)
     (name old-name)
     (properties `((superseded . ,p)))))
 
-(define (package-field-location package field)
+(define* (package-field-location package field
+                                 #:key (value-location? #t))
   "Return the source code location of the definition of FIELD for PACKAGE, or
 #f if it could not be determined."
   (match (package-location package)
@@ -678,7 +679,10 @@ (define (package-field-location package field)
                    (let ((field (assoc field inits)))
                      (match field
                        ((_ value)
-                        (let ((loc (and=> (source-properties value)
+                        (let ((loc (and=> (source-properties
+                                           (if value-location?
+                                               value
+                                               field))
                                           source-properties->location)))
                           (and loc
                                ;; Preserve the original file name, which may be a
diff --git a/guix/scripts/style.scm b/guix/scripts/style.scm
index 86a46f693c..dccc20d880 100644
--- a/guix/scripts/style.scm
+++ b/guix/scripts/style.scm
@@ -29,6 +29,7 @@
 
 (define-module (guix scripts style)
   #:autoload   (gnu packages) (specification->package fold-packages)
+  #:autoload   (guix build-system cargo) (cargo-build-system)
   #:use-module (guix scripts)
   #:use-module ((guix scripts build) #:select (%standard-build-options))
   #:use-module (guix combinators)
@@ -212,6 +213,21 @@ (define (object->string* obj indent)
       (pretty-print-with-comments port obj
                                   #:indent indent))))
 
+(define (object-list->string lst indent)
+  (call-with-output-string
+    (lambda (port)
+      (let loop ((lst lst))
+        (match lst
+          ((obj)
+           (pretty-print-with-comments port obj
+                                       #:indent indent))
+          ((obj rest ...)
+           (pretty-print-with-comments port obj
+                                       #:indent indent)
+           (newline port)
+           (display (make-string indent #\space) port)
+           (loop rest)))))))
+
 \f
 ;;;
 ;;; Simplifying input expressions.
@@ -441,6 +457,49 @@ (define matches?
             (list package-inputs package-native-inputs
                   package-propagated-inputs)))
 
+\f
+;;;
+;;; Crates, Cargo, Rust, and all that.
+;;;
+
+(define* (rewrite-cargo-inputs package
+                               #:key (policy 'silent)
+                               (edit-expression edit-expression))
+  (when (eq? (package-build-system package) cargo-build-system)
+    (match (package-field-location package 'arguments
+                                   #:value-location? #f)
+      (#f #f)
+      (location
+       (let* ((indent (location-column location)))
+         (edit-expression
+          (pk 'loc (location->source-properties location))
+          (lambda (str)
+            (define arguments
+              (call-with-input-string (pk 'str str) read-with-comments))
+
+            (match arguments
+              (('arguments ('quasiquote lst))
+               (let ((inputs (match (member #:cargo-inputs lst)
+                               (#f '())
+                               ((_ inputs . _) inputs)))
+                     (native (match (member #:cargo-development-inputs lst)
+                               (#f '())
+                               ((_ inputs . _) inputs)))
+                     (rest (strip-keyword-arguments
+                            '(#:cargo-inputs #:cargo-development-inputs)
+                            lst)))
+                 (object-list->string
+                  `(,@(if (null? rest)
+                          '()
+                          `((arguments ,(list 'quasiquote rest))))
+                    ,@(if (null? native)
+                          '()
+                          `((native-inputs ,(list 'quasiquote native))))
+                    ,@(if (null? inputs)
+                          '()
+                          `((inputs ,(list 'quasiquote inputs)))))
+                  indent)))))))))))
+
 (define (package-location<? p1 p2)
   "Return true if P1's location is \"before\" P2's."
   (let ((loc1 (package-location p1))
@@ -536,7 +595,7 @@ (define (parse-options)
                        edit-expression))
          (policy   (assoc-ref opts 'input-simplification-policy)))
     (for-each (lambda (package)
-                (simplify-package-inputs package #:policy policy
+                (rewrite-cargo-inputs package #:policy policy
                                          #:edit-expression edit))
               ;; Sort package by source code location so that we start editing
               ;; files from the bottom and going upward.  That way, the

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [bug#51845] Using ‘native-inputs’ and ‘inputs’ for Cargo packages?
  2021-12-06 22:17         ` [bug#51845] Using ‘native-inputs’ and ‘inputs’ for Cargo packages? Ludovic Courtès
@ 2021-12-07 10:11           ` Efraim Flashner
  2021-12-07 19:48             ` Ludovic Courtès
  0 siblings, 1 reply; 13+ messages in thread
From: Efraim Flashner @ 2021-12-07 10:11 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: 51845


[-- Attachment #1.1: Type: text/plain, Size: 12368 bytes --]

On Mon, Dec 06, 2021 at 11:17:47PM +0100, Ludovic Courtès wrote:
> Efraim Flashner <efraim@flashner.co.il> skribis:
> 
> > On December 6, 2021 4:37:12 PM UTC, "Ludovic Courtès" <ludo@gnu.org> wrote:
> 
> [...]
> 
> >>Thinking out loud… would it work to change:
> >>
> >>  (arguments '(#:cargo-inputs X #:cargo-development-inputs Y))
> >>
> >>to:
> >>
> >>  (native-inputs (map package-source Y))
> >>  (inputs (map package-source X))
> >>
> >>?
> 
> [...]
> 
> > Then we lose the transitive package sources, which is how we ended up where we are today.
> 
> True.
> 
> With the minimal changes to (guix build-system cargo) below, one can use
> either the current style or pass “development inputs” as ‘native-inputs’
> and other dependencies as ‘inputs’.  Source transitivity is preserved
> but you can write packages the normal way.
> 
> I modified some of the dependencies of librsvg to use
> native-inputs/inputs and you can see when applying this part of the
> patch that the librsvg derivation is unchanged.  Good thing is that
> ‘guix graph’ and ‘guix refresh -l’ work for these packages.
> 
> Is this a direction we want to take?

I like the way it works out, and has Guix do the magic to give us the
crates in the graph. On the other hand I tried changing the cargo-inputs
from librsvg to regular inputs, and after 2.5 minutes of trying to run
`guix show librsvg` I still wasn't seeing the dependencies and my RAM
usage was still increasing. Also gnu/packages/gnome.scm didn't fail to
compile, so there was no notice of the loop.

I changed some more packages which are transitive inputs of
rust-encoding@0.2 and didn't see any slowdown. I was worried that this
would affect a future use of `guix shell -D rust-app` not pulling in any
of the crates but it still seems to work. I tried with rust-encoding@0.2
and got the crates for the packages I expected (only the ones I changed).

(ins)efraim@3900XT ~/workspace/guix-core-updates$ ./pre-inst-env guix shell -D rust-encoding@0.2
(ins)efraim@3900XT ~/workspace/guix-core-updates [env]$ ls $GUIX_ENVIRONMENT/share/cargo/registry/ | col
cc-1.0.66.crate
compiler_builtins-0.1.26.crate
encoding-index-japanese-1.20141219.5.crate
encoding-index-korean-1.20141219.5.crate
encoding-index-simpchinese-1.20141219.5.crate
encoding-index-singlebyte-1.20141219.5.crate
encoding_index_tests-0.1.4.crate
encoding-index-tradchinese-1.20141219.5.crate
getopts-0.2.21.crate
log-0.3.9.crate
rustc-std-workspace-core-1.0.0.crate
rustc-std-workspace-std-1.0.1.crate
unicode-width-0.1.9.crate

So to summarize, between your diff to treat inputs built using
cargo-build-system as cargo-inputs and my changes to save previous
crates for the next input we reach a place where we can start to change
the crates over to use inputs and native-inputs instead of cargo-inputs
and cargo-development-inputs without needing to flip everything at once.

So I'd go with it's good, but I'm not sure it directly works to fix the
problem we're having with librsvg.

> If so, we can have ‘guix style’ automate transformations.
> 
> Thanks,
> Ludo’.
> 

I've added some inline comments in the diff (and removed a bunch of
lines)

> diff --git a/guix/build-system/cargo.scm b/guix/build-system/cargo.scm
> index 60c35eed07..b2d97beb2f 100644
> --- a/guix/build-system/cargo.scm
> +++ b/guix/build-system/cargo.scm
> @@ -125,17 +125,21 @@ (define builder
>                      #:target #f
>                      #:guile-for-build guile))
>  
> +(define (cargo-input? input)
> +  (match input
> +    ((label (? package? p))
> +     (eq? cargo-build-system (package-build-system p)))
> +    (_ #f)))
> +

I would've sorted based on the name starting with 'rust-'.

I can't think of an example quickly where it would happen, but take
librsvg, which we currently build with cargo-build-system. If we need it
as an input for pango (or some other library) and we also build that
with the cargo-build-system then we'll just get the rust inputs, not the
actual library.

Can we check the arguments field for `#:install-source? #f` and use it
as a regular {propagated-,native-,}input in that case? Then we could
have cbindgen and rust-cbindgen, depending on if we needed the binary or
the sources.

>  (define (package-cargo-inputs p)
> -  (apply
> -    (lambda* (#:key (cargo-inputs '()) #:allow-other-keys)
> -      cargo-inputs)
> -    (package-arguments p)))
> +  (match (member #:cargo-inputs (package-arguments p))
> +    (#f (filter cargo-input? (package-inputs p)))
> +    ((_ inputs . _) inputs)))
>  
>  (define (package-cargo-development-inputs p)
> -  (apply
> -    (lambda* (#:key (cargo-development-inputs '()) #:allow-other-keys)
> -      cargo-development-inputs)
> -    (package-arguments p)))
> +  (match (member #:cargo-development-inputs (package-arguments p))
> +    (#f (filter cargo-input? (package-native-inputs p)))
> +    ((_ inputs . _) inputs)))

I see we don't get rid of #:cargo-inputs or #:cargo-development-inputs.
So even if applying the style change to all the crates causes circular
dependency problems we can fall back to the current method. I ran into
problems once I hit all the rust-bindgen crates.

>  
>  (define (crate-closure inputs)
>    "Return the closure of INPUTS when considering the 'cargo-inputs' and
> @@ -235,8 +239,8 @@ (define (expand-crate-sources cargo-inputs cargo-development-inputs)
>  (define* (lower name
>                  #:key source inputs native-inputs outputs system target
>                  (rust (default-rust))
> -                (cargo-inputs '())
> -                (cargo-development-inputs '())
> +                (cargo-inputs (filter cargo-input? inputs))
> +                (cargo-development-inputs (filter cargo-input? native-inputs))

I tried commenting the cargo-development-inputs out, but it only caused
problems for me when trying to compile rust-encoding@0.2.

>                  #:allow-other-keys
>                  #:rest arguments)
>    "Return a bag for NAME."
> @@ -260,7 +264,9 @@ (define private-keywords
>           (build-inputs `(("cargo" ,rust "cargo")
>                           ("rustc" ,rust)
>                           ,@(expand-crate-sources cargo-inputs cargo-development-inputs)
> -                         ,@native-inputs))
> +                         ,@(if (eq? native-inputs cargo-development-inputs)
> +                               '()
> +                               native-inputs)))
>           (outputs outputs)
>           (build cargo-build)
>           (arguments (strip-keyword-arguments private-keywords arguments)))))
> diff --git a/guix/packages.scm b/guix/packages.scm
> index b3c5a00011..275cc3675c 100644
> --- a/guix/packages.scm
> +++ b/guix/packages.scm
> @@ -660,7 +660,8 @@ (define (deprecated-package old-name p)
>      (name old-name)
>      (properties `((superseded . ,p)))))
>  
> -(define (package-field-location package field)
> +(define* (package-field-location package field
> +                                 #:key (value-location? #t))
>    "Return the source code location of the definition of FIELD for PACKAGE, or
>  #f if it could not be determined."
>    (match (package-location package)
> @@ -678,7 +679,10 @@ (define (package-field-location package field)
>                     (let ((field (assoc field inits)))
>                       (match field
>                         ((_ value)
> -                        (let ((loc (and=> (source-properties value)
> +                        (let ((loc (and=> (source-properties
> +                                           (if value-location?
> +                                               value
> +                                               field))
>                                            source-properties->location)))
>                            (and loc
>                                 ;; Preserve the original file name, which may be a
> diff --git a/guix/scripts/style.scm b/guix/scripts/style.scm
> index 86a46f693c..dccc20d880 100644
> --- a/guix/scripts/style.scm
> +++ b/guix/scripts/style.scm
> @@ -29,6 +29,7 @@
>  
>  (define-module (guix scripts style)
>    #:autoload   (gnu packages) (specification->package fold-packages)
> +  #:autoload   (guix build-system cargo) (cargo-build-system)
>    #:use-module (guix scripts)
>    #:use-module ((guix scripts build) #:select (%standard-build-options))
>    #:use-module (guix combinators)
> @@ -212,6 +213,21 @@ (define (object->string* obj indent)
>        (pretty-print-with-comments port obj
>                                    #:indent indent))))
>  
> +(define (object-list->string lst indent)
> +  (call-with-output-string
> +    (lambda (port)
> +      (let loop ((lst lst))
> +        (match lst
> +          ((obj)
> +           (pretty-print-with-comments port obj
> +                                       #:indent indent))
> +          ((obj rest ...)
> +           (pretty-print-with-comments port obj
> +                                       #:indent indent)
> +           (newline port)
> +           (display (make-string indent #\space) port)
> +           (loop rest)))))))
> +
>  \f
>  ;;;
>  ;;; Simplifying input expressions.
> @@ -441,6 +457,49 @@ (define matches?
>              (list package-inputs package-native-inputs
>                    package-propagated-inputs)))
>  
> +\f
> +;;;
> +;;; Crates, Cargo, Rust, and all that.
> +;;;
> +
> +(define* (rewrite-cargo-inputs package
> +                               #:key (policy 'silent)
> +                               (edit-expression edit-expression))
> +  (when (eq? (package-build-system package) cargo-build-system)
> +    (match (package-field-location package 'arguments
> +                                   #:value-location? #f)
> +      (#f #f)
> +      (location
> +       (let* ((indent (location-column location)))
> +         (edit-expression
> +          (pk 'loc (location->source-properties location))
> +          (lambda (str)
> +            (define arguments
> +              (call-with-input-string (pk 'str str) read-with-comments))
> +
> +            (match arguments
> +              (('arguments ('quasiquote lst))
> +               (let ((inputs (match (member #:cargo-inputs lst)
> +                               (#f '())
> +                               ((_ inputs . _) inputs)))
> +                     (native (match (member #:cargo-development-inputs lst)
> +                               (#f '())
> +                               ((_ inputs . _) inputs)))
> +                     (rest (strip-keyword-arguments
> +                            '(#:cargo-inputs #:cargo-development-inputs)
> +                            lst)))
> +                 (object-list->string
> +                  `(,@(if (null? rest)
> +                          '()
> +                          `((arguments ,(list 'quasiquote rest))))
> +                    ,@(if (null? native)
> +                          '()
> +                          `((native-inputs ,(list 'quasiquote native))))
> +                    ,@(if (null? inputs)
> +                          '()
> +                          `((inputs ,(list 'quasiquote inputs)))))
> +                  indent)))))))))))
> +
>  (define (package-location<? p1 p2)
>    "Return true if P1's location is \"before\" P2's."
>    (let ((loc1 (package-location p1))
> @@ -536,7 +595,7 @@ (define (parse-options)
>                         edit-expression))
>           (policy   (assoc-ref opts 'input-simplification-policy)))
>      (for-each (lambda (package)
> -                (simplify-package-inputs package #:policy policy
> +                (rewrite-cargo-inputs package #:policy policy
>                                           #:edit-expression edit))
>                ;; Sort package by source code location so that we start editing
>                ;; files from the bottom and going upward.  That way, the


-- 
Efraim Flashner   <efraim@flashner.co.il>   רנשלפ םירפא
GPG key = A28B F40C 3E55 1372 662D  14F7 41AA E7DC CA3D 8351
Confidentiality cannot be guaranteed on emails sent or received unencrypted

[-- Attachment #1.2: rust-changes-c-u-f --]
[-- Type: text/plain, Size: 24935 bytes --]

diff --git a/gnu/packages/crates-io.scm b/gnu/packages/crates-io.scm
index b8c4c7bd39..ae717645d8 100644
--- a/gnu/packages/crates-io.scm
+++ b/gnu/packages/crates-io.scm
@@ -5728,18 +5728,18 @@ (define-public rust-bitflags-1.3
         (file-name (string-append name "-" version ".tar.gz"))
         (sha256
          (base32 "12ki6w8gn1ldq7yz9y680llwk5gmrhrzszaa17g1sbrw2r2qvwxy"))))
-    (arguments
-     `(#:tests? #f      ; Tests require rust-1.46 or newer.
-       #:cargo-inputs
-       (("rust-compiler-builtins" ,rust-compiler-builtins-0.1)
-        ("rust-rustc-std-workspace-core" ,rust-rustc-std-workspace-core-1))
-       #:cargo-development-inputs
-       (("rust-rustversion" ,rust-rustversion-1)
+    (arguments `(#:tests? #f ; Tests require rust-1.46 or newer.
+                         ))
+    (native-inputs
+      `(("rust-rustversion" ,rust-rustversion-1)
         ("rust-serde" ,rust-serde-1)
         ("rust-serde-derive" ,rust-serde-derive-1)
         ("rust-serde-json" ,rust-serde-json-1)
         ("rust-trybuild" ,rust-trybuild-1)
-        ("rust-walkdir" ,rust-walkdir-2))))))
+        ("rust-walkdir" ,rust-walkdir-2)))
+    (inputs
+      `(("rust-compiler-builtins" ,rust-compiler-builtins-0.1)
+        ("rust-rustc-std-workspace-core" ,rust-rustc-std-workspace-core-1)))))
 
 (define-public rust-bitflags-0.9
   (package
@@ -8391,12 +8391,9 @@ (define-public rust-cast-0.2
         (base32
          "1c5z7zryj0zwnhdgs6rw5dfvnlwc1vm19jzrlgx5055alnwk952b"))))
     (build-system cargo-build-system)
-    (arguments
-     `(#:skip-build? #t
-       #:cargo-inputs
-       (("rust-rustc-version" ,rust-rustc-version-0.2))
-       #:cargo-development-inputs
-       (("rust-quickcheck" ,rust-quickcheck-0.9))))
+    (arguments `(#:skip-build? #t))
+    (native-inputs `(("rust-quickcheck" ,rust-quickcheck-0.9)))
+    (inputs `(("rust-rustc-version" ,rust-rustc-version-0.2)))
     (home-page "https://github.com/japaric/cast.rs")
     (synopsis
      "Ergonomic, checked cast functions for primitive types")
@@ -8434,7 +8431,7 @@ (define-public rust-cc-1
       (origin
         (method url-fetch)
         (uri (crate-uri "cc" version))
-        (file-name (string-append name "-" version ".crate"))
+        (file-name (string-append name "-" version ".tar.gz"))
         (sha256
          (base32
           "0j7d7h4n81z5f22l3v8ggjvvw8m64636nlaqax4x1y44da1rc12c"))))
@@ -8596,7 +8593,7 @@ (define-public rust-cfg-if-0.1
       (origin
         (method url-fetch)
         (uri (crate-uri "cfg-if" version))
-        (file-name (string-append name "-" version ".crate"))
+        (file-name (string-append name "-" version ".tar.gz"))
         (sha256
          (base32
           "08h80ihs74jcyp24cd75wwabygbbdgl05k6p5dmq8akbr78vv1a7"))))
@@ -10052,16 +10049,17 @@ (define-public rust-compiler-builtins-0.1
       (origin
         (method url-fetch)
         (uri (crate-uri "compiler_builtins" version))
-        (file-name (string-append name "-" version ".crate"))
+        (file-name (string-append name "-" version ".tar.gz"))
         (sha256
          (base32
           "1rhj6ccmfkh9gcxnxgjq4fg257yi4f9325nfzsphbmxwkrg06sq3"))))
     (build-system cargo-build-system)
     (arguments
      `(#:skip-build? #t
-       #:cargo-inputs
-       (("rust-rustc-std-workspace-core" ,rust-rustc-std-workspace-core-1)
-        ("rust-cc" ,rust-cc-1))))
+       ))
+       (inputs
+       `(("rust-rustc-std-workspace-core" ,rust-rustc-std-workspace-core-1)
+        ("rust-cc" ,rust-cc-1)))
     (home-page "https://github.com/rust-lang/compiler-builtins")
     (synopsis "Compiler intrinsics used by the Rust compiler")
     (description
@@ -12459,10 +12457,9 @@ (define-public rust-cssparser-0.28
        (sha256
         (base32 "1h924c5g2rwlmgk8hllciyky3ih3z9vf04xz3xsp3cv1jyd5kf0x"))))
     (build-system cargo-build-system)
-    (arguments
-     `(#:skip-build? #t
-       #:cargo-inputs
-       (("rust-cssparser-macros" ,rust-cssparser-macros-0.6)
+    (arguments `(#:skip-build? #t))
+    (inputs
+      `(("rust-cssparser-macros" ,rust-cssparser-macros-0.6)
         ("rust-dtoa-short" ,rust-dtoa-short-0.3)
         ("rust-itoa" ,rust-itoa-0.4)
         ("rust-matches" ,rust-matches-0.1)
@@ -12471,7 +12468,7 @@ (define-public rust-cssparser-0.28
         ("rust-quote" ,rust-quote-1)
         ("rust-serde" ,rust-serde-1)
         ("rust-smallvec" ,rust-smallvec-1)
-        ("rust-syn" ,rust-syn-1))))
+        ("rust-syn" ,rust-syn-1)))
     (home-page "https://github.com/servo/rust-cssparser")
     (synopsis "Rust implementation of CSS Syntax Level 3")
     (description
@@ -13601,13 +13598,11 @@ (define-public rust-data-url-0.1
          (base32
           "176wa1n8h71iwyaxhar4sqwrgrvb5sxk26az0fy88vnxrsffjgyk"))))
     (build-system cargo-build-system)
-    (arguments
-     `(#:cargo-inputs
-       (("rust-matches" ,rust-matches-0.1))
-       #:cargo-development-inputs
-       (("rust-rustc-test" ,rust-rustc-test-0.3)
+    (native-inputs
+      `(("rust-rustc-test" ,rust-rustc-test-0.3)
         ("rust-serde" ,rust-serde-1)
-        ("rust-serde-json" ,rust-serde-json-1))))
+        ("rust-serde-json" ,rust-serde-json-1)))
+    (inputs `(("rust-matches" ,rust-matches-0.1)))
     (home-page "https://github.com/servo/rust-url")
     (synopsis "Processing of data: URL according to WHATWG's Fetch Standard")
     (description
@@ -16334,23 +16329,24 @@ (define-public rust-encoding-0.2
         (string-append name "-" version ".tar.gz"))
        (sha256
         (base32
-         "1v1ndmkarh9z3n5hk53da4z56hgk9wa5kcsm7cnx345raqw983bb"))))
+         "1v1ndmkarh9z3n5hk53da4z56hgk9wa5kcsm7cnx345raqw983bb"))
+       (modules '((guix build utils)))
+       (snippet
+        '(begin
+           (substitute* "Cargo.toml"
+             (("path.*") ""))))))
     (build-system cargo-build-system)
     (arguments
-     `(#:skip-build? #t
-       #:cargo-inputs
-       (("rust-encoding-index-japanese"
-         ,rust-encoding-index-japanese-1.20141219)
-        ("rust-encoding-index-korean"
-         ,rust-encoding-index-korean-1.20141219)
-        ("rust-encoding-index-simpchinese"
-         ,rust-encoding-index-simpchinese-1.20141219)
-        ("rust-encoding-index-singlebyte"
-         ,rust-encoding-index-singlebyte-1.20141219)
-        ("rust-encoding-index-tradchinese"
-         ,rust-encoding-index-tradchinese-1.20141219))
-       #:cargo-development-inputs
-       (("rust-getopts" ,rust-getopts-0.2))))
+      `(;#:skip-build? #t
+        #:tests? #f
+        ))
+    (native-inputs `(("rust-getopts" ,rust-getopts-0.2)))
+    (inputs
+      `(("rust-encoding-index-japanese" ,rust-encoding-index-japanese-1.20141219)
+        ("rust-encoding-index-korean" ,rust-encoding-index-korean-1.20141219)
+        ("rust-encoding-index-simpchinese" ,rust-encoding-index-simpchinese-1.20141219)
+        ("rust-encoding-index-singlebyte" ,rust-encoding-index-singlebyte-1.20141219)
+        ("rust-encoding-index-tradchinese" ,rust-encoding-index-tradchinese-1.20141219)))
     (home-page
      "https://github.com/lifthrasiir/rust-encoding")
     (synopsis "Character encoding support for Rust")
@@ -16374,8 +16370,9 @@ (define-public rust-encoding-index-japanese-1.20141219
     (build-system cargo-build-system)
     (arguments
      `(#:skip-build? #t
-       #:cargo-inputs
-       (("rust-encoding-index-tests" ,rust-encoding-index-tests-0.1))))
+       ))
+       (inputs
+       `(("rust-encoding-index-tests" ,rust-encoding-index-tests-0.1)))
     (home-page "https://github.com/lifthrasiir/rust-encoding")
     (synopsis "Index tables for Japanese character encodings")
     (description
@@ -16398,8 +16395,9 @@ (define-public rust-encoding-index-korean-1.20141219
     (build-system cargo-build-system)
     (arguments
      `(#:skip-build? #t
-       #:cargo-inputs
-       (("rust-encoding-index-tests" ,rust-encoding-index-tests-0.1))))
+       ))
+       (inputs
+       `(("rust-encoding-index-tests" ,rust-encoding-index-tests-0.1)))
     (home-page "https://github.com/lifthrasiir/rust-encoding")
     (synopsis "Index tables for Korean character encodings")
     (description
@@ -16422,8 +16420,9 @@ (define-public rust-encoding-index-simpchinese-1.20141219
     (build-system cargo-build-system)
     (arguments
      `(#:skip-build? #t
-       #:cargo-inputs
-       (("rust-encoding-index-tests" ,rust-encoding-index-tests-0.1))))
+       ))
+       (inputs
+       `(("rust-encoding-index-tests" ,rust-encoding-index-tests-0.1)))
     (home-page "https://github.com/lifthrasiir/rust-encoding")
     (synopsis "Index tables for simplified Chinese character encodings")
     (description
@@ -16446,8 +16445,9 @@ (define-public rust-encoding-index-singlebyte-1.20141219
     (build-system cargo-build-system)
     (arguments
      `(#:skip-build? #t
-       #:cargo-inputs
-       (("rust-encoding-index-tests" ,rust-encoding-index-tests-0.1))))
+       ))
+       (inputs
+       `(("rust-encoding-index-tests" ,rust-encoding-index-tests-0.1)))
     (home-page "https://github.com/lifthrasiir/rust-encoding")
     (synopsis "Index tables for various single-byte character encodings")
     (description
@@ -16493,8 +16493,9 @@ (define-public rust-encoding-index-tradchinese-1.20141219
     (build-system cargo-build-system)
     (arguments
      `(#:skip-build? #t
-       #:cargo-inputs
-       (("rust-encoding-index-tests" ,rust-encoding-index-tests-0.1))))
+       ))
+       (inputs
+       `(("rust-encoding-index-tests" ,rust-encoding-index-tests-0.1)))
     (home-page "https://github.com/lifthrasiir/rust-encoding")
     (synopsis "Index tables for traditional Chinese character encodings")
     (description
@@ -18388,8 +18389,7 @@ (define-public rust-float-cmp-0.8
          (base32
           "1i56hnzjn5pmrcm47fwkmfxiihk7wz5vvcgpb0kpfhzkqi57y9p1"))))
     (build-system cargo-build-system)
-    (arguments
-     `(#:cargo-inputs (("rust-num-traits" ,rust-num-traits-0.2))))
+    (inputs `(("rust-num-traits" ,rust-num-traits-0.2)))
     (home-page "https://github.com/mikedilger/float-cmp")
     (synopsis "Floating point approximate comparison traits")
     (description
@@ -20542,18 +20542,17 @@ (define-public rust-getopts-0.2
       (origin
         (method url-fetch)
         (uri (crate-uri "getopts" version))
-        (file-name (string-append name "-" version ".crate"))
+        (file-name (string-append name "-" version ".tar.gz"))
         (sha256
          (base32
           "1mgb3qvivi26gs6ihqqhh8iyhp3vgxri6vwyrwg28w0xqzavznql"))))
     (build-system cargo-build-system)
-    (arguments
-     `(#:cargo-inputs
-       (("rust-unicode-width" ,rust-unicode-width-0.1)
+     (inputs
+       `(("rust-unicode-width" ,rust-unicode-width-0.1)
         ("rust-rustc-std-workspace-core" ,rust-rustc-std-workspace-core-1)
-        ("rust-rustc-std-workspace-std" ,rust-rustc-std-workspace-std-1))
-       #:cargo-development-inputs
-       (("rust-log" ,rust-log-0.3))))
+        ("rust-rustc-std-workspace-std" ,rust-rustc-std-workspace-std-1)))
+     (native-inputs
+       `(("rust-log" ,rust-log-0.4)))
     (home-page "https://github.com/rust-lang/getopts")
     (synopsis "Rust library for option parsing for CLI utilities")
     (description "This library provides getopts-like option parsing.")
@@ -26818,11 +26817,8 @@ (define-public rust-libm-0.2
         (base32
          "0akh56sh51adhagmk9l84dyrlz60gv8ri05xhr13i1b18czkpmy7"))))
     (build-system cargo-build-system)
-    (arguments
-     `(#:cargo-inputs
-       (("rust-rand" ,rust-rand-0.6))
-       #:cargo-development-inputs
-       (("rust-no-panic" ,rust-no-panic-0.1))))
+    (native-inputs `(("rust-no-panic" ,rust-no-panic-0.1)))
+    (inputs `(("rust-rand" ,rust-rand-0.6)))
     (home-page "https://github.com/rust-lang/libm")
     (synopsis "Libm in pure Rust")
     (description "This package provides an implementation of libm in pure Rust.")
@@ -27685,7 +27681,7 @@ (define-public rust-log-0.4
      (origin
        (method url-fetch)
        (uri (crate-uri "log" version))
-       (file-name (string-append name "-" version ".crate"))
+       (file-name (string-append name "-" version ".tar.gz"))
        (sha256
         (base32 "04175hv0v62shd82qydq58a48k3bjijmk54v38zgqlbxqkkbpfai"))))
     (build-system cargo-build-system)
@@ -44102,7 +44098,7 @@ (define-public rust-rustc-std-workspace-core-1
       (origin
         (method url-fetch)
         (uri (crate-uri "rustc-std-workspace-core" version))
-        (file-name (string-append name "-" version ".crate"))
+        (file-name (string-append name "-" version ".tar.gz"))
         (sha256
          (base32
           "1309xhwyai9xpz128xrfjqkmnkvgjwddznmj7brbd8i8f58zamhr"))))
@@ -58950,11 +58946,10 @@ (define-public rust-unicode-width-0.1
          (base32
           "0wq9wl69wlp6zwlxp660g9p4hm5gk91chwk14dp1gl9bxba45mry"))))
     (build-system cargo-build-system)
-    (arguments
-     `(#:cargo-inputs
-       (("rust-compiler-builtins" ,rust-compiler-builtins-0.1)
+     (inputs
+       `(("rust-compiler-builtins" ,rust-compiler-builtins-0.1)
         ("rust-rustc-std-workspace-core" ,rust-rustc-std-workspace-core-1)
-        ("rust-rustc-std-workspace-std" ,rust-rustc-std-workspace-std-1))))
+        ("rust-rustc-std-workspace-std" ,rust-rustc-std-workspace-std-1)))
     (home-page "https://github.com/unicode-rs/unicode-width")
     (synopsis "Determine displayed width according to Unicode rules")
     (description "This crate allows you to determine displayed width of
diff --git a/gnu/packages/gnome.scm b/gnu/packages/gnome.scm
index 2037ab9369..389b53eef0 100644
--- a/gnu/packages/gnome.scm
+++ b/gnu/packages/gnome.scm
@@ -3479,43 +3479,6 @@ (define-public librsvg
        ((guix build cargo-build-system)
         (guix build utils)
         ((guix build gnu-build-system) #:prefix gnu:))
-       #:cargo-inputs
-       (("rust-bitflags" ,rust-bitflags-1)
-        ("rust-cairo-rs" ,rust-cairo-rs-0.8)
-        ("rust-cairo-sys-rs" ,rust-cairo-sys-rs-0.9)
-        ("rust-cast" ,rust-cast-0.2)
-        ("rust-cssparser" ,rust-cssparser-0.27)
-        ("rust-data-url" ,rust-data-url-0.1)
-        ("rust-encoding" ,rust-encoding-0.2)
-        ("rust-float-cmp" ,rust-float-cmp-0.8)
-        ("rust-gdk-pixbuf" ,rust-gdk-pixbuf-0.8)
-        ("rust-gdk-pixbuf-sys" ,rust-gdk-pixbuf-sys-0.9)
-        ("rust-gio" ,rust-gio-0.8)
-        ("rust-gio-sys" ,rust-gio-sys-0.9)
-        ("rust-glib" ,rust-glib-0.9)
-        ("rust-glib-sys" ,rust-glib-sys-0.9)
-        ("rust-gobject-sys" ,rust-gobject-sys-0.9)
-        ("rust-itertools" ,rust-itertools-0.9)
-        ("rust-language-tags" ,rust-language-tags-0.2)
-        ("rust-libc" ,rust-libc-0.2)
-        ("rust-locale-config" ,rust-locale-config-0.3)
-        ("rust-markup5ever" ,rust-markup5ever-0.10)
-        ("rust-nalgebra" ,rust-nalgebra-0.21)
-        ("rust-num-traits" ,rust-num-traits-0.2)
-        ("rust-once-cell" ,rust-once-cell-1)
-        ("rust-pkg-config" ,rust-pkg-config-0.3)
-        ("rust-pango" ,rust-pango-0.8)
-        ("rust-pango-sys" ,rust-pango-sys-0.9)
-        ("rust-pangocairo" ,rust-pangocairo-0.9)
-        ("rust-rayon" ,rust-rayon-1)
-        ("rust-rctree" ,rust-rctree-0.3)
-        ("rust-rgb" ,rust-rgb-0.8)
-        ("rust-regex" ,rust-regex-1)
-        ("rust-selectors" ,rust-selectors-0.22)
-        ("rust-string-cache" ,rust-string-cache-0.8)
-        ("rust-tinyvec" ,rust-tinyvec-0.3)
-        ("rust-url" ,rust-url-2)
-        ("rust-xml5ever" ,rust-xml5ever-0.16))
        #:cargo-development-inputs
        (("rust-assert-cmd" ,rust-assert-cmd-1)
         ("rust-cairo-rs" ,rust-cairo-rs-0.8)
@@ -3621,7 +3584,43 @@ (define-public librsvg
            libcroco
            libgsf
            libxml2
-           pango))
+           pango
+           rust-bitflags-1
+           rust-cairo-rs-0.8
+           rust-cairo-sys-rs-0.9
+           rust-cast-0.2
+           rust-cssparser-0.27
+           rust-data-url-0.1
+           rust-encoding-0.2
+           rust-float-cmp-0.8
+           rust-gdk-pixbuf-0.8
+           rust-gdk-pixbuf-sys-0.9
+           rust-gio-0.8
+           rust-gio-sys-0.9
+           rust-glib-0.9
+           rust-glib-sys-0.9
+           rust-gobject-sys-0.9
+           rust-itertools-0.9
+           rust-language-tags-0.2
+           rust-libc-0.2
+           rust-locale-config-0.3
+           rust-markup5ever-0.10
+           rust-nalgebra-0.21
+           rust-num-traits-0.2
+           rust-once-cell-1
+           rust-pkg-config-0.3
+           rust-pango-0.8
+           rust-pango-sys-0.9
+           rust-pangocairo-0.9
+           rust-rayon-1
+           rust-rctree-0.3
+           rust-rgb-0.8
+           rust-regex-1
+           rust-selectors-0.22
+           rust-string-cache-0.8
+           rust-tinyvec-0.3
+           rust-url-2
+           rust-xml5ever-0.16))
     (propagated-inputs
      (list cairo gdk-pixbuf glib))
     (synopsis "SVG rendering library")
diff --git a/guix/build-system/cargo.scm b/guix/build-system/cargo.scm
index 60c35eed07..b2d97beb2f 100644
--- a/guix/build-system/cargo.scm
+++ b/guix/build-system/cargo.scm
@@ -125,17 +125,21 @@ (define builder
                     #:target #f
                     #:guile-for-build guile))
 
+(define (cargo-input? input)
+  (match input
+    ((label (? package? p))
+     (eq? cargo-build-system (package-build-system p)))
+    (_ #f)))
+
 (define (package-cargo-inputs p)
-  (apply
-    (lambda* (#:key (cargo-inputs '()) #:allow-other-keys)
-      cargo-inputs)
-    (package-arguments p)))
+  (match (member #:cargo-inputs (package-arguments p))
+    (#f (filter cargo-input? (package-inputs p)))
+    ((_ inputs . _) inputs)))
 
 (define (package-cargo-development-inputs p)
-  (apply
-    (lambda* (#:key (cargo-development-inputs '()) #:allow-other-keys)
-      cargo-development-inputs)
-    (package-arguments p)))
+  (match (member #:cargo-development-inputs (package-arguments p))
+    (#f (filter cargo-input? (package-native-inputs p)))
+    ((_ inputs . _) inputs)))
 
 (define (crate-closure inputs)
   "Return the closure of INPUTS when considering the 'cargo-inputs' and
@@ -235,8 +239,8 @@ (define (expand-crate-sources cargo-inputs cargo-development-inputs)
 (define* (lower name
                 #:key source inputs native-inputs outputs system target
                 (rust (default-rust))
-                (cargo-inputs '())
-                (cargo-development-inputs '())
+                (cargo-inputs (filter cargo-input? inputs))
+                (cargo-development-inputs (filter cargo-input? native-inputs))
                 #:allow-other-keys
                 #:rest arguments)
   "Return a bag for NAME."
@@ -260,7 +264,9 @@ (define private-keywords
          (build-inputs `(("cargo" ,rust "cargo")
                          ("rustc" ,rust)
                          ,@(expand-crate-sources cargo-inputs cargo-development-inputs)
-                         ,@native-inputs))
+                         ,@(if (eq? native-inputs cargo-development-inputs)
+                               '()
+                               native-inputs)))
          (outputs outputs)
          (build cargo-build)
          (arguments (strip-keyword-arguments private-keywords arguments)))))
diff --git a/guix/packages.scm b/guix/packages.scm
index b3c5a00011..275cc3675c 100644
--- a/guix/packages.scm
+++ b/guix/packages.scm
@@ -660,7 +660,8 @@ (define (deprecated-package old-name p)
     (name old-name)
     (properties `((superseded . ,p)))))
 
-(define (package-field-location package field)
+(define* (package-field-location package field
+                                 #:key (value-location? #t))
   "Return the source code location of the definition of FIELD for PACKAGE, or
 #f if it could not be determined."
   (match (package-location package)
@@ -678,7 +679,10 @@ (define (package-field-location package field)
                    (let ((field (assoc field inits)))
                      (match field
                        ((_ value)
-                        (let ((loc (and=> (source-properties value)
+                        (let ((loc (and=> (source-properties
+                                           (if value-location?
+                                               value
+                                               field))
                                           source-properties->location)))
                           (and loc
                                ;; Preserve the original file name, which may be a
diff --git a/guix/scripts/style.scm b/guix/scripts/style.scm
index 86a46f693c..dccc20d880 100644
--- a/guix/scripts/style.scm
+++ b/guix/scripts/style.scm
@@ -29,6 +29,7 @@
 
 (define-module (guix scripts style)
   #:autoload   (gnu packages) (specification->package fold-packages)
+  #:autoload   (guix build-system cargo) (cargo-build-system)
   #:use-module (guix scripts)
   #:use-module ((guix scripts build) #:select (%standard-build-options))
   #:use-module (guix combinators)
@@ -212,6 +213,21 @@ (define (object->string* obj indent)
       (pretty-print-with-comments port obj
                                   #:indent indent))))
 
+(define (object-list->string lst indent)
+  (call-with-output-string
+    (lambda (port)
+      (let loop ((lst lst))
+        (match lst
+          ((obj)
+           (pretty-print-with-comments port obj
+                                       #:indent indent))
+          ((obj rest ...)
+           (pretty-print-with-comments port obj
+                                       #:indent indent)
+           (newline port)
+           (display (make-string indent #\space) port)
+           (loop rest)))))))
+
 \f
 ;;;
 ;;; Simplifying input expressions.
@@ -441,6 +457,49 @@ (define matches?
             (list package-inputs package-native-inputs
                   package-propagated-inputs)))
 
+\f
+;;;
+;;; Crates, Cargo, Rust, and all that.
+;;;
+
+(define* (rewrite-cargo-inputs package
+                               #:key (policy 'silent)
+                               (edit-expression edit-expression))
+  (when (eq? (package-build-system package) cargo-build-system)
+    (match (package-field-location package 'arguments
+                                   #:value-location? #f)
+      (#f #f)
+      (location
+       (let* ((indent (location-column location)))
+         (edit-expression
+          (pk 'loc (location->source-properties location))
+          (lambda (str)
+            (define arguments
+              (call-with-input-string (pk 'str str) read-with-comments))
+
+            (match arguments
+              (('arguments ('quasiquote lst))
+               (let ((inputs (match (member #:cargo-inputs lst)
+                               (#f '())
+                               ((_ inputs . _) inputs)))
+                     (native (match (member #:cargo-development-inputs lst)
+                               (#f '())
+                               ((_ inputs . _) inputs)))
+                     (rest (strip-keyword-arguments
+                            '(#:cargo-inputs #:cargo-development-inputs)
+                            lst)))
+                 (object-list->string
+                  `(,@(if (null? rest)
+                          '()
+                          `((arguments ,(list 'quasiquote rest))))
+                    ,@(if (null? native)
+                          '()
+                          `((native-inputs ,(list 'quasiquote native))))
+                    ,@(if (null? inputs)
+                          '()
+                          `((inputs ,(list 'quasiquote inputs)))))
+                  indent)))))))))))
+
 (define (package-location<? p1 p2)
   "Return true if P1's location is \"before\" P2's."
   (let ((loc1 (package-location p1))
@@ -536,7 +595,7 @@ (define (parse-options)
                        edit-expression))
          (policy   (assoc-ref opts 'input-simplification-policy)))
     (for-each (lambda (package)
-                (simplify-package-inputs package #:policy policy
+                (rewrite-cargo-inputs package #:policy policy
                                          #:edit-expression edit))
               ;; Sort package by source code location so that we start editing
               ;; files from the bottom and going upward.  That way, the

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [bug#51845] Using ‘native-inputs’ and ‘inputs’ for Cargo packages?
  2021-12-07 10:11           ` Efraim Flashner
@ 2021-12-07 19:48             ` Ludovic Courtès
  0 siblings, 0 replies; 13+ messages in thread
From: Ludovic Courtès @ 2021-12-07 19:48 UTC (permalink / raw)
  To: Efraim Flashner; +Cc: 51845

Howdy!

Efraim Flashner <efraim@flashner.co.il> skribis:

> On Mon, Dec 06, 2021 at 11:17:47PM +0100, Ludovic Courtès wrote:

[...]

>> With the minimal changes to (guix build-system cargo) below, one can use
>> either the current style or pass “development inputs” as ‘native-inputs’
>> and other dependencies as ‘inputs’.  Source transitivity is preserved
>> but you can write packages the normal way.
>> 
>> I modified some of the dependencies of librsvg to use
>> native-inputs/inputs and you can see when applying this part of the
>> patch that the librsvg derivation is unchanged.  Good thing is that
>> ‘guix graph’ and ‘guix refresh -l’ work for these packages.
>> 
>> Is this a direction we want to take?
>
> I like the way it works out, and has Guix do the magic to give us the
> crates in the graph. On the other hand I tried changing the cargo-inputs
> from librsvg to regular inputs, and after 2.5 minutes of trying to run
> `guix show librsvg` I still wasn't seeing the dependencies and my RAM
> usage was still increasing. Also gnu/packages/gnome.scm didn't fail to
> compile, so there was no notice of the loop.

Notice that the dependency cycle, as discussed on IRC, breaks things
like ‘guix show’ (?) and ‘guix graph’, but doesn’t break actual package
builds because it’s a <package> cycle that vanishes once packages are
lowered to bags and derivations.

Regardless, it would be nice not to have cycles in the first place.

[...]

> So to summarize, between your diff to treat inputs built using
> cargo-build-system as cargo-inputs and my changes to save previous
> crates for the next input we reach a place where we can start to change
> the crates over to use inputs and native-inputs instead of cargo-inputs
> and cargo-development-inputs without needing to flip everything at once.

What are the “changes to save previous crates for the next input”?

> So I'd go with it's good, but I'm not sure it directly works to fix the
> problem we're having with librsvg.

No no, it’s completely unrelated to the librsvg issue, which is why I
changed subject lines.  :-)  I think it’d be nice to have anyway.

>> +(define (cargo-input? input)
>> +  (match input
>> +    ((label (? package? p))
>> +     (eq? cargo-build-system (package-build-system p)))
>> +    (_ #f)))
>> +
>
> I would've sorted based on the name starting with 'rust-'.

OK.

[...]

>>  (define (package-cargo-inputs p)
>> -  (apply
>> -    (lambda* (#:key (cargo-inputs '()) #:allow-other-keys)
>> -      cargo-inputs)
>> -    (package-arguments p)))
>> +  (match (member #:cargo-inputs (package-arguments p))
>> +    (#f (filter cargo-input? (package-inputs p)))
>> +    ((_ inputs . _) inputs)))
>>  
>>  (define (package-cargo-development-inputs p)
>> -  (apply
>> -    (lambda* (#:key (cargo-development-inputs '()) #:allow-other-keys)
>> -      cargo-development-inputs)
>> -    (package-arguments p)))
>> +  (match (member #:cargo-development-inputs (package-arguments p))
>> +    (#f (filter cargo-input? (package-native-inputs p)))
>> +    ((_ inputs . _) inputs)))
>
> I see we don't get rid of #:cargo-inputs or #:cargo-development-inputs.
> So even if applying the style change to all the crates causes circular
> dependency problems we can fall back to the current method. I ran into
> problems once I hit all the rust-bindgen crates.

Right.  Support for #:cargo-development-inputs and #:cargo-inputs is
here so we could have a smooth “upgrade” without breaking compatibility.

Anyway, I think the priority is to get ‘core-updates-frozen’, which
probably involves either pinning librsvg dependencies or using the
bundled libraries as you showed at the beginning of this thread.
We can resume work on prettified Rust packages after that; it’ll be
useful to be able to use ‘guix refresh -l’.

Ludo’.




^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2021-12-07 19:49 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-11-14 14:07 [bug#51845] [PATCH 0/2] Add librsvg-bootstrap Efraim Flashner
2021-11-14 14:14 ` [bug#51845] [PATCH 1/2] gnu: " Efraim Flashner
2021-11-14 14:14 ` [bug#51845] [PATCH 2/2] gnu: Use librsvg-bootstrap Efraim Flashner
2021-11-14 17:27 ` [bug#51845] [PATCH 0/2] Add librsvg-bootstrap Liliana Marie Prikler
2021-11-14 18:07   ` Efraim Flashner
2021-11-14 19:05     ` Liliana Marie Prikler
2021-12-06 12:17 ` Ludovic Courtès
2021-12-06 13:06   ` Efraim Flashner
2021-12-06 16:37     ` Ludovic Courtès
2021-12-06 17:02       ` Efraim Flashner
2021-12-06 22:17         ` [bug#51845] Using ‘native-inputs’ and ‘inputs’ for Cargo packages? Ludovic Courtès
2021-12-07 10:11           ` Efraim Flashner
2021-12-07 19:48             ` Ludovic Courtès

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/guix.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.