diff --git a/guix/build-system/cargo.scm b/guix/build-system/cargo.scm index 0e9a4b1d23..4d4740300d 100644 --- a/guix/build-system/cargo.scm +++ b/guix/build-system/cargo.scm @@ -5,7 +5,7 @@ ;;; Copyright © 2016 David Craven ;;; Copyright © 2019 Ivan Petkov ;;; Copyright © 2020 Jakub Kądziołka -;;; Copyright © 2021 Efraim Flashner +;;; Copyright © 2021, 2024 Efraim Flashner ;;; ;;; This file is part of GNU Guix. ;;; @@ -29,6 +29,7 @@ (define-module (guix build-system cargo) #:use-module (guix gexp) #:use-module (guix monads) #:use-module (guix packages) + #:use-module (guix platform) #:use-module (guix build-system) #:use-module (guix build-system gnu) #:use-module (ice-9 match) @@ -67,6 +68,11 @@ (define (default-rust-sysroot target) (let ((module (resolve-interface '(gnu packages rust)))) (module-ref module 'make-rust-sysroot))) +(define (cargo-triplet target) + (false-if-exception + (platform-rust-target + (lookup-platform-by-target-or-system target)))) + (define %cargo-utils-modules ;; Build-side modules imported by default. `((guix build cargo-utils) @@ -113,6 +119,7 @@ (define builder #:cargo-build-flags #$(sexp->gexp cargo-build-flags) #:cargo-test-flags #$(sexp->gexp cargo-test-flags) #:cargo-package-flags #$(sexp->gexp cargo-package-flags) + #:cargo-target #$(cargo-triplet system) #:features #$(sexp->gexp features) #:skip-build? #$skip-build? #:install-source? #$install-source? @@ -142,6 +149,7 @@ (define* (cargo-cross-build name (cargo-build-flags ''("--release")) (cargo-test-flags ''("--release")) (cargo-package-flags ''("--no-metadata" "--no-verify")) + (cargo-target (cargo-triplet (or target system))) (features ''()) (skip-build? #f) (install-source? (not (target-mingw? target))) @@ -170,6 +178,7 @@ (define builder #:cargo-build-flags #$(sexp->gexp cargo-build-flags) #:cargo-test-flags #$(sexp->gexp cargo-test-flags) #:cargo-package-flags #$(sexp->gexp cargo-package-flags) + #:cargo-target #$(cargo-triplet (or target system)) #:features #$(sexp->gexp features) #:skip-build? #$skip-build? #:install-source? #$install-source? @@ -313,7 +322,7 @@ (define* (lower name (define private-keywords `(#:rust #:inputs #:native-inputs #:outputs #:cargo-inputs #:cargo-development-inputs - #:rust-sysroot + #:rust-sysroot #:cargo-target ,@(if target '() '(#:target)))) (bag diff --git a/guix/build/cargo-build-system.scm b/guix/build/cargo-build-system.scm index 8dcbd461a8..132a811f49 100644 --- a/guix/build/cargo-build-system.scm +++ b/guix/build/cargo-build-system.scm @@ -120,6 +120,7 @@ (define* (check-for-pregenerated-files #:rest _) (define* (configure #:key inputs target system + cargo-target (vendor-dir "guix-vendor") #:allow-other-keys) "Vendor Cargo.toml dependencies as guix inputs." @@ -149,24 +150,7 @@ (define* (configure #:key inputs ;; For cross-building (when target - (setenv "CARGO_BUILD_TARGET" - ;; Can this be replaced with platform-rust-architecture? - ;; Keep this synchronized with (guix platforms *) - (match target - ("aarch64-linux-gnu" "aarch64-unknown-linux-gnu") - ("arm-linux-gnueabihf" "armv7-unknown-linux-gnueabihf") - ("i686-linux-gnu" "i686-unknown-linux-gnu") - ("mips64el-linux-gnu" "mips64el-unknown-linux-gnuabi64") - ("powerpc-linux-gnu" "powerpc-unknown-linux-gnu") - ("powerpc64-linux-gnu" "powerpc64-unknown-linux-gnu") - ("powerpc64le-linux-gnu" "powerpc64le-unknown-linux-gnu") - ("riscv64-linux-gnu" "riscv64gc-unknown-linux-gnu") - ("x86_64-linux-gnu" "x86_64-unknown-linux-gnu") - ("x86_64-linux-gnux32" "x86_64-unknown-linux-gnux32") - ("i586-pc-gnu" "i686-unknown-hurd-gnu") - ("i686-w64-mingw32" "i686-pc-windows-gnu") - ("x86_64-w64-mingw32" "x86_64-pc-windows-gnu") - (else #f))) + (setenv "CARGO_BUILD_TARGET" cargo-target) (setenv "RUSTFLAGS" (string-append (or (getenv "RUSTFLAGS") "") " --sysroot " (assoc-ref inputs "rust-sysroot")))