From afd268c46df2f7619ba39c80506751b88d89ee93 Mon Sep 17 00:00:00 2001 From: Puck Meerburg Date: Wed, 27 Nov 2024 14:22:48 +0000 Subject: [PATCH] (zilch lang rust): various workspace fixes --- lang/rust/src/registry.sld | 2 +- lang/rust/src/resolver.sld | 62 ++++++++++++++++++++++++++++++++------ 2 files changed, 53 insertions(+), 11 deletions(-) diff --git a/lang/rust/src/registry.sld b/lang/rust/src/registry.sld index 5d33bc9..e14c6fc 100644 --- a/lang/rust/src/registry.sld +++ b/lang/rust/src/registry.sld @@ -45,7 +45,7 @@ (lockfile-entry-dependencies entry))) (define (fetch-and-unpack-crate lockfile-entry) - (unless (string=? (lockfile-entry-source lockfile-entry) "registry+https://github.com/rust-lang/crates.io-index") (error "unknown source " (lockfile-entry-source lockfile-entry))) + (unless (equal? (lockfile-entry-source lockfile-entry) "registry+https://github.com/rust-lang/crates.io-index") (error "unknown source " lockfile-entry)) ; TODO(puck): hardcoded (define url (string-append "https://static.crates.io/crates/" (lockfile-entry-name lockfile-entry) "/" (lockfile-entry-version lockfile-entry) "/download")) diff --git a/lang/rust/src/resolver.sld b/lang/rust/src/resolver.sld index 1e28cc8..43c7cc7 100644 --- a/lang/rust/src/resolver.sld +++ b/lang/rust/src/resolver.sld @@ -30,7 +30,7 @@ resolver-resolve resolver-print-pkg resolver-print - process-cargo-with-lockfile + process-cargo-with-lockfile process-many-with-lockfile build-package) (begin @@ -82,6 +82,8 @@ ;; Download and activate a dependency from the registry. (define (resolver-download resolver name version) + (unless version + (error "Resolver wanted non-versioned download" name)) (define vfs (force (cddr (mapping-ref (mapping-ref (resolver-locked-dependencies resolver) name) (version-str version))))) (define-values (parsed-cargo parsed-workspace) (parse-cargo-toml vfs (call-with-port (store-path-open #~,(string-append #$vfs "/Cargo.toml")) (lambda (p) (read-string 99999999 p))) #f)) (unless (cargo-crate-lib-target parsed-cargo) @@ -146,26 +148,36 @@ to-activate)) ;; Register a non-registry crate+vfs with the resolver. - (define (resolver-register resolver vfs crate) + (define (resolver-register resolver vfs crate delayed) (define target (cargo-crate-lib-target crate)) (unless target + (when (null? (cargo-crate-targets crate)) + (error "Crate has _zero_ targets" crate)) (set! target (car (cargo-crate-targets crate)))) + (resolver-register-target resolver vfs crate target #f delayed)) + + ;; Register a non-registry crate+vfs with the resolver. + (define (resolver-register-target resolver vfs crate target extra-dependencies delayed) (define build-script #f) + (unless extra-dependencies + (set! extra-dependencies (mapping (make-default-comparator)))) (when (cargo-crate-build-script crate) (set! build-script (make-resolved-package (string-append (cargo-target-name target) "_build") (parse-version (cargo-crate-version crate)) vfs (cargo-crate-build-script crate) (cargo-crate-build-dependencies crate) crate '() (mapping (make-default-comparator)) #f #f)) (resolver-resolve-nonoptional resolver build-script)) - (define pkg (make-resolved-package (cargo-target-name target) (parse-version (cargo-crate-version crate)) vfs target (cargo-crate-dependencies crate) crate '() (mapping (make-default-comparator)) #f build-script)) - (define existing-mapping (mapping-ref/default (resolver-selected-dependencies resolver) (cargo-target-name target) '())) - (set-resolver-selected-dependencies! resolver (mapping-set (resolver-selected-dependencies resolver) (cargo-target-name target) (cons (cons (parse-version (cargo-crate-version crate)) pkg) existing-mapping))) - (resolver-resolve-nonoptional resolver pkg) + (define pkg (make-resolved-package (cargo-target-name target) (parse-version (cargo-crate-version crate)) vfs target (cargo-crate-dependencies crate) crate '() extra-dependencies #f build-script)) + (define existing-mapping (mapping-ref/default (resolver-selected-dependencies resolver) (cargo-crate-name crate) '())) + (unless (equal? 'bin (cargo-target-crate-type target)) + (set-resolver-selected-dependencies! resolver (mapping-set (resolver-selected-dependencies resolver) (cargo-crate-name crate) (cons (cons (parse-version (cargo-crate-version crate)) pkg) existing-mapping)))) + (unless delayed + (resolver-resolve-nonoptional resolver pkg)) pkg) ;; Resolves a , returning the . (define (resolver-resolve resolver dep) (define package-name (cargo-dependency-package dep)) - (define requirements (apply append (map parse-version-requirement (string-split (cargo-dependency-version dep) "," 'strict-infix)))) + (define requirements (apply append (map parse-version-requirement (if (cargo-dependency-version dep) (string-split (cargo-dependency-version dep) "," 'strict-infix) '())))) (define existing-mapping (mapping-ref/default (resolver-selected-dependencies resolver) package-name '())) - (define available-versions (mapping-ref (resolver-locked-dependencies resolver) package-name)) + (define available-versions (mapping-ref/default (resolver-locked-dependencies resolver) package-name #f)) (define (find-matching-version l best-version) (cond ((eq? l '()) best-version) @@ -173,6 +185,8 @@ (find-matching-version (cdr l) (if (and best-version (version crate ~S: ~S/~S/~S\n" crate-name dep-info metadata-file rlib-file) (set-resolved-package-build-data! resolved (make-resolved-package-build-data dep-info metadata rlib transitive-dependencies buildscript-metadata bin-flags)) - (list dep-info metadata rlib)) + rlib-file) (define (matches-requirements ver req) (if (eq? req '())