summary refs log tree commit diff
path: root/pkgs/build-support/rust/lib/default.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/build-support/rust/lib/default.nix')
-rw-r--r--pkgs/build-support/rust/lib/default.nix20
1 files changed, 20 insertions, 0 deletions
diff --git a/pkgs/build-support/rust/lib/default.nix b/pkgs/build-support/rust/lib/default.nix
index 2be0c256787..77397f9b722 100644
--- a/pkgs/build-support/rust/lib/default.nix
+++ b/pkgs/build-support/rust/lib/default.nix
@@ -15,6 +15,21 @@ rec {
     else if platform.isDarwin then "macos"
     else platform.parsed.kernel.name;
 
+  # https://doc.rust-lang.org/reference/conditional-compilation.html#target_family
+  toTargetFamily = platform:
+    if platform ? rustc.platform.target-family
+    then
+      (
+        # Since https://github.com/rust-lang/rust/pull/84072
+        # `target-family` is a list instead of single value.
+        let
+          f = platform.rustc.platform.target-family;
+        in
+        if builtins.isList f then f else [ f ]
+      )
+    else lib.optional platform.isUnix "unix"
+      ++ lib.optional platform.isWindows "windows";
+
   # Returns the name of the rust target, even if it is custom. Adjustments are
   # because rust has slightly different naming conventions than we do.
   toRustTarget = platform: let
@@ -38,4 +53,9 @@ rec {
     if platform ? rustc.platform
     then builtins.toFile (toRustTarget platform + ".json") (builtins.toJSON platform.rustc.platform)
     else toRustTarget platform;
+
+  # Returns true if the target is no_std
+  # https://github.com/rust-lang/rust/blob/2e44c17c12cec45b6a682b1e53a04ac5b5fcc9d2/src/bootstrap/config.rs#L415-L421
+  IsNoStdTarget = platform: let rustTarget = toRustTarget platform; in
+    builtins.any (t: lib.hasInfix t rustTarget) ["-none" "nvptx" "switch" "-uefi"];
 }