From 9351292799b1d6d25e2f23f5c6921750b22101f4 Mon Sep 17 00:00:00 2001 From: Paul-Nicolas Madelaine Date: Wed, 4 Dec 2024 00:43:16 +0100 Subject: [PATCH 1/6] fix build-dependencies resolution when cross-compiling --- crate2nix/Cargo.nix | 110 +++++++++--------- crate2nix/src/render.rs | 27 ++--- crate2nix/templates/Cargo.nix.tera | 6 +- crate2nix/templates/nix/crate2nix/default.nix | 48 ++++---- .../crate2nix/tests/dependencyDerivations.nix | 3 +- .../nix/crate2nix/tests/packageFeatures.nix | 3 +- .../bin_with_git_submodule_dep/Cargo.nix | 70 ++++++----- sample_projects/codegen/Cargo.nix | 64 +++++----- .../Cargo.lock | 21 ++++ .../Cargo.toml | 15 +++ .../alice/Cargo.toml | 7 ++ .../alice/src/main.rs | 1 + .../bob/Cargo.toml | 7 ++ .../bob/src/lib.rs | 2 + .../charlie/Cargo.toml | 4 + .../charlie/src/lib.rs | 0 .../default.nix | 6 + sample_projects/sub_dir_crates/Cargo.nix | 48 ++++---- tests.nix | 7 ++ 19 files changed, 276 insertions(+), 173 deletions(-) create mode 100644 sample_projects/cross_compile_build_dependencies/Cargo.lock create mode 100644 sample_projects/cross_compile_build_dependencies/Cargo.toml create mode 100644 sample_projects/cross_compile_build_dependencies/alice/Cargo.toml create mode 100644 sample_projects/cross_compile_build_dependencies/alice/src/main.rs create mode 100644 sample_projects/cross_compile_build_dependencies/bob/Cargo.toml create mode 100644 sample_projects/cross_compile_build_dependencies/bob/src/lib.rs create mode 100644 sample_projects/cross_compile_build_dependencies/charlie/Cargo.toml create mode 100644 sample_projects/cross_compile_build_dependencies/charlie/src/lib.rs create mode 100644 sample_projects/cross_compile_build_dependencies/default.nix diff --git a/crate2nix/Cargo.nix b/crate2nix/Cargo.nix index edc0ffe0..bdf786df 100644 --- a/crate2nix/Cargo.nix +++ b/crate2nix/Cargo.nix @@ -124,7 +124,7 @@ rec { { name = "winapi"; packageId = "winapi"; - target = { target, features }: ("windows" == target."os" or null); + target = {target, targetSpec, features}: ("windows" == targetSpec."os" or null); features = [ "consoleapi" "errhandlingapi" "fileapi" "handleapi" "processenv" ]; } ]; @@ -159,18 +159,18 @@ rec { { name = "hermit-abi"; packageId = "hermit-abi"; - target = { target, features }: ("hermit" == target."os" or null); + target = {target, targetSpec, features}: ("hermit" == targetSpec."os" or null); } { name = "libc"; packageId = "libc"; usesDefaultFeatures = false; - target = { target, features }: (target."unix" or false); + target = {target, targetSpec, features}: (targetSpec."unix" or false); } { name = "winapi"; packageId = "winapi"; - target = { target, features }: (target."windows" or false); + target = {target, targetSpec, features}: (targetSpec."windows" or false); features = [ "consoleapi" "processenv" "minwinbase" "minwindef" "winbase" ]; } ]; @@ -365,7 +365,7 @@ rec { name = "ansi_term"; packageId = "ansi_term"; optional = true; - target = { target, features }: (!(target."windows" or false)); + target = {target, targetSpec, features}: (!(targetSpec."windows" or false)); } { name = "atty"; @@ -446,22 +446,22 @@ rec { { name = "libc"; packageId = "libc"; - target = { target, features }: (stdenv.hostPlatform.rust.rustcTarget == "aarch64-linux-android"); + target = {target, targetSpec, features}: (target == "aarch64-linux-android"); } { name = "libc"; packageId = "libc"; - target = { target, features }: (("aarch64" == target."arch" or null) && ("linux" == target."os" or null)); + target = {target, targetSpec, features}: (("aarch64" == targetSpec."arch" or null) && ("linux" == targetSpec."os" or null)); } { name = "libc"; packageId = "libc"; - target = { target, features }: (("aarch64" == target."arch" or null) && ("apple" == target."vendor" or null)); + target = {target, targetSpec, features}: (("aarch64" == targetSpec."arch" or null) && ("apple" == targetSpec."vendor" or null)); } { name = "libc"; packageId = "libc"; - target = { target, features }: (("loongarch64" == target."arch" or null) && ("linux" == target."os" or null)); + target = {target, targetSpec, features}: (("loongarch64" == targetSpec."arch" or null) && ("linux" == targetSpec."os" or null)); } ]; @@ -993,7 +993,7 @@ rec { { name = "winapi-util"; packageId = "winapi-util"; - target = { target, features }: (target."windows" or false); + target = {target, targetSpec, features}: (targetSpec."windows" or false); } ]; features = { @@ -1460,29 +1460,29 @@ rec { { name = "fuchsia-cprng"; packageId = "fuchsia-cprng"; - target = { target, features }: ("fuchsia" == target."os" or null); + target = {target, targetSpec, features}: ("fuchsia" == targetSpec."os" or null); } { name = "libc"; packageId = "libc"; optional = true; - target = { target, features }: (target."unix" or false); + target = {target, targetSpec, features}: (targetSpec."unix" or false); } { name = "rand_core"; packageId = "rand_core 0.3.1"; usesDefaultFeatures = false; - target = { target, features }: ("sgx" == target."env" or null); + target = {target, targetSpec, features}: ("sgx" == targetSpec."env" or null); } { name = "rdrand"; packageId = "rdrand"; - target = { target, features }: ("sgx" == target."env" or null); + target = {target, targetSpec, features}: ("sgx" == targetSpec."env" or null); } { name = "winapi"; packageId = "winapi"; - target = { target, features }: (target."windows" or false); + target = {target, targetSpec, features}: (targetSpec."windows" or false); features = [ "minwindef" "ntsecapi" "profileapi" "winnt" ]; } ]; @@ -1700,7 +1700,7 @@ rec { { name = "winapi"; packageId = "winapi"; - target = { target, features }: (target."windows" or false); + target = {target, targetSpec, features}: (targetSpec."windows" or false); features = [ "std" "errhandlingapi" "winerror" "fileapi" "winbase" ]; } ]; @@ -1730,7 +1730,7 @@ rec { { name = "winapi-util"; packageId = "winapi-util"; - target = { target, features }: (target."windows" or false); + target = {target, targetSpec, features}: (targetSpec."windows" or false); } ]; @@ -1775,7 +1775,7 @@ rec { { name = "serde_derive"; packageId = "serde_derive"; - target = { target, features }: false; + target = {target, targetSpec, features}: false; } ]; devDependencies = [ @@ -1904,7 +1904,7 @@ rec { { name = "cpufeatures"; packageId = "cpufeatures"; - target = { target, features }: (("aarch64" == target."arch" or null) || ("x86_64" == target."arch" or null) || ("x86" == target."arch" or null)); + target = {target, targetSpec, features}: (("aarch64" == targetSpec."arch" or null) || ("x86_64" == targetSpec."arch" or null) || ("x86" == targetSpec."arch" or null)); } { name = "digest"; @@ -2671,7 +2671,7 @@ rec { { name = "winapi-util"; packageId = "winapi-util"; - target = { target, features }: (target."windows" or false); + target = {target, targetSpec, features}: (targetSpec."windows" or false); } ]; @@ -2688,12 +2688,12 @@ rec { { name = "winapi-i686-pc-windows-gnu"; packageId = "winapi-i686-pc-windows-gnu"; - target = { target, features }: (stdenv.hostPlatform.rust.rustcTarget == "i686-pc-windows-gnu"); + target = {target, targetSpec, features}: (target == "i686-pc-windows-gnu"); } { name = "winapi-x86_64-pc-windows-gnu"; packageId = "winapi-x86_64-pc-windows-gnu"; - target = { target, features }: (stdenv.hostPlatform.rust.rustcTarget == "x86_64-pc-windows-gnu"); + target = {target, targetSpec, features}: (target == "x86_64-pc-windows-gnu"); } ]; features = { @@ -2723,7 +2723,7 @@ rec { { name = "windows-sys"; packageId = "windows-sys"; - target = { target, features }: (target."windows" or false); + target = {target, targetSpec, features}: (targetSpec."windows" or false); features = [ "Win32_Foundation" "Win32_Storage_FileSystem" "Win32_System_Console" "Win32_System_SystemInformation" ]; } ]; @@ -2998,42 +2998,42 @@ rec { { name = "windows_aarch64_gnullvm"; packageId = "windows_aarch64_gnullvm"; - target = { target, features }: (stdenv.hostPlatform.rust.rustcTarget == "aarch64-pc-windows-gnullvm"); + target = {target, targetSpec, features}: (target == "aarch64-pc-windows-gnullvm"); } { name = "windows_aarch64_msvc"; packageId = "windows_aarch64_msvc"; - target = { target, features }: (("aarch64" == target."arch" or null) && ("msvc" == target."env" or null) && (!(target."windows_raw_dylib" or false))); + target = {target, targetSpec, features}: (("aarch64" == targetSpec."arch" or null) && ("msvc" == targetSpec."env" or null) && (!(targetSpec."windows_raw_dylib" or false))); } { name = "windows_i686_gnu"; packageId = "windows_i686_gnu"; - target = { target, features }: (("x86" == target."arch" or null) && ("gnu" == target."env" or null) && (!("llvm" == target."abi" or null)) && (!(target."windows_raw_dylib" or false))); + target = {target, targetSpec, features}: (("x86" == targetSpec."arch" or null) && ("gnu" == targetSpec."env" or null) && (!("llvm" == targetSpec."abi" or null)) && (!(targetSpec."windows_raw_dylib" or false))); } { name = "windows_i686_gnullvm"; packageId = "windows_i686_gnullvm"; - target = { target, features }: (stdenv.hostPlatform.rust.rustcTarget == "i686-pc-windows-gnullvm"); + target = {target, targetSpec, features}: (target == "i686-pc-windows-gnullvm"); } { name = "windows_i686_msvc"; packageId = "windows_i686_msvc"; - target = { target, features }: (("x86" == target."arch" or null) && ("msvc" == target."env" or null) && (!(target."windows_raw_dylib" or false))); + target = {target, targetSpec, features}: (("x86" == targetSpec."arch" or null) && ("msvc" == targetSpec."env" or null) && (!(targetSpec."windows_raw_dylib" or false))); } { name = "windows_x86_64_gnu"; packageId = "windows_x86_64_gnu"; - target = { target, features }: (("x86_64" == target."arch" or null) && ("gnu" == target."env" or null) && (!("llvm" == target."abi" or null)) && (!(target."windows_raw_dylib" or false))); + target = {target, targetSpec, features}: (("x86_64" == targetSpec."arch" or null) && ("gnu" == targetSpec."env" or null) && (!("llvm" == targetSpec."abi" or null)) && (!(targetSpec."windows_raw_dylib" or false))); } { name = "windows_x86_64_gnullvm"; packageId = "windows_x86_64_gnullvm"; - target = { target, features }: (stdenv.hostPlatform.rust.rustcTarget == "x86_64-pc-windows-gnullvm"); + target = {target, targetSpec, features}: (target == "x86_64-pc-windows-gnullvm"); } { name = "windows_x86_64_msvc"; packageId = "windows_x86_64_msvc"; - target = { target, features }: ((("x86_64" == target."arch" or null) || ("arm64ec" == target."arch" or null)) && ("msvc" == target."env" or null) && (!(target."windows_raw_dylib" or false))); + target = {target, targetSpec, features}: ((("x86_64" == targetSpec."arch" or null) || ("arm64ec" == targetSpec."arch" or null)) && ("msvc" == targetSpec."env" or null) && (!(targetSpec."windows_raw_dylib" or false))); } ]; @@ -3149,7 +3149,7 @@ rec { /* Target (platform) data for conditional dependencies. This corresponds roughly to what buildRustCrate is setting. */ - makeDefaultTarget = platform: { + makeDefaultTargetSpec = platform: { unix = platform.isUnix; windows = platform.isWindows; fuchsia = true; @@ -3369,12 +3369,12 @@ rec { , crateConfigs ? crates , buildRustCrateForPkgsFunc , runTests - , makeTarget ? makeDefaultTarget + , makeTargetSpec ? makeDefaultTargetSpec } @ args: assert (builtins.isAttrs crateConfigs); assert (builtins.isString packageId); assert (builtins.isList features); - assert (builtins.isAttrs (makeTarget stdenv.hostPlatform)); + assert (builtins.isAttrs (makeTargetSpec stdenv.hostPlatform)); assert (builtins.isBool runTests); let rootPackageId = packageId; @@ -3382,7 +3382,8 @@ rec { ( args // { inherit rootPackageId; - target = makeTarget stdenv.hostPlatform // { test = runTests; }; + target = stdenv.hostPlatform.rust.rustcTarget; + targetSpec = makeTargetSpec stdenv.hostPlatform // { test = runTests; }; } ); # Memoize built packages so that reappearing packages are only built once. @@ -3391,7 +3392,8 @@ rec { let self = { crates = lib.mapAttrs (packageId: value: buildByPackageIdForPkgsImpl self pkgs packageId) crateConfigs; - target = makeTarget stdenv.hostPlatform; + target = pkgs.stdenv.hostPlatform.rust.rustcTarget; + targetSpec = makeTargetSpec pkgs.stdenv.hostPlatform; build = mkBuiltByPackageIdByPkgs pkgs.buildPackages; }; in @@ -3409,7 +3411,7 @@ rec { dependencies = dependencyDerivations { inherit features; - inherit (self) target; + inherit (self) target targetSpec; buildByPackageId = depPackageId: # proc_macro crates must be compiled for the build architecture if crateConfigs.${depPackageId}.procMacro or false @@ -3422,7 +3424,7 @@ rec { buildDependencies = dependencyDerivations { inherit features; - inherit (self.build) target; + inherit (self.build) target targetSpec; buildByPackageId = depPackageId: self.build.crates.${depPackageId}; dependencies = crateConfig.buildDependencies or [ ]; @@ -3431,12 +3433,12 @@ rec { let buildDeps = filterEnabledDependencies { inherit features; - inherit (self) target; + inherit (self) target targetSpec; dependencies = crateConfig.dependencies or [ ] ++ devDependencies; }; hostDeps = filterEnabledDependencies { inherit features; - inherit (self.build) target; + inherit (self.build) target targetSpec; dependencies = crateConfig.buildDependencies or [ ]; }; in @@ -3490,13 +3492,14 @@ rec { , features , dependencies , target + , targetSpec }: assert (builtins.isList features); assert (builtins.isList dependencies); - assert (builtins.isAttrs target); + assert (builtins.isAttrs targetSpec); let enabledDependencies = filterEnabledDependencies { - inherit dependencies features target; + inherit dependencies features target targetSpec; }; depDerivation = dependency: buildByPackageId dependency.packageId; in @@ -3515,7 +3518,7 @@ rec { else val; /* Returns various tools to debug a crate. */ - debugCrate = { packageId, target ? makeDefaultTarget stdenv.hostPlatform }: + debugCrate = { packageId, target ? stdenv.hostPlatform.rust.rustcTarget, targetSpec ? makeDefaultTargetSpec stdenv.hostPlatform }: assert (builtins.isString packageId); let debug = rec { @@ -3538,10 +3541,10 @@ rec { ); mergedPackageFeatures = mergePackageFeatures { features = rootFeatures; - inherit packageId target; + inherit packageId target targetSpec; }; diffedDefaultPackageFeatures = diffDefaultPackageFeatures { - inherit packageId target; + inherit packageId target targetSpec; }; }; in @@ -3556,6 +3559,7 @@ rec { { crateConfigs ? crates , packageId , target + , targetSpec }: assert (builtins.isAttrs crateConfigs); let @@ -3563,7 +3567,7 @@ rec { mergedFeatures = prefixValues "crate2nix" - (mergePackageFeatures { inherit crateConfigs packageId target; features = [ "default" ]; }); + (mergePackageFeatures { inherit crateConfigs packageId target targetSpec; features = [ "default" ]; }); configs = prefixValues "cargo" crateConfigs; combined = lib.foldAttrs (a: b: a // b) { } [ mergedFeatures configs ]; onlyInCargo = @@ -3598,6 +3602,7 @@ rec { , dependencyPath ? [ crates.${packageId}.crateName ] , featuresByPackageId ? { } , target + , targetSpec # Adds devDependencies to the crate with rootPackageId. , runTests ? false , ... @@ -3608,7 +3613,7 @@ rec { assert (builtins.isList features); assert (builtins.isList dependencyPath); assert (builtins.isAttrs featuresByPackageId); - assert (builtins.isAttrs target); + assert (builtins.isAttrs targetSpec); assert (builtins.isBool runTests); let crateConfig = crateConfigs."${packageId}" or (builtins.throw "Package not found: ${packageId}"); @@ -3625,7 +3630,7 @@ rec { assert (builtins.isList dependencies); let enabledDependencies = filterEnabledDependencies { - inherit dependencies target; + inherit dependencies target targetSpec; features = enabledFeatures; }; directDependencies = map depWithResolvedFeatures enabledDependencies; @@ -3644,7 +3649,7 @@ rec { mergePackageFeatures { features = combinedFeatures; featuresByPackageId = cache; - inherit crateConfigs packageId target runTests rootPackageId; + inherit crateConfigs packageId target targetSpec runTests rootPackageId; } ); cacheWithSelf = @@ -3671,10 +3676,11 @@ rec { cacheWithAll; /* Returns the enabled dependencies given the enabled features. */ - filterEnabledDependencies = { dependencies, features, target }: + filterEnabledDependencies = { dependencies, features, target, targetSpec }: assert (builtins.isList dependencies); assert (builtins.isList features); - assert (builtins.isAttrs target); + assert (builtins.isString target); + assert (builtins.isAttrs targetSpec); lib.filter ( @@ -3682,7 +3688,7 @@ rec { let targetFunc = dep.target or (features: true); in - targetFunc { inherit features target; } + targetFunc { inherit features target targetSpec; } && ( !(dep.optional or false) || builtins.any (doesFeatureEnableDependency dep) features diff --git a/crate2nix/src/render.rs b/crate2nix/src/render.rs index bb878d3f..aa7b2bbb 100644 --- a/crate2nix/src/render.rs +++ b/crate2nix/src/render.rs @@ -184,10 +184,7 @@ fn cfg_to_nix_expr_filter( })?; Ok(tera::Value::String(cfg_to_nix_expr(&expr))) } else { - let condition = format!( - "(stdenv.hostPlatform.rust.rustcTarget == {})", - escape_nix_string(key) - ); + let condition = format!("(target == {})", escape_nix_string(key)); Ok(tera::Value::String(condition)) } } @@ -207,7 +204,7 @@ fn cfg_to_nix_expr(cfg: &CfgExpr) -> String { fn render(result: &mut String, cfg: &CfgExpr) { match cfg { CfgExpr::Value(Cfg::Name(name)) => { - result.push_str(&format!("(target.{} or false)", target(name))); + result.push_str(&format!("(targetSpec.{} or false)", target(name))); } CfgExpr::Value(Cfg::KeyPair(key, value)) => { let escaped_value = escape_nix_string(value); @@ -216,9 +213,13 @@ fn cfg_to_nix_expr(cfg: &CfgExpr) -> String { } else if key == "target_feature" { format!("(builtins.elem {} targetFeatures)", escaped_value) } else if key == "target_family" { - format!("(builtins.elem {} target.{})", escaped_value, target(key)) + format!( + "(builtins.elem {} targetSpec.{})", + escaped_value, + target(key) + ) } else { - format!("({} == target.{} or null)", escaped_value, target(key)) + format!("({} == targetSpec.{} or null)", escaped_value, target(key)) }); } CfgExpr::Not(expr) => { @@ -271,7 +272,7 @@ fn test_render_cfg_to_nix_expr() { } assert_eq!( - "(target.\"unix\" or false)", + "(targetSpec.\"unix\" or false)", &cfg_to_nix_expr(&name("unix")) ); assert_eq!( @@ -282,23 +283,23 @@ fn test_render_cfg_to_nix_expr() { ])) ); assert_eq!( - "(builtins.elem \"unix\" target.\"family\")", + "(builtins.elem \"unix\" targetSpec.\"family\")", &cfg_to_nix_expr(&kv("target_family", "unix")) ); assert_eq!( - "(\"linux\" == target.\"os\" or null)", + "(\"linux\" == targetSpec.\"os\" or null)", &cfg_to_nix_expr(&kv("target_os", "linux")) ); assert_eq!( - "(!(\"linux\" == target.\"os\" or null))", + "(!(\"linux\" == targetSpec.\"os\" or null))", &cfg_to_nix_expr(&CfgExpr::Not(Box::new(kv("target_os", "linux")))) ); assert_eq!( - "((target.\"unix\" or false) || (\"linux\" == target.\"os\" or null))", + "((targetSpec.\"unix\" or false) || (\"linux\" == targetSpec.\"os\" or null))", &cfg_to_nix_expr(&CfgExpr::Any(vec![name("unix"), kv("target_os", "linux")])) ); assert_eq!( - "((target.\"unix\" or false) && (\"linux\" == target.\"os\" or null))", + "((targetSpec.\"unix\" or false) && (\"linux\" == targetSpec.\"os\" or null))", &cfg_to_nix_expr(&CfgExpr::All(vec![name("unix"), kv("target_os", "linux")])) ); assert_eq!("true", &cfg_to_nix_expr(&CfgExpr::All(vec![]))); diff --git a/crate2nix/templates/Cargo.nix.tera b/crate2nix/templates/Cargo.nix.tera index 8c89935e..ccbea9da 100644 --- a/crate2nix/templates/Cargo.nix.tera +++ b/crate2nix/templates/Cargo.nix.tera @@ -195,7 +195,7 @@ rec { usesDefaultFeatures = false; {%- endif -%} {%- if dependency.target %} - target = { target, features }: {{dependency.target | cfg_to_nix_expr | safe }}; + target = {target, targetSpec, features}: {{dependency.target | cfg_to_nix_expr | safe}}; {%- endif %} {%- if dependency.features %} features = [ {% for feature in dependency.features %}{{feature}} {% endfor %}]; @@ -221,7 +221,7 @@ rec { usesDefaultFeatures = false; {%- endif -%} {%- if dependency.target %} - target = {target, features}: {{dependency.target | cfg_to_nix_expr | safe }}; + target = {target, targetSpec, features}: {{dependency.target | cfg_to_nix_expr | safe}}; {%- endif %} {%- if dependency.features %} features = [ {% for feature in dependency.features %}{{feature}} {% endfor %}]; @@ -246,7 +246,7 @@ rec { usesDefaultFeatures = false; {%- endif -%} {%- if dependency.target %} - target = {target, features}: {{dependency.target | cfg_to_nix_expr | safe }}; + target = {target, targetSpec, features}: {{dependency.target | cfg_to_nix_expr | safe}}; {%- endif %} {%- if dependency.features %} features = [ {% for feature in dependency.features %}{{feature}} {% endfor %}]; diff --git a/crate2nix/templates/nix/crate2nix/default.nix b/crate2nix/templates/nix/crate2nix/default.nix index 90e10c66..4681d39e 100644 --- a/crate2nix/templates/nix/crate2nix/default.nix +++ b/crate2nix/templates/nix/crate2nix/default.nix @@ -21,7 +21,7 @@ rec { /* Target (platform) data for conditional dependencies. This corresponds roughly to what buildRustCrate is setting. */ - makeDefaultTarget = platform: { + makeDefaultTargetSpec = platform: { unix = platform.isUnix; windows = platform.isWindows; fuchsia = true; @@ -241,12 +241,12 @@ rec { , crateConfigs ? crates , buildRustCrateForPkgsFunc , runTests - , makeTarget ? makeDefaultTarget + , makeTargetSpec ? makeDefaultTargetSpec } @ args: assert (builtins.isAttrs crateConfigs); assert (builtins.isString packageId); assert (builtins.isList features); - assert (builtins.isAttrs (makeTarget stdenv.hostPlatform)); + assert (builtins.isAttrs (makeTargetSpec stdenv.hostPlatform)); assert (builtins.isBool runTests); let rootPackageId = packageId; @@ -254,7 +254,8 @@ rec { ( args // { inherit rootPackageId; - target = makeTarget stdenv.hostPlatform // { test = runTests; }; + target = stdenv.hostPlatform.rust.rustcTarget; + targetSpec = makeTargetSpec stdenv.hostPlatform // { test = runTests; }; } ); # Memoize built packages so that reappearing packages are only built once. @@ -263,7 +264,8 @@ rec { let self = { crates = lib.mapAttrs (packageId: value: buildByPackageIdForPkgsImpl self pkgs packageId) crateConfigs; - target = makeTarget stdenv.hostPlatform; + target = pkgs.stdenv.hostPlatform.rust.rustcTarget; + targetSpec = makeTargetSpec pkgs.stdenv.hostPlatform; build = mkBuiltByPackageIdByPkgs pkgs.buildPackages; }; in @@ -281,7 +283,7 @@ rec { dependencies = dependencyDerivations { inherit features; - inherit (self) target; + inherit (self) target targetSpec; buildByPackageId = depPackageId: # proc_macro crates must be compiled for the build architecture if crateConfigs.${depPackageId}.procMacro or false @@ -294,7 +296,7 @@ rec { buildDependencies = dependencyDerivations { inherit features; - inherit (self.build) target; + inherit (self.build) target targetSpec; buildByPackageId = depPackageId: self.build.crates.${depPackageId}; dependencies = crateConfig.buildDependencies or [ ]; @@ -303,12 +305,12 @@ rec { let buildDeps = filterEnabledDependencies { inherit features; - inherit (self) target; + inherit (self) target targetSpec; dependencies = crateConfig.dependencies or [ ] ++ devDependencies; }; hostDeps = filterEnabledDependencies { inherit features; - inherit (self.build) target; + inherit (self.build) target targetSpec; dependencies = crateConfig.buildDependencies or [ ]; }; in @@ -362,13 +364,14 @@ rec { , features , dependencies , target + , targetSpec }: assert (builtins.isList features); assert (builtins.isList dependencies); - assert (builtins.isAttrs target); + assert (builtins.isAttrs targetSpec); let enabledDependencies = filterEnabledDependencies { - inherit dependencies features target; + inherit dependencies features target targetSpec; }; depDerivation = dependency: buildByPackageId dependency.packageId; in @@ -387,7 +390,7 @@ rec { else val; /* Returns various tools to debug a crate. */ - debugCrate = { packageId, target ? makeDefaultTarget stdenv.hostPlatform }: + debugCrate = { packageId, target ? stdenv.hostPlatform.rust.rustcTarget, targetSpec ? makeDefaultTargetSpec stdenv.hostPlatform }: assert (builtins.isString packageId); let debug = rec { @@ -410,10 +413,10 @@ rec { ); mergedPackageFeatures = mergePackageFeatures { features = rootFeatures; - inherit packageId target; + inherit packageId target targetSpec; }; diffedDefaultPackageFeatures = diffDefaultPackageFeatures { - inherit packageId target; + inherit packageId target targetSpec; }; }; in @@ -428,6 +431,7 @@ rec { { crateConfigs ? crates , packageId , target + , targetSpec }: assert (builtins.isAttrs crateConfigs); let @@ -435,7 +439,7 @@ rec { mergedFeatures = prefixValues "crate2nix" - (mergePackageFeatures { inherit crateConfigs packageId target; features = [ "default" ]; }); + (mergePackageFeatures { inherit crateConfigs packageId target targetSpec; features = [ "default" ]; }); configs = prefixValues "cargo" crateConfigs; combined = lib.foldAttrs (a: b: a // b) { } [ mergedFeatures configs ]; onlyInCargo = @@ -470,6 +474,7 @@ rec { , dependencyPath ? [ crates.${packageId}.crateName ] , featuresByPackageId ? { } , target + , targetSpec # Adds devDependencies to the crate with rootPackageId. , runTests ? false , ... @@ -480,7 +485,7 @@ rec { assert (builtins.isList features); assert (builtins.isList dependencyPath); assert (builtins.isAttrs featuresByPackageId); - assert (builtins.isAttrs target); + assert (builtins.isAttrs targetSpec); assert (builtins.isBool runTests); let crateConfig = crateConfigs."${packageId}" or (builtins.throw "Package not found: ${packageId}"); @@ -497,7 +502,7 @@ rec { assert (builtins.isList dependencies); let enabledDependencies = filterEnabledDependencies { - inherit dependencies target; + inherit dependencies target targetSpec; features = enabledFeatures; }; directDependencies = map depWithResolvedFeatures enabledDependencies; @@ -516,7 +521,7 @@ rec { mergePackageFeatures { features = combinedFeatures; featuresByPackageId = cache; - inherit crateConfigs packageId target runTests rootPackageId; + inherit crateConfigs packageId target targetSpec runTests rootPackageId; } ); cacheWithSelf = @@ -543,10 +548,11 @@ rec { cacheWithAll; /* Returns the enabled dependencies given the enabled features. */ - filterEnabledDependencies = { dependencies, features, target }: + filterEnabledDependencies = { dependencies, features, target, targetSpec }: assert (builtins.isList dependencies); assert (builtins.isList features); - assert (builtins.isAttrs target); + assert (builtins.isString target); + assert (builtins.isAttrs targetSpec); lib.filter ( @@ -554,7 +560,7 @@ rec { let targetFunc = dep.target or (features: true); in - targetFunc { inherit features target; } + targetFunc { inherit features target targetSpec; } && ( !(dep.optional or false) || builtins.any (doesFeatureEnableDependency dep) features diff --git a/crate2nix/templates/nix/crate2nix/tests/dependencyDerivations.nix b/crate2nix/templates/nix/crate2nix/tests/dependencyDerivations.nix index 1986416d..b01bf98b 100644 --- a/crate2nix/templates/nix/crate2nix/tests/dependencyDerivations.nix +++ b/crate2nix/templates/nix/crate2nix/tests/dependencyDerivations.nix @@ -24,7 +24,8 @@ let dependencyDerivations = features: dependencies: crate2nix.dependencyDerivations { buildByPackageId = p: fakeCrates.${p}; - target = crate2nix.makeDefaultTarget stdenv.hostPlatform; + target = stdenv.hostPlatform.rust.rustcTarget; + targetSpec = crate2nix.makeDefaultTargetSpec stdenv.hostPlatform; inherit features dependencies; }; in diff --git a/crate2nix/templates/nix/crate2nix/tests/packageFeatures.nix b/crate2nix/templates/nix/crate2nix/tests/packageFeatures.nix index 12c41d4d..9d7b3dff 100644 --- a/crate2nix/templates/nix/crate2nix/tests/packageFeatures.nix +++ b/crate2nix/templates/nix/crate2nix/tests/packageFeatures.nix @@ -87,7 +87,8 @@ let packageId: features: crate2nix.mergePackageFeatures { - target = crate2nix.makeDefaultTarget stdenv.hostPlatform; + target = stdenv.hostPlatform.rust.rustcTarget; + targetSpec = crate2nix.makeDefaultTargetSpec stdenv.hostPlatform; runTests = false; rootPackageId = packageId; inherit crateConfigs packageId features; diff --git a/sample_projects/bin_with_git_submodule_dep/Cargo.nix b/sample_projects/bin_with_git_submodule_dep/Cargo.nix index e731beef..8721f760 100644 --- a/sample_projects/bin_with_git_submodule_dep/Cargo.nix +++ b/sample_projects/bin_with_git_submodule_dep/Cargo.nix @@ -280,7 +280,7 @@ rec { name = "libc"; packageId = "libc"; usesDefaultFeatures = false; - target = { target, features }: (target."unix" or false); + target = {target, targetSpec, features}: (targetSpec."unix" or false); } ]; features = { @@ -404,7 +404,7 @@ rec { { name = "libc"; packageId = "libc"; - target = { target, features }: (target."unix" or false); + target = {target, targetSpec, features}: (targetSpec."unix" or false); } ]; @@ -465,12 +465,12 @@ rec { { name = "cfg-if"; packageId = "cfg-if"; - target = { target, features }: (target."unix" or false); + target = {target, targetSpec, features}: (targetSpec."unix" or false); } { name = "windows-sys"; packageId = "windows-sys"; - target = { target, features }: (target."windows" or false); + target = {target, targetSpec, features}: (targetSpec."windows" or false); features = [ "Win32_Foundation" "Win32_System_Diagnostics_Debug" "Win32_System_LibraryLoader" ]; } ]; @@ -1253,37 +1253,37 @@ rec { { name = "windows_aarch64_gnullvm"; packageId = "windows_aarch64_gnullvm"; - target = { target, features }: (stdenv.hostPlatform.rust.rustcTarget == "aarch64-pc-windows-gnullvm"); + target = {target, targetSpec, features}: (target == "aarch64-pc-windows-gnullvm"); } { name = "windows_aarch64_msvc"; packageId = "windows_aarch64_msvc"; - target = { target, features }: (("aarch64" == target."arch" or null) && ("msvc" == target."env" or null) && (!(target."windows_raw_dylib" or false))); + target = {target, targetSpec, features}: (("aarch64" == targetSpec."arch" or null) && ("msvc" == targetSpec."env" or null) && (!(targetSpec."windows_raw_dylib" or false))); } { name = "windows_i686_gnu"; packageId = "windows_i686_gnu"; - target = { target, features }: (("x86" == target."arch" or null) && ("gnu" == target."env" or null) && (!(target."windows_raw_dylib" or false))); + target = {target, targetSpec, features}: (("x86" == targetSpec."arch" or null) && ("gnu" == targetSpec."env" or null) && (!(targetSpec."windows_raw_dylib" or false))); } { name = "windows_i686_msvc"; packageId = "windows_i686_msvc"; - target = { target, features }: (("x86" == target."arch" or null) && ("msvc" == target."env" or null) && (!(target."windows_raw_dylib" or false))); + target = {target, targetSpec, features}: (("x86" == targetSpec."arch" or null) && ("msvc" == targetSpec."env" or null) && (!(targetSpec."windows_raw_dylib" or false))); } { name = "windows_x86_64_gnu"; packageId = "windows_x86_64_gnu"; - target = { target, features }: (("x86_64" == target."arch" or null) && ("gnu" == target."env" or null) && (!("llvm" == target."abi" or null)) && (!(target."windows_raw_dylib" or false))); + target = {target, targetSpec, features}: (("x86_64" == targetSpec."arch" or null) && ("gnu" == targetSpec."env" or null) && (!("llvm" == targetSpec."abi" or null)) && (!(targetSpec."windows_raw_dylib" or false))); } { name = "windows_x86_64_gnullvm"; packageId = "windows_x86_64_gnullvm"; - target = { target, features }: (stdenv.hostPlatform.rust.rustcTarget == "x86_64-pc-windows-gnullvm"); + target = {target, targetSpec, features}: (target == "x86_64-pc-windows-gnullvm"); } { name = "windows_x86_64_msvc"; packageId = "windows_x86_64_msvc"; - target = { target, features }: (("x86_64" == target."arch" or null) && ("msvc" == target."env" or null) && (!(target."windows_raw_dylib" or false))); + target = {target, targetSpec, features}: (("x86_64" == targetSpec."arch" or null) && ("msvc" == targetSpec."env" or null) && (!(targetSpec."windows_raw_dylib" or false))); } ]; @@ -1367,7 +1367,7 @@ rec { /* Target (platform) data for conditional dependencies. This corresponds roughly to what buildRustCrate is setting. */ - makeDefaultTarget = platform: { + makeDefaultTargetSpec = platform: { unix = platform.isUnix; windows = platform.isWindows; fuchsia = true; @@ -1587,12 +1587,12 @@ rec { , crateConfigs ? crates , buildRustCrateForPkgsFunc , runTests - , makeTarget ? makeDefaultTarget + , makeTargetSpec ? makeDefaultTargetSpec } @ args: assert (builtins.isAttrs crateConfigs); assert (builtins.isString packageId); assert (builtins.isList features); - assert (builtins.isAttrs (makeTarget stdenv.hostPlatform)); + assert (builtins.isAttrs (makeTargetSpec stdenv.hostPlatform)); assert (builtins.isBool runTests); let rootPackageId = packageId; @@ -1600,7 +1600,8 @@ rec { ( args // { inherit rootPackageId; - target = makeTarget stdenv.hostPlatform // { test = runTests; }; + target = stdenv.hostPlatform.rust.rustcTarget; + targetSpec = makeTargetSpec stdenv.hostPlatform // { test = runTests; }; } ); # Memoize built packages so that reappearing packages are only built once. @@ -1609,7 +1610,8 @@ rec { let self = { crates = lib.mapAttrs (packageId: value: buildByPackageIdForPkgsImpl self pkgs packageId) crateConfigs; - target = makeTarget stdenv.hostPlatform; + target = pkgs.stdenv.hostPlatform.rust.rustcTarget; + targetSpec = makeTargetSpec pkgs.stdenv.hostPlatform; build = mkBuiltByPackageIdByPkgs pkgs.buildPackages; }; in @@ -1627,7 +1629,7 @@ rec { dependencies = dependencyDerivations { inherit features; - inherit (self) target; + inherit (self) target targetSpec; buildByPackageId = depPackageId: # proc_macro crates must be compiled for the build architecture if crateConfigs.${depPackageId}.procMacro or false @@ -1640,7 +1642,7 @@ rec { buildDependencies = dependencyDerivations { inherit features; - inherit (self.build) target; + inherit (self.build) target targetSpec; buildByPackageId = depPackageId: self.build.crates.${depPackageId}; dependencies = crateConfig.buildDependencies or [ ]; @@ -1649,12 +1651,12 @@ rec { let buildDeps = filterEnabledDependencies { inherit features; - inherit (self) target; + inherit (self) target targetSpec; dependencies = crateConfig.dependencies or [ ] ++ devDependencies; }; hostDeps = filterEnabledDependencies { inherit features; - inherit (self.build) target; + inherit (self.build) target targetSpec; dependencies = crateConfig.buildDependencies or [ ]; }; in @@ -1708,13 +1710,14 @@ rec { , features , dependencies , target + , targetSpec }: assert (builtins.isList features); assert (builtins.isList dependencies); - assert (builtins.isAttrs target); + assert (builtins.isAttrs targetSpec); let enabledDependencies = filterEnabledDependencies { - inherit dependencies features target; + inherit dependencies features target targetSpec; }; depDerivation = dependency: buildByPackageId dependency.packageId; in @@ -1733,7 +1736,7 @@ rec { else val; /* Returns various tools to debug a crate. */ - debugCrate = { packageId, target ? makeDefaultTarget stdenv.hostPlatform }: + debugCrate = { packageId, target ? stdenv.hostPlatform.rust.rustcTarget, targetSpec ? makeDefaultTargetSpec stdenv.hostPlatform }: assert (builtins.isString packageId); let debug = rec { @@ -1756,10 +1759,10 @@ rec { ); mergedPackageFeatures = mergePackageFeatures { features = rootFeatures; - inherit packageId target; + inherit packageId target targetSpec; }; diffedDefaultPackageFeatures = diffDefaultPackageFeatures { - inherit packageId target; + inherit packageId target targetSpec; }; }; in @@ -1774,6 +1777,7 @@ rec { { crateConfigs ? crates , packageId , target + , targetSpec }: assert (builtins.isAttrs crateConfigs); let @@ -1781,7 +1785,7 @@ rec { mergedFeatures = prefixValues "crate2nix" - (mergePackageFeatures { inherit crateConfigs packageId target; features = [ "default" ]; }); + (mergePackageFeatures { inherit crateConfigs packageId target targetSpec; features = [ "default" ]; }); configs = prefixValues "cargo" crateConfigs; combined = lib.foldAttrs (a: b: a // b) { } [ mergedFeatures configs ]; onlyInCargo = @@ -1816,6 +1820,7 @@ rec { , dependencyPath ? [ crates.${packageId}.crateName ] , featuresByPackageId ? { } , target + , targetSpec # Adds devDependencies to the crate with rootPackageId. , runTests ? false , ... @@ -1826,7 +1831,7 @@ rec { assert (builtins.isList features); assert (builtins.isList dependencyPath); assert (builtins.isAttrs featuresByPackageId); - assert (builtins.isAttrs target); + assert (builtins.isAttrs targetSpec); assert (builtins.isBool runTests); let crateConfig = crateConfigs."${packageId}" or (builtins.throw "Package not found: ${packageId}"); @@ -1843,7 +1848,7 @@ rec { assert (builtins.isList dependencies); let enabledDependencies = filterEnabledDependencies { - inherit dependencies target; + inherit dependencies target targetSpec; features = enabledFeatures; }; directDependencies = map depWithResolvedFeatures enabledDependencies; @@ -1862,7 +1867,7 @@ rec { mergePackageFeatures { features = combinedFeatures; featuresByPackageId = cache; - inherit crateConfigs packageId target runTests rootPackageId; + inherit crateConfigs packageId target targetSpec runTests rootPackageId; } ); cacheWithSelf = @@ -1889,10 +1894,11 @@ rec { cacheWithAll; /* Returns the enabled dependencies given the enabled features. */ - filterEnabledDependencies = { dependencies, features, target }: + filterEnabledDependencies = { dependencies, features, target, targetSpec }: assert (builtins.isList dependencies); assert (builtins.isList features); - assert (builtins.isAttrs target); + assert (builtins.isString target); + assert (builtins.isAttrs targetSpec); lib.filter ( @@ -1900,7 +1906,7 @@ rec { let targetFunc = dep.target or (features: true); in - targetFunc { inherit features target; } + targetFunc { inherit features target targetSpec; } && ( !(dep.optional or false) || builtins.any (doesFeatureEnableDependency dep) features diff --git a/sample_projects/codegen/Cargo.nix b/sample_projects/codegen/Cargo.nix index 8ff30078..5aa2861c 100644 --- a/sample_projects/codegen/Cargo.nix +++ b/sample_projects/codegen/Cargo.nix @@ -99,7 +99,7 @@ rec { { name = "winapi"; packageId = "winapi"; - target = { target, features }: ("windows" == target."os" or null); + target = {target, targetSpec, features}: ("windows" == targetSpec."os" or null); features = [ "consoleapi" "errhandlingapi" "fileapi" "handleapi" "processenv" ]; } ]; @@ -120,18 +120,18 @@ rec { { name = "hermit-abi"; packageId = "hermit-abi"; - target = { target, features }: ("hermit" == target."os" or null); + target = {target, targetSpec, features}: ("hermit" == targetSpec."os" or null); } { name = "libc"; packageId = "libc"; usesDefaultFeatures = false; - target = { target, features }: (target."unix" or false); + target = {target, targetSpec, features}: (targetSpec."unix" or false); } { name = "winapi"; packageId = "winapi"; - target = { target, features }: (target."windows" or false); + target = {target, targetSpec, features}: (targetSpec."windows" or false); features = [ "consoleapi" "processenv" "minwinbase" "minwindef" "winbase" ]; } ]; @@ -165,7 +165,7 @@ rec { name = "ansi_term"; packageId = "ansi_term"; optional = true; - target = { target, features }: (!(target."windows" or false)); + target = {target, targetSpec, features}: (!(targetSpec."windows" or false)); } { name = "atty"; @@ -266,7 +266,7 @@ rec { { name = "winapi"; packageId = "winapi"; - target = { target, features }: (target."windows" or false); + target = {target, targetSpec, features}: (targetSpec."windows" or false); features = [ "winsock2" ]; } ]; @@ -488,12 +488,12 @@ rec { { name = "winapi-i686-pc-windows-gnu"; packageId = "winapi-i686-pc-windows-gnu"; - target = { target, features }: (stdenv.hostPlatform.rust.rustcTarget == "i686-pc-windows-gnu"); + target = {target, targetSpec, features}: (target == "i686-pc-windows-gnu"); } { name = "winapi-x86_64-pc-windows-gnu"; packageId = "winapi-x86_64-pc-windows-gnu"; - target = { target, features }: (stdenv.hostPlatform.rust.rustcTarget == "x86_64-pc-windows-gnu"); + target = {target, targetSpec, features}: (target == "x86_64-pc-windows-gnu"); } ]; features = { @@ -542,7 +542,7 @@ rec { /* Target (platform) data for conditional dependencies. This corresponds roughly to what buildRustCrate is setting. */ - makeDefaultTarget = platform: { + makeDefaultTargetSpec = platform: { unix = platform.isUnix; windows = platform.isWindows; fuchsia = true; @@ -762,12 +762,12 @@ rec { , crateConfigs ? crates , buildRustCrateForPkgsFunc , runTests - , makeTarget ? makeDefaultTarget + , makeTargetSpec ? makeDefaultTargetSpec } @ args: assert (builtins.isAttrs crateConfigs); assert (builtins.isString packageId); assert (builtins.isList features); - assert (builtins.isAttrs (makeTarget stdenv.hostPlatform)); + assert (builtins.isAttrs (makeTargetSpec stdenv.hostPlatform)); assert (builtins.isBool runTests); let rootPackageId = packageId; @@ -775,7 +775,8 @@ rec { ( args // { inherit rootPackageId; - target = makeTarget stdenv.hostPlatform // { test = runTests; }; + target = stdenv.hostPlatform.rust.rustcTarget; + targetSpec = makeTargetSpec stdenv.hostPlatform // { test = runTests; }; } ); # Memoize built packages so that reappearing packages are only built once. @@ -784,7 +785,8 @@ rec { let self = { crates = lib.mapAttrs (packageId: value: buildByPackageIdForPkgsImpl self pkgs packageId) crateConfigs; - target = makeTarget stdenv.hostPlatform; + target = pkgs.stdenv.hostPlatform.rust.rustcTarget; + targetSpec = makeTargetSpec pkgs.stdenv.hostPlatform; build = mkBuiltByPackageIdByPkgs pkgs.buildPackages; }; in @@ -802,7 +804,7 @@ rec { dependencies = dependencyDerivations { inherit features; - inherit (self) target; + inherit (self) target targetSpec; buildByPackageId = depPackageId: # proc_macro crates must be compiled for the build architecture if crateConfigs.${depPackageId}.procMacro or false @@ -815,7 +817,7 @@ rec { buildDependencies = dependencyDerivations { inherit features; - inherit (self.build) target; + inherit (self.build) target targetSpec; buildByPackageId = depPackageId: self.build.crates.${depPackageId}; dependencies = crateConfig.buildDependencies or [ ]; @@ -824,12 +826,12 @@ rec { let buildDeps = filterEnabledDependencies { inherit features; - inherit (self) target; + inherit (self) target targetSpec; dependencies = crateConfig.dependencies or [ ] ++ devDependencies; }; hostDeps = filterEnabledDependencies { inherit features; - inherit (self.build) target; + inherit (self.build) target targetSpec; dependencies = crateConfig.buildDependencies or [ ]; }; in @@ -883,13 +885,14 @@ rec { , features , dependencies , target + , targetSpec }: assert (builtins.isList features); assert (builtins.isList dependencies); - assert (builtins.isAttrs target); + assert (builtins.isAttrs targetSpec); let enabledDependencies = filterEnabledDependencies { - inherit dependencies features target; + inherit dependencies features target targetSpec; }; depDerivation = dependency: buildByPackageId dependency.packageId; in @@ -908,7 +911,7 @@ rec { else val; /* Returns various tools to debug a crate. */ - debugCrate = { packageId, target ? makeDefaultTarget stdenv.hostPlatform }: + debugCrate = { packageId, target ? stdenv.hostPlatform.rust.rustcTarget, targetSpec ? makeDefaultTargetSpec stdenv.hostPlatform }: assert (builtins.isString packageId); let debug = rec { @@ -931,10 +934,10 @@ rec { ); mergedPackageFeatures = mergePackageFeatures { features = rootFeatures; - inherit packageId target; + inherit packageId target targetSpec; }; diffedDefaultPackageFeatures = diffDefaultPackageFeatures { - inherit packageId target; + inherit packageId target targetSpec; }; }; in @@ -949,6 +952,7 @@ rec { { crateConfigs ? crates , packageId , target + , targetSpec }: assert (builtins.isAttrs crateConfigs); let @@ -956,7 +960,7 @@ rec { mergedFeatures = prefixValues "crate2nix" - (mergePackageFeatures { inherit crateConfigs packageId target; features = [ "default" ]; }); + (mergePackageFeatures { inherit crateConfigs packageId target targetSpec; features = [ "default" ]; }); configs = prefixValues "cargo" crateConfigs; combined = lib.foldAttrs (a: b: a // b) { } [ mergedFeatures configs ]; onlyInCargo = @@ -991,6 +995,7 @@ rec { , dependencyPath ? [ crates.${packageId}.crateName ] , featuresByPackageId ? { } , target + , targetSpec # Adds devDependencies to the crate with rootPackageId. , runTests ? false , ... @@ -1001,7 +1006,7 @@ rec { assert (builtins.isList features); assert (builtins.isList dependencyPath); assert (builtins.isAttrs featuresByPackageId); - assert (builtins.isAttrs target); + assert (builtins.isAttrs targetSpec); assert (builtins.isBool runTests); let crateConfig = crateConfigs."${packageId}" or (builtins.throw "Package not found: ${packageId}"); @@ -1018,7 +1023,7 @@ rec { assert (builtins.isList dependencies); let enabledDependencies = filterEnabledDependencies { - inherit dependencies target; + inherit dependencies target targetSpec; features = enabledFeatures; }; directDependencies = map depWithResolvedFeatures enabledDependencies; @@ -1037,7 +1042,7 @@ rec { mergePackageFeatures { features = combinedFeatures; featuresByPackageId = cache; - inherit crateConfigs packageId target runTests rootPackageId; + inherit crateConfigs packageId target targetSpec runTests rootPackageId; } ); cacheWithSelf = @@ -1064,10 +1069,11 @@ rec { cacheWithAll; /* Returns the enabled dependencies given the enabled features. */ - filterEnabledDependencies = { dependencies, features, target }: + filterEnabledDependencies = { dependencies, features, target, targetSpec }: assert (builtins.isList dependencies); assert (builtins.isList features); - assert (builtins.isAttrs target); + assert (builtins.isString target); + assert (builtins.isAttrs targetSpec); lib.filter ( @@ -1075,7 +1081,7 @@ rec { let targetFunc = dep.target or (features: true); in - targetFunc { inherit features target; } + targetFunc { inherit features target targetSpec; } && ( !(dep.optional or false) || builtins.any (doesFeatureEnableDependency dep) features diff --git a/sample_projects/cross_compile_build_dependencies/Cargo.lock b/sample_projects/cross_compile_build_dependencies/Cargo.lock new file mode 100644 index 00000000..3958e6a0 --- /dev/null +++ b/sample_projects/cross_compile_build_dependencies/Cargo.lock @@ -0,0 +1,21 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "alice" +version = "1.0.0" +dependencies = [ + "bob", +] + +[[package]] +name = "bob" +version = "1.0.0" +dependencies = [ + "charlie", +] + +[[package]] +name = "charlie" +version = "1.0.0" diff --git a/sample_projects/cross_compile_build_dependencies/Cargo.toml b/sample_projects/cross_compile_build_dependencies/Cargo.toml new file mode 100644 index 00000000..bb626c90 --- /dev/null +++ b/sample_projects/cross_compile_build_dependencies/Cargo.toml @@ -0,0 +1,15 @@ +[workspace] +members = [ + "./alice", + "./bob", + "./charlie", +] +resolver = "2" + +[workspace.package] +version = "1.0.0" +edition = "2021" + +[workspace.dependencies] +bob.path = "./bob" +charlie.path = "./charlie" diff --git a/sample_projects/cross_compile_build_dependencies/alice/Cargo.toml b/sample_projects/cross_compile_build_dependencies/alice/Cargo.toml new file mode 100644 index 00000000..98fd4397 --- /dev/null +++ b/sample_projects/cross_compile_build_dependencies/alice/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "alice" +version.workspace = true +edition.workspace = true + +[build-dependencies] +bob.workspace = true diff --git a/sample_projects/cross_compile_build_dependencies/alice/src/main.rs b/sample_projects/cross_compile_build_dependencies/alice/src/main.rs new file mode 100644 index 00000000..f328e4d9 --- /dev/null +++ b/sample_projects/cross_compile_build_dependencies/alice/src/main.rs @@ -0,0 +1 @@ +fn main() {} diff --git a/sample_projects/cross_compile_build_dependencies/bob/Cargo.toml b/sample_projects/cross_compile_build_dependencies/bob/Cargo.toml new file mode 100644 index 00000000..31fddaea --- /dev/null +++ b/sample_projects/cross_compile_build_dependencies/bob/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "bob" +version.workspace = true +edition.workspace = true + +[target.'cfg(unix)'.dependencies] +charlie.workspace = true diff --git a/sample_projects/cross_compile_build_dependencies/bob/src/lib.rs b/sample_projects/cross_compile_build_dependencies/bob/src/lib.rs new file mode 100644 index 00000000..b08169af --- /dev/null +++ b/sample_projects/cross_compile_build_dependencies/bob/src/lib.rs @@ -0,0 +1,2 @@ +#[cfg(unix)] +pub use charlie; diff --git a/sample_projects/cross_compile_build_dependencies/charlie/Cargo.toml b/sample_projects/cross_compile_build_dependencies/charlie/Cargo.toml new file mode 100644 index 00000000..5b1b5808 --- /dev/null +++ b/sample_projects/cross_compile_build_dependencies/charlie/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "charlie" +version.workspace = true +edition.workspace = true diff --git a/sample_projects/cross_compile_build_dependencies/charlie/src/lib.rs b/sample_projects/cross_compile_build_dependencies/charlie/src/lib.rs new file mode 100644 index 00000000..e69de29b diff --git a/sample_projects/cross_compile_build_dependencies/default.nix b/sample_projects/cross_compile_build_dependencies/default.nix new file mode 100644 index 00000000..c0eacee6 --- /dev/null +++ b/sample_projects/cross_compile_build_dependencies/default.nix @@ -0,0 +1,6 @@ +{ nixpkgs ? import ../../nix/nixpkgs.nix +, lib ? import "${nixpkgs}/lib" +, pkgs ? import ../../nix/nixpkgs.nix { crossSystem = lib.systems.examples.wasm32-unknown-none; } +, generatedCargoNix +}: +(pkgs.callPackage generatedCargoNix { }).workspaceMembers.alice.build diff --git a/sample_projects/sub_dir_crates/Cargo.nix b/sample_projects/sub_dir_crates/Cargo.nix index 6f2bdd02..da96be66 100644 --- a/sample_projects/sub_dir_crates/Cargo.nix +++ b/sample_projects/sub_dir_crates/Cargo.nix @@ -151,7 +151,7 @@ rec { /* Target (platform) data for conditional dependencies. This corresponds roughly to what buildRustCrate is setting. */ - makeDefaultTarget = platform: { + makeDefaultTargetSpec = platform: { unix = platform.isUnix; windows = platform.isWindows; fuchsia = true; @@ -371,12 +371,12 @@ rec { , crateConfigs ? crates , buildRustCrateForPkgsFunc , runTests - , makeTarget ? makeDefaultTarget + , makeTargetSpec ? makeDefaultTargetSpec } @ args: assert (builtins.isAttrs crateConfigs); assert (builtins.isString packageId); assert (builtins.isList features); - assert (builtins.isAttrs (makeTarget stdenv.hostPlatform)); + assert (builtins.isAttrs (makeTargetSpec stdenv.hostPlatform)); assert (builtins.isBool runTests); let rootPackageId = packageId; @@ -384,7 +384,8 @@ rec { ( args // { inherit rootPackageId; - target = makeTarget stdenv.hostPlatform // { test = runTests; }; + target = stdenv.hostPlatform.rust.rustcTarget; + targetSpec = makeTargetSpec stdenv.hostPlatform // { test = runTests; }; } ); # Memoize built packages so that reappearing packages are only built once. @@ -393,7 +394,8 @@ rec { let self = { crates = lib.mapAttrs (packageId: value: buildByPackageIdForPkgsImpl self pkgs packageId) crateConfigs; - target = makeTarget stdenv.hostPlatform; + target = pkgs.stdenv.hostPlatform.rust.rustcTarget; + targetSpec = makeTargetSpec pkgs.stdenv.hostPlatform; build = mkBuiltByPackageIdByPkgs pkgs.buildPackages; }; in @@ -411,7 +413,7 @@ rec { dependencies = dependencyDerivations { inherit features; - inherit (self) target; + inherit (self) target targetSpec; buildByPackageId = depPackageId: # proc_macro crates must be compiled for the build architecture if crateConfigs.${depPackageId}.procMacro or false @@ -424,7 +426,7 @@ rec { buildDependencies = dependencyDerivations { inherit features; - inherit (self.build) target; + inherit (self.build) target targetSpec; buildByPackageId = depPackageId: self.build.crates.${depPackageId}; dependencies = crateConfig.buildDependencies or [ ]; @@ -433,12 +435,12 @@ rec { let buildDeps = filterEnabledDependencies { inherit features; - inherit (self) target; + inherit (self) target targetSpec; dependencies = crateConfig.dependencies or [ ] ++ devDependencies; }; hostDeps = filterEnabledDependencies { inherit features; - inherit (self.build) target; + inherit (self.build) target targetSpec; dependencies = crateConfig.buildDependencies or [ ]; }; in @@ -492,13 +494,14 @@ rec { , features , dependencies , target + , targetSpec }: assert (builtins.isList features); assert (builtins.isList dependencies); - assert (builtins.isAttrs target); + assert (builtins.isAttrs targetSpec); let enabledDependencies = filterEnabledDependencies { - inherit dependencies features target; + inherit dependencies features target targetSpec; }; depDerivation = dependency: buildByPackageId dependency.packageId; in @@ -517,7 +520,7 @@ rec { else val; /* Returns various tools to debug a crate. */ - debugCrate = { packageId, target ? makeDefaultTarget stdenv.hostPlatform }: + debugCrate = { packageId, target ? stdenv.hostPlatform.rust.rustcTarget, targetSpec ? makeDefaultTargetSpec stdenv.hostPlatform }: assert (builtins.isString packageId); let debug = rec { @@ -540,10 +543,10 @@ rec { ); mergedPackageFeatures = mergePackageFeatures { features = rootFeatures; - inherit packageId target; + inherit packageId target targetSpec; }; diffedDefaultPackageFeatures = diffDefaultPackageFeatures { - inherit packageId target; + inherit packageId target targetSpec; }; }; in @@ -558,6 +561,7 @@ rec { { crateConfigs ? crates , packageId , target + , targetSpec }: assert (builtins.isAttrs crateConfigs); let @@ -565,7 +569,7 @@ rec { mergedFeatures = prefixValues "crate2nix" - (mergePackageFeatures { inherit crateConfigs packageId target; features = [ "default" ]; }); + (mergePackageFeatures { inherit crateConfigs packageId target targetSpec; features = [ "default" ]; }); configs = prefixValues "cargo" crateConfigs; combined = lib.foldAttrs (a: b: a // b) { } [ mergedFeatures configs ]; onlyInCargo = @@ -600,6 +604,7 @@ rec { , dependencyPath ? [ crates.${packageId}.crateName ] , featuresByPackageId ? { } , target + , targetSpec # Adds devDependencies to the crate with rootPackageId. , runTests ? false , ... @@ -610,7 +615,7 @@ rec { assert (builtins.isList features); assert (builtins.isList dependencyPath); assert (builtins.isAttrs featuresByPackageId); - assert (builtins.isAttrs target); + assert (builtins.isAttrs targetSpec); assert (builtins.isBool runTests); let crateConfig = crateConfigs."${packageId}" or (builtins.throw "Package not found: ${packageId}"); @@ -627,7 +632,7 @@ rec { assert (builtins.isList dependencies); let enabledDependencies = filterEnabledDependencies { - inherit dependencies target; + inherit dependencies target targetSpec; features = enabledFeatures; }; directDependencies = map depWithResolvedFeatures enabledDependencies; @@ -646,7 +651,7 @@ rec { mergePackageFeatures { features = combinedFeatures; featuresByPackageId = cache; - inherit crateConfigs packageId target runTests rootPackageId; + inherit crateConfigs packageId target targetSpec runTests rootPackageId; } ); cacheWithSelf = @@ -673,10 +678,11 @@ rec { cacheWithAll; /* Returns the enabled dependencies given the enabled features. */ - filterEnabledDependencies = { dependencies, features, target }: + filterEnabledDependencies = { dependencies, features, target, targetSpec }: assert (builtins.isList dependencies); assert (builtins.isList features); - assert (builtins.isAttrs target); + assert (builtins.isString target); + assert (builtins.isAttrs targetSpec); lib.filter ( @@ -684,7 +690,7 @@ rec { let targetFunc = dep.target or (features: true); in - targetFunc { inherit features target; } + targetFunc { inherit features target targetSpec; } && ( !(dep.optional or false) || builtins.any (doesFeatureEnableDependency dep) features diff --git a/tests.nix b/tests.nix index 3564d9da..55cced56 100644 --- a/tests.nix +++ b/tests.nix @@ -377,6 +377,13 @@ let ]; } + { + name = "cross_compile_build_dependencies"; + src = ./sample_projects/cross_compile_build_dependencies; + customBuild = "sample_projects/cross_compile_build_dependencies/default.nix"; + derivationAttrPath = [ "workspaceMembers" "alice" ]; + } + # # Prefetch tests # From 8e25365a53ade2459b4ccbcc8755232308135482 Mon Sep 17 00:00:00 2001 From: Paul-Nicolas Madelaine Date: Wed, 4 Dec 2024 21:47:03 +0100 Subject: [PATCH 2/6] oops --- sample_projects/cross_compile_build_dependencies/default.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sample_projects/cross_compile_build_dependencies/default.nix b/sample_projects/cross_compile_build_dependencies/default.nix index c0eacee6..53cfe4a1 100644 --- a/sample_projects/cross_compile_build_dependencies/default.nix +++ b/sample_projects/cross_compile_build_dependencies/default.nix @@ -1,6 +1,6 @@ { nixpkgs ? import ../../nix/nixpkgs.nix , lib ? import "${nixpkgs}/lib" -, pkgs ? import ../../nix/nixpkgs.nix { crossSystem = lib.systems.examples.wasm32-unknown-none; } +, pkgs ? import nixpkgs { crossSystem = lib.systems.examples.wasm32-unknown-none; } , generatedCargoNix }: (pkgs.callPackage generatedCargoNix { }).workspaceMembers.alice.build From 437bd63b8a58f58b3ce81e35dcf9b4f9532c400d Mon Sep 17 00:00:00 2001 From: Paul-Nicolas Madelaine Date: Thu, 26 Dec 2024 17:28:27 +0100 Subject: [PATCH 3/6] add assertions --- crate2nix/Cargo.nix | 2 ++ crate2nix/templates/nix/crate2nix/default.nix | 2 ++ sample_projects/bin_with_git_submodule_dep/Cargo.nix | 2 ++ sample_projects/codegen/Cargo.nix | 2 ++ sample_projects/sub_dir_crates/Cargo.nix | 2 ++ 5 files changed, 10 insertions(+) diff --git a/crate2nix/Cargo.nix b/crate2nix/Cargo.nix index 403294c9..08469f65 100644 --- a/crate2nix/Cargo.nix +++ b/crate2nix/Cargo.nix @@ -3581,6 +3581,7 @@ rec { }: assert (builtins.isList features); assert (builtins.isList dependencies); + assert (builtins.isString target); assert (builtins.isAttrs targetSpec); let enabledDependencies = filterEnabledDependencies { @@ -3711,6 +3712,7 @@ rec { assert (builtins.isList features); assert (builtins.isList dependencyPath); assert (builtins.isAttrs featuresByPackageId); + assert (builtins.isString target); assert (builtins.isAttrs targetSpec); assert (builtins.isBool runTests); let diff --git a/crate2nix/templates/nix/crate2nix/default.nix b/crate2nix/templates/nix/crate2nix/default.nix index c6fdd748..097cc7f8 100644 --- a/crate2nix/templates/nix/crate2nix/default.nix +++ b/crate2nix/templates/nix/crate2nix/default.nix @@ -452,6 +452,7 @@ rec { }: assert (builtins.isList features); assert (builtins.isList dependencies); + assert (builtins.isString target); assert (builtins.isAttrs targetSpec); let enabledDependencies = filterEnabledDependencies { @@ -582,6 +583,7 @@ rec { assert (builtins.isList features); assert (builtins.isList dependencyPath); assert (builtins.isAttrs featuresByPackageId); + assert (builtins.isString target); assert (builtins.isAttrs targetSpec); assert (builtins.isBool runTests); let diff --git a/sample_projects/bin_with_git_submodule_dep/Cargo.nix b/sample_projects/bin_with_git_submodule_dep/Cargo.nix index 5c0b9b98..4772e35d 100644 --- a/sample_projects/bin_with_git_submodule_dep/Cargo.nix +++ b/sample_projects/bin_with_git_submodule_dep/Cargo.nix @@ -1799,6 +1799,7 @@ rec { }: assert (builtins.isList features); assert (builtins.isList dependencies); + assert (builtins.isString target); assert (builtins.isAttrs targetSpec); let enabledDependencies = filterEnabledDependencies { @@ -1929,6 +1930,7 @@ rec { assert (builtins.isList features); assert (builtins.isList dependencyPath); assert (builtins.isAttrs featuresByPackageId); + assert (builtins.isString target); assert (builtins.isAttrs targetSpec); assert (builtins.isBool runTests); let diff --git a/sample_projects/codegen/Cargo.nix b/sample_projects/codegen/Cargo.nix index f84b08bb..5b35dc02 100644 --- a/sample_projects/codegen/Cargo.nix +++ b/sample_projects/codegen/Cargo.nix @@ -974,6 +974,7 @@ rec { }: assert (builtins.isList features); assert (builtins.isList dependencies); + assert (builtins.isString target); assert (builtins.isAttrs targetSpec); let enabledDependencies = filterEnabledDependencies { @@ -1104,6 +1105,7 @@ rec { assert (builtins.isList features); assert (builtins.isList dependencyPath); assert (builtins.isAttrs featuresByPackageId); + assert (builtins.isString target); assert (builtins.isAttrs targetSpec); assert (builtins.isBool runTests); let diff --git a/sample_projects/sub_dir_crates/Cargo.nix b/sample_projects/sub_dir_crates/Cargo.nix index 53ec4e29..e33621b8 100644 --- a/sample_projects/sub_dir_crates/Cargo.nix +++ b/sample_projects/sub_dir_crates/Cargo.nix @@ -583,6 +583,7 @@ rec { }: assert (builtins.isList features); assert (builtins.isList dependencies); + assert (builtins.isString target); assert (builtins.isAttrs targetSpec); let enabledDependencies = filterEnabledDependencies { @@ -713,6 +714,7 @@ rec { assert (builtins.isList features); assert (builtins.isList dependencyPath); assert (builtins.isAttrs featuresByPackageId); + assert (builtins.isString target); assert (builtins.isAttrs targetSpec); assert (builtins.isBool runTests); let From fb16705924b1063cba5fb77f506367fe8202555a Mon Sep 17 00:00:00 2001 From: Paul-Nicolas Madelaine Date: Fri, 3 Jan 2025 14:16:48 +0100 Subject: [PATCH 4/6] simplify example --- .../cross_compile_build_dependencies/Cargo.lock | 8 ++++---- .../cross_compile_build_dependencies/Cargo.toml | 16 ++++------------ .../alice/Cargo.toml | 8 ++++---- .../alice/bob/Cargo.toml | 4 ++++ .../{charlie => alice/bob}/src/lib.rs | 0 .../alice/src/lib.rs | 2 ++ .../bob/Cargo.toml | 7 ------- .../bob/src/lib.rs | 2 -- .../charlie/Cargo.toml | 4 ---- .../cross_compile_build_dependencies/default.nix | 8 +++----- .../{alice => }/src/main.rs | 0 tests.nix | 1 - 12 files changed, 21 insertions(+), 39 deletions(-) create mode 100644 sample_projects/cross_compile_build_dependencies/alice/bob/Cargo.toml rename sample_projects/cross_compile_build_dependencies/{charlie => alice/bob}/src/lib.rs (100%) create mode 100644 sample_projects/cross_compile_build_dependencies/alice/src/lib.rs delete mode 100644 sample_projects/cross_compile_build_dependencies/bob/Cargo.toml delete mode 100644 sample_projects/cross_compile_build_dependencies/bob/src/lib.rs delete mode 100644 sample_projects/cross_compile_build_dependencies/charlie/Cargo.toml rename sample_projects/cross_compile_build_dependencies/{alice => }/src/main.rs (100%) diff --git a/sample_projects/cross_compile_build_dependencies/Cargo.lock b/sample_projects/cross_compile_build_dependencies/Cargo.lock index 3958e6a0..d25727f8 100644 --- a/sample_projects/cross_compile_build_dependencies/Cargo.lock +++ b/sample_projects/cross_compile_build_dependencies/Cargo.lock @@ -12,10 +12,10 @@ dependencies = [ [[package]] name = "bob" version = "1.0.0" -dependencies = [ - "charlie", -] [[package]] -name = "charlie" +name = "cross_compile_build_dependencies" version = "1.0.0" +dependencies = [ + "alice", +] diff --git a/sample_projects/cross_compile_build_dependencies/Cargo.toml b/sample_projects/cross_compile_build_dependencies/Cargo.toml index bb626c90..11a87647 100644 --- a/sample_projects/cross_compile_build_dependencies/Cargo.toml +++ b/sample_projects/cross_compile_build_dependencies/Cargo.toml @@ -1,15 +1,7 @@ -[workspace] -members = [ - "./alice", - "./bob", - "./charlie", -] -resolver = "2" - -[workspace.package] +[package] +name = "cross_compile_build_dependencies" version = "1.0.0" edition = "2021" -[workspace.dependencies] -bob.path = "./bob" -charlie.path = "./charlie" +[build-dependencies] +alice.path = "./alice" diff --git a/sample_projects/cross_compile_build_dependencies/alice/Cargo.toml b/sample_projects/cross_compile_build_dependencies/alice/Cargo.toml index 98fd4397..6b28873b 100644 --- a/sample_projects/cross_compile_build_dependencies/alice/Cargo.toml +++ b/sample_projects/cross_compile_build_dependencies/alice/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "alice" -version.workspace = true -edition.workspace = true +version = "1.0.0" +edition = "2021" -[build-dependencies] -bob.workspace = true +[target.'cfg(unix)'.dependencies] +bob.path = "./bob" diff --git a/sample_projects/cross_compile_build_dependencies/alice/bob/Cargo.toml b/sample_projects/cross_compile_build_dependencies/alice/bob/Cargo.toml new file mode 100644 index 00000000..a500d315 --- /dev/null +++ b/sample_projects/cross_compile_build_dependencies/alice/bob/Cargo.toml @@ -0,0 +1,4 @@ +[package] +name = "bob" +version = "1.0.0" +edition = "2021" diff --git a/sample_projects/cross_compile_build_dependencies/charlie/src/lib.rs b/sample_projects/cross_compile_build_dependencies/alice/bob/src/lib.rs similarity index 100% rename from sample_projects/cross_compile_build_dependencies/charlie/src/lib.rs rename to sample_projects/cross_compile_build_dependencies/alice/bob/src/lib.rs diff --git a/sample_projects/cross_compile_build_dependencies/alice/src/lib.rs b/sample_projects/cross_compile_build_dependencies/alice/src/lib.rs new file mode 100644 index 00000000..787da2d1 --- /dev/null +++ b/sample_projects/cross_compile_build_dependencies/alice/src/lib.rs @@ -0,0 +1,2 @@ +#[cfg(unix)] +pub use bob; diff --git a/sample_projects/cross_compile_build_dependencies/bob/Cargo.toml b/sample_projects/cross_compile_build_dependencies/bob/Cargo.toml deleted file mode 100644 index 31fddaea..00000000 --- a/sample_projects/cross_compile_build_dependencies/bob/Cargo.toml +++ /dev/null @@ -1,7 +0,0 @@ -[package] -name = "bob" -version.workspace = true -edition.workspace = true - -[target.'cfg(unix)'.dependencies] -charlie.workspace = true diff --git a/sample_projects/cross_compile_build_dependencies/bob/src/lib.rs b/sample_projects/cross_compile_build_dependencies/bob/src/lib.rs deleted file mode 100644 index b08169af..00000000 --- a/sample_projects/cross_compile_build_dependencies/bob/src/lib.rs +++ /dev/null @@ -1,2 +0,0 @@ -#[cfg(unix)] -pub use charlie; diff --git a/sample_projects/cross_compile_build_dependencies/charlie/Cargo.toml b/sample_projects/cross_compile_build_dependencies/charlie/Cargo.toml deleted file mode 100644 index 5b1b5808..00000000 --- a/sample_projects/cross_compile_build_dependencies/charlie/Cargo.toml +++ /dev/null @@ -1,4 +0,0 @@ -[package] -name = "charlie" -version.workspace = true -edition.workspace = true diff --git a/sample_projects/cross_compile_build_dependencies/default.nix b/sample_projects/cross_compile_build_dependencies/default.nix index 53cfe4a1..3adeb7a4 100644 --- a/sample_projects/cross_compile_build_dependencies/default.nix +++ b/sample_projects/cross_compile_build_dependencies/default.nix @@ -1,6 +1,4 @@ -{ nixpkgs ? import ../../nix/nixpkgs.nix -, lib ? import "${nixpkgs}/lib" -, pkgs ? import nixpkgs { crossSystem = lib.systems.examples.wasm32-unknown-none; } -, generatedCargoNix +{ generatedCargoNix +, pkgs ? import ../../nix/nixpkgs.nix { crossSystem.config = "wasm32-unknown-none"; } }: -(pkgs.callPackage generatedCargoNix { }).workspaceMembers.alice.build +(pkgs.callPackage generatedCargoNix { }).rootCrate.build diff --git a/sample_projects/cross_compile_build_dependencies/alice/src/main.rs b/sample_projects/cross_compile_build_dependencies/src/main.rs similarity index 100% rename from sample_projects/cross_compile_build_dependencies/alice/src/main.rs rename to sample_projects/cross_compile_build_dependencies/src/main.rs diff --git a/tests.nix b/tests.nix index 55cced56..b244714b 100644 --- a/tests.nix +++ b/tests.nix @@ -381,7 +381,6 @@ let name = "cross_compile_build_dependencies"; src = ./sample_projects/cross_compile_build_dependencies; customBuild = "sample_projects/cross_compile_build_dependencies/default.nix"; - derivationAttrPath = [ "workspaceMembers" "alice" ]; } # From 33746d6b3821113f71a7214f1fe8050227c5c5e8 Mon Sep 17 00:00:00 2001 From: Paul-Nicolas Madelaine Date: Tue, 14 Jan 2025 10:01:03 +0100 Subject: [PATCH 5/6] merge `target` and `targetSpec` --- crate2nix/Cargo.nix | 113 ++++++++---------- crate2nix/src/render.rs | 24 ++-- crate2nix/templates/Cargo.nix.tera | 6 +- crate2nix/templates/nix/crate2nix/default.nix | 51 ++++---- .../crate2nix/tests/dependencyDerivations.nix | 3 +- .../nix/crate2nix/tests/packageFeatures.nix | 3 +- .../bin_with_git_submodule_dep/Cargo.nix | 73 +++++------ sample_projects/codegen/Cargo.nix | 67 +++++------ sample_projects/sub_dir_crates/Cargo.nix | 51 ++++---- 9 files changed, 170 insertions(+), 221 deletions(-) diff --git a/crate2nix/Cargo.nix b/crate2nix/Cargo.nix index 08469f65..9d02407c 100644 --- a/crate2nix/Cargo.nix +++ b/crate2nix/Cargo.nix @@ -127,7 +127,7 @@ rec { { name = "winapi"; packageId = "winapi"; - target = {target, targetSpec, features}: ("windows" == targetSpec."os" or null); + target = {target, features}: ("windows" == target."os" or null); features = [ "consoleapi" "errhandlingapi" "fileapi" "handleapi" "processenv" ]; } ]; @@ -162,18 +162,18 @@ rec { { name = "hermit-abi"; packageId = "hermit-abi"; - target = {target, targetSpec, features}: ("hermit" == targetSpec."os" or null); + target = {target, features}: ("hermit" == target."os" or null); } { name = "libc"; packageId = "libc"; usesDefaultFeatures = false; - target = {target, targetSpec, features}: (targetSpec."unix" or false); + target = {target, features}: (target."unix" or false); } { name = "winapi"; packageId = "winapi"; - target = {target, targetSpec, features}: (targetSpec."windows" or false); + target = {target, features}: (target."windows" or false); features = [ "consoleapi" "processenv" "minwinbase" "minwindef" "winbase" ]; } ]; @@ -368,7 +368,7 @@ rec { name = "ansi_term"; packageId = "ansi_term"; optional = true; - target = {target, targetSpec, features}: (!(targetSpec."windows" or false)); + target = {target, features}: (!(target."windows" or false)); } { name = "atty"; @@ -449,22 +449,22 @@ rec { { name = "libc"; packageId = "libc"; - target = {target, targetSpec, features}: (target == "aarch64-linux-android"); + target = {target, features}: (target.name == "aarch64-linux-android"); } { name = "libc"; packageId = "libc"; - target = {target, targetSpec, features}: (("aarch64" == targetSpec."arch" or null) && ("linux" == targetSpec."os" or null)); + target = {target, features}: (("aarch64" == target."arch" or null) && ("linux" == target."os" or null)); } { name = "libc"; packageId = "libc"; - target = {target, targetSpec, features}: (("aarch64" == targetSpec."arch" or null) && ("apple" == targetSpec."vendor" or null)); + target = {target, features}: (("aarch64" == target."arch" or null) && ("apple" == target."vendor" or null)); } { name = "libc"; packageId = "libc"; - target = {target, targetSpec, features}: (("loongarch64" == targetSpec."arch" or null) && ("linux" == targetSpec."os" or null)); + target = {target, features}: (("loongarch64" == target."arch" or null) && ("linux" == target."os" or null)); } ]; @@ -996,7 +996,7 @@ rec { { name = "winapi-util"; packageId = "winapi-util"; - target = {target, targetSpec, features}: (targetSpec."windows" or false); + target = {target, features}: (target."windows" or false); } ]; features = { @@ -1463,29 +1463,29 @@ rec { { name = "fuchsia-cprng"; packageId = "fuchsia-cprng"; - target = {target, targetSpec, features}: ("fuchsia" == targetSpec."os" or null); + target = {target, features}: ("fuchsia" == target."os" or null); } { name = "libc"; packageId = "libc"; optional = true; - target = {target, targetSpec, features}: (targetSpec."unix" or false); + target = {target, features}: (target."unix" or false); } { name = "rand_core"; packageId = "rand_core 0.3.1"; usesDefaultFeatures = false; - target = {target, targetSpec, features}: ("sgx" == targetSpec."env" or null); + target = {target, features}: ("sgx" == target."env" or null); } { name = "rdrand"; packageId = "rdrand"; - target = {target, targetSpec, features}: ("sgx" == targetSpec."env" or null); + target = {target, features}: ("sgx" == target."env" or null); } { name = "winapi"; packageId = "winapi"; - target = {target, targetSpec, features}: (targetSpec."windows" or false); + target = {target, features}: (target."windows" or false); features = [ "minwindef" "ntsecapi" "profileapi" "winnt" ]; } ]; @@ -1703,7 +1703,7 @@ rec { { name = "winapi"; packageId = "winapi"; - target = {target, targetSpec, features}: (targetSpec."windows" or false); + target = {target, features}: (target."windows" or false); features = [ "std" "errhandlingapi" "winerror" "fileapi" "winbase" ]; } ]; @@ -1733,7 +1733,7 @@ rec { { name = "winapi-util"; packageId = "winapi-util"; - target = {target, targetSpec, features}: (targetSpec."windows" or false); + target = {target, features}: (target."windows" or false); } ]; @@ -1778,7 +1778,7 @@ rec { { name = "serde_derive"; packageId = "serde_derive"; - target = {target, targetSpec, features}: false; + target = {target, features}: false; } ]; devDependencies = [ @@ -1907,7 +1907,7 @@ rec { { name = "cpufeatures"; packageId = "cpufeatures"; - target = {target, targetSpec, features}: (("aarch64" == targetSpec."arch" or null) || ("x86_64" == targetSpec."arch" or null) || ("x86" == targetSpec."arch" or null)); + target = {target, features}: (("aarch64" == target."arch" or null) || ("x86_64" == target."arch" or null) || ("x86" == target."arch" or null)); } { name = "digest"; @@ -2674,7 +2674,7 @@ rec { { name = "winapi-util"; packageId = "winapi-util"; - target = {target, targetSpec, features}: (targetSpec."windows" or false); + target = {target, features}: (target."windows" or false); } ]; @@ -2691,12 +2691,12 @@ rec { { name = "winapi-i686-pc-windows-gnu"; packageId = "winapi-i686-pc-windows-gnu"; - target = {target, targetSpec, features}: (target == "i686-pc-windows-gnu"); + target = {target, features}: (target.name == "i686-pc-windows-gnu"); } { name = "winapi-x86_64-pc-windows-gnu"; packageId = "winapi-x86_64-pc-windows-gnu"; - target = {target, targetSpec, features}: (target == "x86_64-pc-windows-gnu"); + target = {target, features}: (target.name == "x86_64-pc-windows-gnu"); } ]; features = { @@ -2726,7 +2726,7 @@ rec { { name = "windows-sys"; packageId = "windows-sys"; - target = {target, targetSpec, features}: (targetSpec."windows" or false); + target = {target, features}: (target."windows" or false); features = [ "Win32_Foundation" "Win32_Storage_FileSystem" "Win32_System_Console" "Win32_System_SystemInformation" ]; } ]; @@ -3001,42 +3001,42 @@ rec { { name = "windows_aarch64_gnullvm"; packageId = "windows_aarch64_gnullvm"; - target = {target, targetSpec, features}: (target == "aarch64-pc-windows-gnullvm"); + target = {target, features}: (target.name == "aarch64-pc-windows-gnullvm"); } { name = "windows_aarch64_msvc"; packageId = "windows_aarch64_msvc"; - target = {target, targetSpec, features}: (("aarch64" == targetSpec."arch" or null) && ("msvc" == targetSpec."env" or null) && (!(targetSpec."windows_raw_dylib" or false))); + target = {target, features}: (("aarch64" == target."arch" or null) && ("msvc" == target."env" or null) && (!(target."windows_raw_dylib" or false))); } { name = "windows_i686_gnu"; packageId = "windows_i686_gnu"; - target = {target, targetSpec, features}: (("x86" == targetSpec."arch" or null) && ("gnu" == targetSpec."env" or null) && (!("llvm" == targetSpec."abi" or null)) && (!(targetSpec."windows_raw_dylib" or false))); + target = {target, features}: (("x86" == target."arch" or null) && ("gnu" == target."env" or null) && (!("llvm" == target."abi" or null)) && (!(target."windows_raw_dylib" or false))); } { name = "windows_i686_gnullvm"; packageId = "windows_i686_gnullvm"; - target = {target, targetSpec, features}: (target == "i686-pc-windows-gnullvm"); + target = {target, features}: (target.name == "i686-pc-windows-gnullvm"); } { name = "windows_i686_msvc"; packageId = "windows_i686_msvc"; - target = {target, targetSpec, features}: (("x86" == targetSpec."arch" or null) && ("msvc" == targetSpec."env" or null) && (!(targetSpec."windows_raw_dylib" or false))); + target = {target, features}: (("x86" == target."arch" or null) && ("msvc" == target."env" or null) && (!(target."windows_raw_dylib" or false))); } { name = "windows_x86_64_gnu"; packageId = "windows_x86_64_gnu"; - target = {target, targetSpec, features}: (("x86_64" == targetSpec."arch" or null) && ("gnu" == targetSpec."env" or null) && (!("llvm" == targetSpec."abi" or null)) && (!(targetSpec."windows_raw_dylib" or false))); + target = {target, features}: (("x86_64" == target."arch" or null) && ("gnu" == target."env" or null) && (!("llvm" == target."abi" or null)) && (!(target."windows_raw_dylib" or false))); } { name = "windows_x86_64_gnullvm"; packageId = "windows_x86_64_gnullvm"; - target = {target, targetSpec, features}: (target == "x86_64-pc-windows-gnullvm"); + target = {target, features}: (target.name == "x86_64-pc-windows-gnullvm"); } { name = "windows_x86_64_msvc"; packageId = "windows_x86_64_msvc"; - target = {target, targetSpec, features}: ((("x86_64" == targetSpec."arch" or null) || ("arm64ec" == targetSpec."arch" or null)) && ("msvc" == targetSpec."env" or null) && (!(targetSpec."windows_raw_dylib" or false))); + target = {target, features}: ((("x86_64" == target."arch" or null) || ("arm64ec" == target."arch" or null)) && ("msvc" == target."env" or null) && (!(target."windows_raw_dylib" or false))); } ]; @@ -3153,7 +3153,9 @@ rec { Target (platform) data for conditional dependencies. This corresponds roughly to what buildRustCrate is setting. */ - makeDefaultTargetSpec = platform: { + makeDefaultTarget = platform: { + name = platform.rust.rustcTarget; + unix = platform.isUnix; windows = platform.isWindows; fuchsia = true; @@ -3438,13 +3440,13 @@ rec { , crateConfigs ? crates , buildRustCrateForPkgsFunc , runTests - , makeTargetSpec ? makeDefaultTargetSpec + , makeTarget ? makeDefaultTarget , }@args: assert (builtins.isAttrs crateConfigs); assert (builtins.isString packageId); assert (builtins.isList features); - assert (builtins.isAttrs (makeTargetSpec stdenv.hostPlatform)); + assert (builtins.isAttrs (makeTarget stdenv.hostPlatform)); assert (builtins.isBool runTests); let rootPackageId = packageId; @@ -3452,8 +3454,7 @@ rec { args // { inherit rootPackageId; - target = stdenv.hostPlatform.rust.rustcTarget; - targetSpec = makeTargetSpec stdenv.hostPlatform // { + target = makeTarget stdenv.hostPlatform // { test = runTests; }; } @@ -3469,8 +3470,7 @@ rec { packageId: value: buildByPackageIdForPkgsImpl self pkgs packageId ) crateConfigs; - target = pkgs.stdenv.hostPlatform.rust.rustcTarget; - targetSpec = makeTargetSpec pkgs.stdenv.hostPlatform; + target = makeTarget pkgs.stdenv.hostPlatform; build = mkBuiltByPackageIdByPkgs pkgs.buildPackages; }; in @@ -3489,7 +3489,7 @@ rec { ); dependencies = dependencyDerivations { inherit features; - inherit (self) target targetSpec; + inherit (self) target; buildByPackageId = depPackageId: # proc_macro crates must be compiled for the build architecture @@ -3501,7 +3501,7 @@ rec { }; buildDependencies = dependencyDerivations { inherit features; - inherit (self.build) target targetSpec; + inherit (self.build) target; buildByPackageId = depPackageId: self.build.crates.${depPackageId}; dependencies = crateConfig.buildDependencies or [ ]; }; @@ -3509,12 +3509,12 @@ rec { let buildDeps = filterEnabledDependencies { inherit features; - inherit (self) target targetSpec; + inherit (self) target; dependencies = crateConfig.dependencies or [ ] ++ devDependencies; }; hostDeps = filterEnabledDependencies { inherit features; - inherit (self.build) target targetSpec; + inherit (self.build) target; dependencies = crateConfig.buildDependencies or [ ]; }; in @@ -3576,16 +3576,14 @@ rec { , features , dependencies , target - , targetSpec , }: assert (builtins.isList features); assert (builtins.isList dependencies); - assert (builtins.isString target); - assert (builtins.isAttrs targetSpec); + assert (builtins.isAttrs target); let enabledDependencies = filterEnabledDependencies { - inherit dependencies features target targetSpec; + inherit dependencies features target; }; depDerivation = dependency: buildByPackageId dependency.packageId; in @@ -3609,8 +3607,7 @@ rec { # Returns various tools to debug a crate. debugCrate = { packageId - , target ? stdenv.hostPlatform.rust.rustcTarget - , targetSpec ? makeDefaultTargetSpec stdenv.hostPlatform + , target ? makeDefaultTarget stdenv.hostPlatform , }: assert (builtins.isString packageId); @@ -3632,10 +3629,10 @@ rec { }); mergedPackageFeatures = mergePackageFeatures { features = rootFeatures; - inherit packageId target targetSpec; + inherit packageId target; }; diffedDefaultPackageFeatures = diffDefaultPackageFeatures { - inherit packageId target targetSpec; + inherit packageId target; }; }; in @@ -3653,14 +3650,13 @@ rec { { crateConfigs ? crates , packageId , target - , targetSpec , }: assert (builtins.isAttrs crateConfigs); let prefixValues = prefix: lib.mapAttrs (n: v: { "${prefix}" = v; }); mergedFeatures = prefixValues "crate2nix" (mergePackageFeatures { - inherit crateConfigs packageId target targetSpec; + inherit crateConfigs packageId target; features = [ "default" ]; }); configs = prefixValues "cargo" crateConfigs; @@ -3701,7 +3697,6 @@ rec { , dependencyPath ? [ crates.${packageId}.crateName ] , featuresByPackageId ? { } , target - , targetSpec , # Adds devDependencies to the crate with rootPackageId. runTests ? false , ... @@ -3712,8 +3707,7 @@ rec { assert (builtins.isList features); assert (builtins.isList dependencyPath); assert (builtins.isAttrs featuresByPackageId); - assert (builtins.isString target); - assert (builtins.isAttrs targetSpec); + assert (builtins.isAttrs target); assert (builtins.isBool runTests); let crateConfig = crateConfigs."${packageId}" or (builtins.throw "Package not found: ${packageId}"); @@ -3734,7 +3728,7 @@ rec { assert (builtins.isList dependencies); let enabledDependencies = filterEnabledDependencies { - inherit dependencies target targetSpec; + inherit dependencies target; features = enabledFeatures; }; directDependencies = map depWithResolvedFeatures enabledDependencies; @@ -3757,7 +3751,6 @@ rec { crateConfigs packageId target - targetSpec runTests rootPackageId ; @@ -3787,13 +3780,11 @@ rec { { dependencies , features , target - , targetSpec , }: assert (builtins.isList dependencies); assert (builtins.isList features); - assert (builtins.isString target); - assert (builtins.isAttrs targetSpec); + assert (builtins.isAttrs target); lib.filter ( @@ -3801,7 +3792,7 @@ rec { let targetFunc = dep.target or (features: true); in - targetFunc { inherit features target targetSpec; } + targetFunc { inherit features target; } && (!(dep.optional or false) || builtins.any (doesFeatureEnableDependency dep) features) ) dependencies; diff --git a/crate2nix/src/render.rs b/crate2nix/src/render.rs index aa7b2bbb..66da1a71 100644 --- a/crate2nix/src/render.rs +++ b/crate2nix/src/render.rs @@ -184,7 +184,7 @@ fn cfg_to_nix_expr_filter( })?; Ok(tera::Value::String(cfg_to_nix_expr(&expr))) } else { - let condition = format!("(target == {})", escape_nix_string(key)); + let condition = format!("(target.name == {})", escape_nix_string(key)); Ok(tera::Value::String(condition)) } } @@ -204,7 +204,7 @@ fn cfg_to_nix_expr(cfg: &CfgExpr) -> String { fn render(result: &mut String, cfg: &CfgExpr) { match cfg { CfgExpr::Value(Cfg::Name(name)) => { - result.push_str(&format!("(targetSpec.{} or false)", target(name))); + result.push_str(&format!("(target.{} or false)", target(name))); } CfgExpr::Value(Cfg::KeyPair(key, value)) => { let escaped_value = escape_nix_string(value); @@ -213,13 +213,9 @@ fn cfg_to_nix_expr(cfg: &CfgExpr) -> String { } else if key == "target_feature" { format!("(builtins.elem {} targetFeatures)", escaped_value) } else if key == "target_family" { - format!( - "(builtins.elem {} targetSpec.{})", - escaped_value, - target(key) - ) + format!("(builtins.elem {} target.{})", escaped_value, target(key)) } else { - format!("({} == targetSpec.{} or null)", escaped_value, target(key)) + format!("({} == target.{} or null)", escaped_value, target(key)) }); } CfgExpr::Not(expr) => { @@ -272,7 +268,7 @@ fn test_render_cfg_to_nix_expr() { } assert_eq!( - "(targetSpec.\"unix\" or false)", + "(target.\"unix\" or false)", &cfg_to_nix_expr(&name("unix")) ); assert_eq!( @@ -283,23 +279,23 @@ fn test_render_cfg_to_nix_expr() { ])) ); assert_eq!( - "(builtins.elem \"unix\" targetSpec.\"family\")", + "(builtins.elem \"unix\" target.\"family\")", &cfg_to_nix_expr(&kv("target_family", "unix")) ); assert_eq!( - "(\"linux\" == targetSpec.\"os\" or null)", + "(\"linux\" == target.\"os\" or null)", &cfg_to_nix_expr(&kv("target_os", "linux")) ); assert_eq!( - "(!(\"linux\" == targetSpec.\"os\" or null))", + "(!(\"linux\" == target.\"os\" or null))", &cfg_to_nix_expr(&CfgExpr::Not(Box::new(kv("target_os", "linux")))) ); assert_eq!( - "((targetSpec.\"unix\" or false) || (\"linux\" == targetSpec.\"os\" or null))", + "((target.\"unix\" or false) || (\"linux\" == target.\"os\" or null))", &cfg_to_nix_expr(&CfgExpr::Any(vec![name("unix"), kv("target_os", "linux")])) ); assert_eq!( - "((targetSpec.\"unix\" or false) && (\"linux\" == targetSpec.\"os\" or null))", + "((target.\"unix\" or false) && (\"linux\" == target.\"os\" or null))", &cfg_to_nix_expr(&CfgExpr::All(vec![name("unix"), kv("target_os", "linux")])) ); assert_eq!("true", &cfg_to_nix_expr(&CfgExpr::All(vec![]))); diff --git a/crate2nix/templates/Cargo.nix.tera b/crate2nix/templates/Cargo.nix.tera index 68c5e692..4efdf1b7 100644 --- a/crate2nix/templates/Cargo.nix.tera +++ b/crate2nix/templates/Cargo.nix.tera @@ -220,7 +220,7 @@ rec { usesDefaultFeatures = false; {%- endif -%} {%- if dependency.target %} - target = {target, targetSpec, features}: {{dependency.target | cfg_to_nix_expr | safe}}; + target = {target, features}: {{dependency.target | cfg_to_nix_expr | safe}}; {%- endif %} {%- if dependency.features %} features = [ {% for feature in dependency.features %}{{feature}} {% endfor %}]; @@ -246,7 +246,7 @@ rec { usesDefaultFeatures = false; {%- endif -%} {%- if dependency.target %} - target = {target, targetSpec, features}: {{dependency.target | cfg_to_nix_expr | safe}}; + target = {target, features}: {{dependency.target | cfg_to_nix_expr | safe}}; {%- endif %} {%- if dependency.features %} features = [ {% for feature in dependency.features %}{{feature}} {% endfor %}]; @@ -271,7 +271,7 @@ rec { usesDefaultFeatures = false; {%- endif -%} {%- if dependency.target %} - target = {target, targetSpec, features}: {{dependency.target | cfg_to_nix_expr | safe}}; + target = {target, features}: {{dependency.target | cfg_to_nix_expr | safe}}; {%- endif %} {%- if dependency.features %} features = [ {% for feature in dependency.features %}{{feature}} {% endfor %}]; diff --git a/crate2nix/templates/nix/crate2nix/default.nix b/crate2nix/templates/nix/crate2nix/default.nix index 097cc7f8..5b810733 100644 --- a/crate2nix/templates/nix/crate2nix/default.nix +++ b/crate2nix/templates/nix/crate2nix/default.nix @@ -24,7 +24,9 @@ rec { Target (platform) data for conditional dependencies. This corresponds roughly to what buildRustCrate is setting. */ - makeDefaultTargetSpec = platform: { + makeDefaultTarget = platform: { + name = platform.rust.rustcTarget; + unix = platform.isUnix; windows = platform.isWindows; fuchsia = true; @@ -309,13 +311,13 @@ rec { , crateConfigs ? crates , buildRustCrateForPkgsFunc , runTests - , makeTargetSpec ? makeDefaultTargetSpec + , makeTarget ? makeDefaultTarget , }@args: assert (builtins.isAttrs crateConfigs); assert (builtins.isString packageId); assert (builtins.isList features); - assert (builtins.isAttrs (makeTargetSpec stdenv.hostPlatform)); + assert (builtins.isAttrs (makeTarget stdenv.hostPlatform)); assert (builtins.isBool runTests); let rootPackageId = packageId; @@ -323,8 +325,7 @@ rec { args // { inherit rootPackageId; - target = stdenv.hostPlatform.rust.rustcTarget; - targetSpec = makeTargetSpec stdenv.hostPlatform // { + target = makeTarget stdenv.hostPlatform // { test = runTests; }; } @@ -340,8 +341,7 @@ rec { packageId: value: buildByPackageIdForPkgsImpl self pkgs packageId ) crateConfigs; - target = pkgs.stdenv.hostPlatform.rust.rustcTarget; - targetSpec = makeTargetSpec pkgs.stdenv.hostPlatform; + target = makeTarget pkgs.stdenv.hostPlatform; build = mkBuiltByPackageIdByPkgs pkgs.buildPackages; }; in @@ -360,7 +360,7 @@ rec { ); dependencies = dependencyDerivations { inherit features; - inherit (self) target targetSpec; + inherit (self) target; buildByPackageId = depPackageId: # proc_macro crates must be compiled for the build architecture @@ -372,7 +372,7 @@ rec { }; buildDependencies = dependencyDerivations { inherit features; - inherit (self.build) target targetSpec; + inherit (self.build) target; buildByPackageId = depPackageId: self.build.crates.${depPackageId}; dependencies = crateConfig.buildDependencies or [ ]; }; @@ -380,12 +380,12 @@ rec { let buildDeps = filterEnabledDependencies { inherit features; - inherit (self) target targetSpec; + inherit (self) target; dependencies = crateConfig.dependencies or [ ] ++ devDependencies; }; hostDeps = filterEnabledDependencies { inherit features; - inherit (self.build) target targetSpec; + inherit (self.build) target; dependencies = crateConfig.buildDependencies or [ ]; }; in @@ -447,16 +447,14 @@ rec { , features , dependencies , target - , targetSpec , }: assert (builtins.isList features); assert (builtins.isList dependencies); - assert (builtins.isString target); - assert (builtins.isAttrs targetSpec); + assert (builtins.isAttrs target); let enabledDependencies = filterEnabledDependencies { - inherit dependencies features target targetSpec; + inherit dependencies features target; }; depDerivation = dependency: buildByPackageId dependency.packageId; in @@ -480,8 +478,7 @@ rec { # Returns various tools to debug a crate. debugCrate = { packageId - , target ? stdenv.hostPlatform.rust.rustcTarget - , targetSpec ? makeDefaultTargetSpec stdenv.hostPlatform + , target ? makeDefaultTarget stdenv.hostPlatform , }: assert (builtins.isString packageId); @@ -503,10 +500,10 @@ rec { }); mergedPackageFeatures = mergePackageFeatures { features = rootFeatures; - inherit packageId target targetSpec; + inherit packageId target; }; diffedDefaultPackageFeatures = diffDefaultPackageFeatures { - inherit packageId target targetSpec; + inherit packageId target; }; }; in @@ -524,14 +521,13 @@ rec { { crateConfigs ? crates , packageId , target - , targetSpec , }: assert (builtins.isAttrs crateConfigs); let prefixValues = prefix: lib.mapAttrs (n: v: { "${prefix}" = v; }); mergedFeatures = prefixValues "crate2nix" (mergePackageFeatures { - inherit crateConfigs packageId target targetSpec; + inherit crateConfigs packageId target; features = [ "default" ]; }); configs = prefixValues "cargo" crateConfigs; @@ -572,7 +568,6 @@ rec { , dependencyPath ? [ crates.${packageId}.crateName ] , featuresByPackageId ? { } , target - , targetSpec , # Adds devDependencies to the crate with rootPackageId. runTests ? false , ... @@ -583,8 +578,7 @@ rec { assert (builtins.isList features); assert (builtins.isList dependencyPath); assert (builtins.isAttrs featuresByPackageId); - assert (builtins.isString target); - assert (builtins.isAttrs targetSpec); + assert (builtins.isAttrs target); assert (builtins.isBool runTests); let crateConfig = crateConfigs."${packageId}" or (builtins.throw "Package not found: ${packageId}"); @@ -605,7 +599,7 @@ rec { assert (builtins.isList dependencies); let enabledDependencies = filterEnabledDependencies { - inherit dependencies target targetSpec; + inherit dependencies target; features = enabledFeatures; }; directDependencies = map depWithResolvedFeatures enabledDependencies; @@ -628,7 +622,6 @@ rec { crateConfigs packageId target - targetSpec runTests rootPackageId ; @@ -658,13 +651,11 @@ rec { { dependencies , features , target - , targetSpec , }: assert (builtins.isList dependencies); assert (builtins.isList features); - assert (builtins.isString target); - assert (builtins.isAttrs targetSpec); + assert (builtins.isAttrs target); lib.filter ( @@ -672,7 +663,7 @@ rec { let targetFunc = dep.target or (features: true); in - targetFunc { inherit features target targetSpec; } + targetFunc { inherit features target; } && (!(dep.optional or false) || builtins.any (doesFeatureEnableDependency dep) features) ) dependencies; diff --git a/crate2nix/templates/nix/crate2nix/tests/dependencyDerivations.nix b/crate2nix/templates/nix/crate2nix/tests/dependencyDerivations.nix index b01bf98b..1986416d 100644 --- a/crate2nix/templates/nix/crate2nix/tests/dependencyDerivations.nix +++ b/crate2nix/templates/nix/crate2nix/tests/dependencyDerivations.nix @@ -24,8 +24,7 @@ let dependencyDerivations = features: dependencies: crate2nix.dependencyDerivations { buildByPackageId = p: fakeCrates.${p}; - target = stdenv.hostPlatform.rust.rustcTarget; - targetSpec = crate2nix.makeDefaultTargetSpec stdenv.hostPlatform; + target = crate2nix.makeDefaultTarget stdenv.hostPlatform; inherit features dependencies; }; in diff --git a/crate2nix/templates/nix/crate2nix/tests/packageFeatures.nix b/crate2nix/templates/nix/crate2nix/tests/packageFeatures.nix index 9d7b3dff..12c41d4d 100644 --- a/crate2nix/templates/nix/crate2nix/tests/packageFeatures.nix +++ b/crate2nix/templates/nix/crate2nix/tests/packageFeatures.nix @@ -87,8 +87,7 @@ let packageId: features: crate2nix.mergePackageFeatures { - target = stdenv.hostPlatform.rust.rustcTarget; - targetSpec = crate2nix.makeDefaultTargetSpec stdenv.hostPlatform; + target = crate2nix.makeDefaultTarget stdenv.hostPlatform; runTests = false; rootPackageId = packageId; inherit crateConfigs packageId features; diff --git a/sample_projects/bin_with_git_submodule_dep/Cargo.nix b/sample_projects/bin_with_git_submodule_dep/Cargo.nix index 4772e35d..6b3278d9 100644 --- a/sample_projects/bin_with_git_submodule_dep/Cargo.nix +++ b/sample_projects/bin_with_git_submodule_dep/Cargo.nix @@ -283,7 +283,7 @@ rec { name = "libc"; packageId = "libc"; usesDefaultFeatures = false; - target = {target, targetSpec, features}: (targetSpec."unix" or false); + target = {target, features}: (target."unix" or false); } ]; features = { @@ -407,7 +407,7 @@ rec { { name = "libc"; packageId = "libc"; - target = {target, targetSpec, features}: (targetSpec."unix" or false); + target = {target, features}: (target."unix" or false); } ]; @@ -468,12 +468,12 @@ rec { { name = "cfg-if"; packageId = "cfg-if"; - target = {target, targetSpec, features}: (targetSpec."unix" or false); + target = {target, features}: (target."unix" or false); } { name = "windows-sys"; packageId = "windows-sys"; - target = {target, targetSpec, features}: (targetSpec."windows" or false); + target = {target, features}: (target."windows" or false); features = [ "Win32_Foundation" "Win32_System_Diagnostics_Debug" "Win32_System_LibraryLoader" ]; } ]; @@ -1256,37 +1256,37 @@ rec { { name = "windows_aarch64_gnullvm"; packageId = "windows_aarch64_gnullvm"; - target = {target, targetSpec, features}: (target == "aarch64-pc-windows-gnullvm"); + target = {target, features}: (target.name == "aarch64-pc-windows-gnullvm"); } { name = "windows_aarch64_msvc"; packageId = "windows_aarch64_msvc"; - target = {target, targetSpec, features}: (("aarch64" == targetSpec."arch" or null) && ("msvc" == targetSpec."env" or null) && (!(targetSpec."windows_raw_dylib" or false))); + target = {target, features}: (("aarch64" == target."arch" or null) && ("msvc" == target."env" or null) && (!(target."windows_raw_dylib" or false))); } { name = "windows_i686_gnu"; packageId = "windows_i686_gnu"; - target = {target, targetSpec, features}: (("x86" == targetSpec."arch" or null) && ("gnu" == targetSpec."env" or null) && (!(targetSpec."windows_raw_dylib" or false))); + target = {target, features}: (("x86" == target."arch" or null) && ("gnu" == target."env" or null) && (!(target."windows_raw_dylib" or false))); } { name = "windows_i686_msvc"; packageId = "windows_i686_msvc"; - target = {target, targetSpec, features}: (("x86" == targetSpec."arch" or null) && ("msvc" == targetSpec."env" or null) && (!(targetSpec."windows_raw_dylib" or false))); + target = {target, features}: (("x86" == target."arch" or null) && ("msvc" == target."env" or null) && (!(target."windows_raw_dylib" or false))); } { name = "windows_x86_64_gnu"; packageId = "windows_x86_64_gnu"; - target = {target, targetSpec, features}: (("x86_64" == targetSpec."arch" or null) && ("gnu" == targetSpec."env" or null) && (!("llvm" == targetSpec."abi" or null)) && (!(targetSpec."windows_raw_dylib" or false))); + target = {target, features}: (("x86_64" == target."arch" or null) && ("gnu" == target."env" or null) && (!("llvm" == target."abi" or null)) && (!(target."windows_raw_dylib" or false))); } { name = "windows_x86_64_gnullvm"; packageId = "windows_x86_64_gnullvm"; - target = {target, targetSpec, features}: (target == "x86_64-pc-windows-gnullvm"); + target = {target, features}: (target.name == "x86_64-pc-windows-gnullvm"); } { name = "windows_x86_64_msvc"; packageId = "windows_x86_64_msvc"; - target = {target, targetSpec, features}: (("x86_64" == targetSpec."arch" or null) && ("msvc" == targetSpec."env" or null) && (!(targetSpec."windows_raw_dylib" or false))); + target = {target, features}: (("x86_64" == target."arch" or null) && ("msvc" == target."env" or null) && (!(target."windows_raw_dylib" or false))); } ]; @@ -1371,7 +1371,9 @@ rec { Target (platform) data for conditional dependencies. This corresponds roughly to what buildRustCrate is setting. */ - makeDefaultTargetSpec = platform: { + makeDefaultTarget = platform: { + name = platform.rust.rustcTarget; + unix = platform.isUnix; windows = platform.isWindows; fuchsia = true; @@ -1656,13 +1658,13 @@ rec { , crateConfigs ? crates , buildRustCrateForPkgsFunc , runTests - , makeTargetSpec ? makeDefaultTargetSpec + , makeTarget ? makeDefaultTarget , }@args: assert (builtins.isAttrs crateConfigs); assert (builtins.isString packageId); assert (builtins.isList features); - assert (builtins.isAttrs (makeTargetSpec stdenv.hostPlatform)); + assert (builtins.isAttrs (makeTarget stdenv.hostPlatform)); assert (builtins.isBool runTests); let rootPackageId = packageId; @@ -1670,8 +1672,7 @@ rec { args // { inherit rootPackageId; - target = stdenv.hostPlatform.rust.rustcTarget; - targetSpec = makeTargetSpec stdenv.hostPlatform // { + target = makeTarget stdenv.hostPlatform // { test = runTests; }; } @@ -1687,8 +1688,7 @@ rec { packageId: value: buildByPackageIdForPkgsImpl self pkgs packageId ) crateConfigs; - target = pkgs.stdenv.hostPlatform.rust.rustcTarget; - targetSpec = makeTargetSpec pkgs.stdenv.hostPlatform; + target = makeTarget pkgs.stdenv.hostPlatform; build = mkBuiltByPackageIdByPkgs pkgs.buildPackages; }; in @@ -1707,7 +1707,7 @@ rec { ); dependencies = dependencyDerivations { inherit features; - inherit (self) target targetSpec; + inherit (self) target; buildByPackageId = depPackageId: # proc_macro crates must be compiled for the build architecture @@ -1719,7 +1719,7 @@ rec { }; buildDependencies = dependencyDerivations { inherit features; - inherit (self.build) target targetSpec; + inherit (self.build) target; buildByPackageId = depPackageId: self.build.crates.${depPackageId}; dependencies = crateConfig.buildDependencies or [ ]; }; @@ -1727,12 +1727,12 @@ rec { let buildDeps = filterEnabledDependencies { inherit features; - inherit (self) target targetSpec; + inherit (self) target; dependencies = crateConfig.dependencies or [ ] ++ devDependencies; }; hostDeps = filterEnabledDependencies { inherit features; - inherit (self.build) target targetSpec; + inherit (self.build) target; dependencies = crateConfig.buildDependencies or [ ]; }; in @@ -1794,16 +1794,14 @@ rec { , features , dependencies , target - , targetSpec , }: assert (builtins.isList features); assert (builtins.isList dependencies); - assert (builtins.isString target); - assert (builtins.isAttrs targetSpec); + assert (builtins.isAttrs target); let enabledDependencies = filterEnabledDependencies { - inherit dependencies features target targetSpec; + inherit dependencies features target; }; depDerivation = dependency: buildByPackageId dependency.packageId; in @@ -1827,8 +1825,7 @@ rec { # Returns various tools to debug a crate. debugCrate = { packageId - , target ? stdenv.hostPlatform.rust.rustcTarget - , targetSpec ? makeDefaultTargetSpec stdenv.hostPlatform + , target ? makeDefaultTarget stdenv.hostPlatform , }: assert (builtins.isString packageId); @@ -1850,10 +1847,10 @@ rec { }); mergedPackageFeatures = mergePackageFeatures { features = rootFeatures; - inherit packageId target targetSpec; + inherit packageId target; }; diffedDefaultPackageFeatures = diffDefaultPackageFeatures { - inherit packageId target targetSpec; + inherit packageId target; }; }; in @@ -1871,14 +1868,13 @@ rec { { crateConfigs ? crates , packageId , target - , targetSpec , }: assert (builtins.isAttrs crateConfigs); let prefixValues = prefix: lib.mapAttrs (n: v: { "${prefix}" = v; }); mergedFeatures = prefixValues "crate2nix" (mergePackageFeatures { - inherit crateConfigs packageId target targetSpec; + inherit crateConfigs packageId target; features = [ "default" ]; }); configs = prefixValues "cargo" crateConfigs; @@ -1919,7 +1915,6 @@ rec { , dependencyPath ? [ crates.${packageId}.crateName ] , featuresByPackageId ? { } , target - , targetSpec , # Adds devDependencies to the crate with rootPackageId. runTests ? false , ... @@ -1930,8 +1925,7 @@ rec { assert (builtins.isList features); assert (builtins.isList dependencyPath); assert (builtins.isAttrs featuresByPackageId); - assert (builtins.isString target); - assert (builtins.isAttrs targetSpec); + assert (builtins.isAttrs target); assert (builtins.isBool runTests); let crateConfig = crateConfigs."${packageId}" or (builtins.throw "Package not found: ${packageId}"); @@ -1952,7 +1946,7 @@ rec { assert (builtins.isList dependencies); let enabledDependencies = filterEnabledDependencies { - inherit dependencies target targetSpec; + inherit dependencies target; features = enabledFeatures; }; directDependencies = map depWithResolvedFeatures enabledDependencies; @@ -1975,7 +1969,6 @@ rec { crateConfigs packageId target - targetSpec runTests rootPackageId ; @@ -2005,13 +1998,11 @@ rec { { dependencies , features , target - , targetSpec , }: assert (builtins.isList dependencies); assert (builtins.isList features); - assert (builtins.isString target); - assert (builtins.isAttrs targetSpec); + assert (builtins.isAttrs target); lib.filter ( @@ -2019,7 +2010,7 @@ rec { let targetFunc = dep.target or (features: true); in - targetFunc { inherit features target targetSpec; } + targetFunc { inherit features target; } && (!(dep.optional or false) || builtins.any (doesFeatureEnableDependency dep) features) ) dependencies; diff --git a/sample_projects/codegen/Cargo.nix b/sample_projects/codegen/Cargo.nix index 5b35dc02..574b42e8 100644 --- a/sample_projects/codegen/Cargo.nix +++ b/sample_projects/codegen/Cargo.nix @@ -102,7 +102,7 @@ rec { { name = "winapi"; packageId = "winapi"; - target = {target, targetSpec, features}: ("windows" == targetSpec."os" or null); + target = {target, features}: ("windows" == target."os" or null); features = [ "consoleapi" "errhandlingapi" "fileapi" "handleapi" "processenv" ]; } ]; @@ -123,18 +123,18 @@ rec { { name = "hermit-abi"; packageId = "hermit-abi"; - target = {target, targetSpec, features}: ("hermit" == targetSpec."os" or null); + target = {target, features}: ("hermit" == target."os" or null); } { name = "libc"; packageId = "libc"; usesDefaultFeatures = false; - target = {target, targetSpec, features}: (targetSpec."unix" or false); + target = {target, features}: (target."unix" or false); } { name = "winapi"; packageId = "winapi"; - target = {target, targetSpec, features}: (targetSpec."windows" or false); + target = {target, features}: (target."windows" or false); features = [ "consoleapi" "processenv" "minwinbase" "minwindef" "winbase" ]; } ]; @@ -168,7 +168,7 @@ rec { name = "ansi_term"; packageId = "ansi_term"; optional = true; - target = {target, targetSpec, features}: (!(targetSpec."windows" or false)); + target = {target, features}: (!(target."windows" or false)); } { name = "atty"; @@ -269,7 +269,7 @@ rec { { name = "winapi"; packageId = "winapi"; - target = {target, targetSpec, features}: (targetSpec."windows" or false); + target = {target, features}: (target."windows" or false); features = [ "winsock2" ]; } ]; @@ -491,12 +491,12 @@ rec { { name = "winapi-i686-pc-windows-gnu"; packageId = "winapi-i686-pc-windows-gnu"; - target = {target, targetSpec, features}: (target == "i686-pc-windows-gnu"); + target = {target, features}: (target.name == "i686-pc-windows-gnu"); } { name = "winapi-x86_64-pc-windows-gnu"; packageId = "winapi-x86_64-pc-windows-gnu"; - target = {target, targetSpec, features}: (target == "x86_64-pc-windows-gnu"); + target = {target, features}: (target.name == "x86_64-pc-windows-gnu"); } ]; features = { @@ -546,7 +546,9 @@ rec { Target (platform) data for conditional dependencies. This corresponds roughly to what buildRustCrate is setting. */ - makeDefaultTargetSpec = platform: { + makeDefaultTarget = platform: { + name = platform.rust.rustcTarget; + unix = platform.isUnix; windows = platform.isWindows; fuchsia = true; @@ -831,13 +833,13 @@ rec { , crateConfigs ? crates , buildRustCrateForPkgsFunc , runTests - , makeTargetSpec ? makeDefaultTargetSpec + , makeTarget ? makeDefaultTarget , }@args: assert (builtins.isAttrs crateConfigs); assert (builtins.isString packageId); assert (builtins.isList features); - assert (builtins.isAttrs (makeTargetSpec stdenv.hostPlatform)); + assert (builtins.isAttrs (makeTarget stdenv.hostPlatform)); assert (builtins.isBool runTests); let rootPackageId = packageId; @@ -845,8 +847,7 @@ rec { args // { inherit rootPackageId; - target = stdenv.hostPlatform.rust.rustcTarget; - targetSpec = makeTargetSpec stdenv.hostPlatform // { + target = makeTarget stdenv.hostPlatform // { test = runTests; }; } @@ -862,8 +863,7 @@ rec { packageId: value: buildByPackageIdForPkgsImpl self pkgs packageId ) crateConfigs; - target = pkgs.stdenv.hostPlatform.rust.rustcTarget; - targetSpec = makeTargetSpec pkgs.stdenv.hostPlatform; + target = makeTarget pkgs.stdenv.hostPlatform; build = mkBuiltByPackageIdByPkgs pkgs.buildPackages; }; in @@ -882,7 +882,7 @@ rec { ); dependencies = dependencyDerivations { inherit features; - inherit (self) target targetSpec; + inherit (self) target; buildByPackageId = depPackageId: # proc_macro crates must be compiled for the build architecture @@ -894,7 +894,7 @@ rec { }; buildDependencies = dependencyDerivations { inherit features; - inherit (self.build) target targetSpec; + inherit (self.build) target; buildByPackageId = depPackageId: self.build.crates.${depPackageId}; dependencies = crateConfig.buildDependencies or [ ]; }; @@ -902,12 +902,12 @@ rec { let buildDeps = filterEnabledDependencies { inherit features; - inherit (self) target targetSpec; + inherit (self) target; dependencies = crateConfig.dependencies or [ ] ++ devDependencies; }; hostDeps = filterEnabledDependencies { inherit features; - inherit (self.build) target targetSpec; + inherit (self.build) target; dependencies = crateConfig.buildDependencies or [ ]; }; in @@ -969,16 +969,14 @@ rec { , features , dependencies , target - , targetSpec , }: assert (builtins.isList features); assert (builtins.isList dependencies); - assert (builtins.isString target); - assert (builtins.isAttrs targetSpec); + assert (builtins.isAttrs target); let enabledDependencies = filterEnabledDependencies { - inherit dependencies features target targetSpec; + inherit dependencies features target; }; depDerivation = dependency: buildByPackageId dependency.packageId; in @@ -1002,8 +1000,7 @@ rec { # Returns various tools to debug a crate. debugCrate = { packageId - , target ? stdenv.hostPlatform.rust.rustcTarget - , targetSpec ? makeDefaultTargetSpec stdenv.hostPlatform + , target ? makeDefaultTarget stdenv.hostPlatform , }: assert (builtins.isString packageId); @@ -1025,10 +1022,10 @@ rec { }); mergedPackageFeatures = mergePackageFeatures { features = rootFeatures; - inherit packageId target targetSpec; + inherit packageId target; }; diffedDefaultPackageFeatures = diffDefaultPackageFeatures { - inherit packageId target targetSpec; + inherit packageId target; }; }; in @@ -1046,14 +1043,13 @@ rec { { crateConfigs ? crates , packageId , target - , targetSpec , }: assert (builtins.isAttrs crateConfigs); let prefixValues = prefix: lib.mapAttrs (n: v: { "${prefix}" = v; }); mergedFeatures = prefixValues "crate2nix" (mergePackageFeatures { - inherit crateConfigs packageId target targetSpec; + inherit crateConfigs packageId target; features = [ "default" ]; }); configs = prefixValues "cargo" crateConfigs; @@ -1094,7 +1090,6 @@ rec { , dependencyPath ? [ crates.${packageId}.crateName ] , featuresByPackageId ? { } , target - , targetSpec , # Adds devDependencies to the crate with rootPackageId. runTests ? false , ... @@ -1105,8 +1100,7 @@ rec { assert (builtins.isList features); assert (builtins.isList dependencyPath); assert (builtins.isAttrs featuresByPackageId); - assert (builtins.isString target); - assert (builtins.isAttrs targetSpec); + assert (builtins.isAttrs target); assert (builtins.isBool runTests); let crateConfig = crateConfigs."${packageId}" or (builtins.throw "Package not found: ${packageId}"); @@ -1127,7 +1121,7 @@ rec { assert (builtins.isList dependencies); let enabledDependencies = filterEnabledDependencies { - inherit dependencies target targetSpec; + inherit dependencies target; features = enabledFeatures; }; directDependencies = map depWithResolvedFeatures enabledDependencies; @@ -1150,7 +1144,6 @@ rec { crateConfigs packageId target - targetSpec runTests rootPackageId ; @@ -1180,13 +1173,11 @@ rec { { dependencies , features , target - , targetSpec , }: assert (builtins.isList dependencies); assert (builtins.isList features); - assert (builtins.isString target); - assert (builtins.isAttrs targetSpec); + assert (builtins.isAttrs target); lib.filter ( @@ -1194,7 +1185,7 @@ rec { let targetFunc = dep.target or (features: true); in - targetFunc { inherit features target targetSpec; } + targetFunc { inherit features target; } && (!(dep.optional or false) || builtins.any (doesFeatureEnableDependency dep) features) ) dependencies; diff --git a/sample_projects/sub_dir_crates/Cargo.nix b/sample_projects/sub_dir_crates/Cargo.nix index e33621b8..52aaa247 100644 --- a/sample_projects/sub_dir_crates/Cargo.nix +++ b/sample_projects/sub_dir_crates/Cargo.nix @@ -155,7 +155,9 @@ rec { Target (platform) data for conditional dependencies. This corresponds roughly to what buildRustCrate is setting. */ - makeDefaultTargetSpec = platform: { + makeDefaultTarget = platform: { + name = platform.rust.rustcTarget; + unix = platform.isUnix; windows = platform.isWindows; fuchsia = true; @@ -440,13 +442,13 @@ rec { , crateConfigs ? crates , buildRustCrateForPkgsFunc , runTests - , makeTargetSpec ? makeDefaultTargetSpec + , makeTarget ? makeDefaultTarget , }@args: assert (builtins.isAttrs crateConfigs); assert (builtins.isString packageId); assert (builtins.isList features); - assert (builtins.isAttrs (makeTargetSpec stdenv.hostPlatform)); + assert (builtins.isAttrs (makeTarget stdenv.hostPlatform)); assert (builtins.isBool runTests); let rootPackageId = packageId; @@ -454,8 +456,7 @@ rec { args // { inherit rootPackageId; - target = stdenv.hostPlatform.rust.rustcTarget; - targetSpec = makeTargetSpec stdenv.hostPlatform // { + target = makeTarget stdenv.hostPlatform // { test = runTests; }; } @@ -471,8 +472,7 @@ rec { packageId: value: buildByPackageIdForPkgsImpl self pkgs packageId ) crateConfigs; - target = pkgs.stdenv.hostPlatform.rust.rustcTarget; - targetSpec = makeTargetSpec pkgs.stdenv.hostPlatform; + target = makeTarget pkgs.stdenv.hostPlatform; build = mkBuiltByPackageIdByPkgs pkgs.buildPackages; }; in @@ -491,7 +491,7 @@ rec { ); dependencies = dependencyDerivations { inherit features; - inherit (self) target targetSpec; + inherit (self) target; buildByPackageId = depPackageId: # proc_macro crates must be compiled for the build architecture @@ -503,7 +503,7 @@ rec { }; buildDependencies = dependencyDerivations { inherit features; - inherit (self.build) target targetSpec; + inherit (self.build) target; buildByPackageId = depPackageId: self.build.crates.${depPackageId}; dependencies = crateConfig.buildDependencies or [ ]; }; @@ -511,12 +511,12 @@ rec { let buildDeps = filterEnabledDependencies { inherit features; - inherit (self) target targetSpec; + inherit (self) target; dependencies = crateConfig.dependencies or [ ] ++ devDependencies; }; hostDeps = filterEnabledDependencies { inherit features; - inherit (self.build) target targetSpec; + inherit (self.build) target; dependencies = crateConfig.buildDependencies or [ ]; }; in @@ -578,16 +578,14 @@ rec { , features , dependencies , target - , targetSpec , }: assert (builtins.isList features); assert (builtins.isList dependencies); - assert (builtins.isString target); - assert (builtins.isAttrs targetSpec); + assert (builtins.isAttrs target); let enabledDependencies = filterEnabledDependencies { - inherit dependencies features target targetSpec; + inherit dependencies features target; }; depDerivation = dependency: buildByPackageId dependency.packageId; in @@ -611,8 +609,7 @@ rec { # Returns various tools to debug a crate. debugCrate = { packageId - , target ? stdenv.hostPlatform.rust.rustcTarget - , targetSpec ? makeDefaultTargetSpec stdenv.hostPlatform + , target ? makeDefaultTarget stdenv.hostPlatform , }: assert (builtins.isString packageId); @@ -634,10 +631,10 @@ rec { }); mergedPackageFeatures = mergePackageFeatures { features = rootFeatures; - inherit packageId target targetSpec; + inherit packageId target; }; diffedDefaultPackageFeatures = diffDefaultPackageFeatures { - inherit packageId target targetSpec; + inherit packageId target; }; }; in @@ -655,14 +652,13 @@ rec { { crateConfigs ? crates , packageId , target - , targetSpec , }: assert (builtins.isAttrs crateConfigs); let prefixValues = prefix: lib.mapAttrs (n: v: { "${prefix}" = v; }); mergedFeatures = prefixValues "crate2nix" (mergePackageFeatures { - inherit crateConfigs packageId target targetSpec; + inherit crateConfigs packageId target; features = [ "default" ]; }); configs = prefixValues "cargo" crateConfigs; @@ -703,7 +699,6 @@ rec { , dependencyPath ? [ crates.${packageId}.crateName ] , featuresByPackageId ? { } , target - , targetSpec , # Adds devDependencies to the crate with rootPackageId. runTests ? false , ... @@ -714,8 +709,7 @@ rec { assert (builtins.isList features); assert (builtins.isList dependencyPath); assert (builtins.isAttrs featuresByPackageId); - assert (builtins.isString target); - assert (builtins.isAttrs targetSpec); + assert (builtins.isAttrs target); assert (builtins.isBool runTests); let crateConfig = crateConfigs."${packageId}" or (builtins.throw "Package not found: ${packageId}"); @@ -736,7 +730,7 @@ rec { assert (builtins.isList dependencies); let enabledDependencies = filterEnabledDependencies { - inherit dependencies target targetSpec; + inherit dependencies target; features = enabledFeatures; }; directDependencies = map depWithResolvedFeatures enabledDependencies; @@ -759,7 +753,6 @@ rec { crateConfigs packageId target - targetSpec runTests rootPackageId ; @@ -789,13 +782,11 @@ rec { { dependencies , features , target - , targetSpec , }: assert (builtins.isList dependencies); assert (builtins.isList features); - assert (builtins.isString target); - assert (builtins.isAttrs targetSpec); + assert (builtins.isAttrs target); lib.filter ( @@ -803,7 +794,7 @@ rec { let targetFunc = dep.target or (features: true); in - targetFunc { inherit features target targetSpec; } + targetFunc { inherit features target; } && (!(dep.optional or false) || builtins.any (doesFeatureEnableDependency dep) features) ) dependencies; From c027e463f25c3b335a92a4a5cc9caab4c2b814f5 Mon Sep 17 00:00:00 2001 From: Paul-Nicolas Madelaine Date: Wed, 15 Jan 2025 12:05:05 +0100 Subject: [PATCH 6/6] formatting --- crate2nix/Cargo.nix | 62 +++++++++---------- crate2nix/templates/Cargo.nix.tera | 6 +- .../bin_with_git_submodule_dep/Cargo.nix | 22 +++---- sample_projects/codegen/Cargo.nix | 16 ++--- 4 files changed, 53 insertions(+), 53 deletions(-) diff --git a/crate2nix/Cargo.nix b/crate2nix/Cargo.nix index 9d02407c..c848dcdd 100644 --- a/crate2nix/Cargo.nix +++ b/crate2nix/Cargo.nix @@ -127,7 +127,7 @@ rec { { name = "winapi"; packageId = "winapi"; - target = {target, features}: ("windows" == target."os" or null); + target = { target, features }: ("windows" == target."os" or null); features = [ "consoleapi" "errhandlingapi" "fileapi" "handleapi" "processenv" ]; } ]; @@ -162,18 +162,18 @@ rec { { name = "hermit-abi"; packageId = "hermit-abi"; - target = {target, features}: ("hermit" == target."os" or null); + target = { target, features }: ("hermit" == target."os" or null); } { name = "libc"; packageId = "libc"; usesDefaultFeatures = false; - target = {target, features}: (target."unix" or false); + target = { target, features }: (target."unix" or false); } { name = "winapi"; packageId = "winapi"; - target = {target, features}: (target."windows" or false); + target = { target, features }: (target."windows" or false); features = [ "consoleapi" "processenv" "minwinbase" "minwindef" "winbase" ]; } ]; @@ -368,7 +368,7 @@ rec { name = "ansi_term"; packageId = "ansi_term"; optional = true; - target = {target, features}: (!(target."windows" or false)); + target = { target, features }: (!(target."windows" or false)); } { name = "atty"; @@ -449,22 +449,22 @@ rec { { name = "libc"; packageId = "libc"; - target = {target, features}: (target.name == "aarch64-linux-android"); + target = { target, features }: (target.name == "aarch64-linux-android"); } { name = "libc"; packageId = "libc"; - target = {target, features}: (("aarch64" == target."arch" or null) && ("linux" == target."os" or null)); + target = { target, features }: (("aarch64" == target."arch" or null) && ("linux" == target."os" or null)); } { name = "libc"; packageId = "libc"; - target = {target, features}: (("aarch64" == target."arch" or null) && ("apple" == target."vendor" or null)); + target = { target, features }: (("aarch64" == target."arch" or null) && ("apple" == target."vendor" or null)); } { name = "libc"; packageId = "libc"; - target = {target, features}: (("loongarch64" == target."arch" or null) && ("linux" == target."os" or null)); + target = { target, features }: (("loongarch64" == target."arch" or null) && ("linux" == target."os" or null)); } ]; @@ -996,7 +996,7 @@ rec { { name = "winapi-util"; packageId = "winapi-util"; - target = {target, features}: (target."windows" or false); + target = { target, features }: (target."windows" or false); } ]; features = { @@ -1463,29 +1463,29 @@ rec { { name = "fuchsia-cprng"; packageId = "fuchsia-cprng"; - target = {target, features}: ("fuchsia" == target."os" or null); + target = { target, features }: ("fuchsia" == target."os" or null); } { name = "libc"; packageId = "libc"; optional = true; - target = {target, features}: (target."unix" or false); + target = { target, features }: (target."unix" or false); } { name = "rand_core"; packageId = "rand_core 0.3.1"; usesDefaultFeatures = false; - target = {target, features}: ("sgx" == target."env" or null); + target = { target, features }: ("sgx" == target."env" or null); } { name = "rdrand"; packageId = "rdrand"; - target = {target, features}: ("sgx" == target."env" or null); + target = { target, features }: ("sgx" == target."env" or null); } { name = "winapi"; packageId = "winapi"; - target = {target, features}: (target."windows" or false); + target = { target, features }: (target."windows" or false); features = [ "minwindef" "ntsecapi" "profileapi" "winnt" ]; } ]; @@ -1703,7 +1703,7 @@ rec { { name = "winapi"; packageId = "winapi"; - target = {target, features}: (target."windows" or false); + target = { target, features }: (target."windows" or false); features = [ "std" "errhandlingapi" "winerror" "fileapi" "winbase" ]; } ]; @@ -1733,7 +1733,7 @@ rec { { name = "winapi-util"; packageId = "winapi-util"; - target = {target, features}: (target."windows" or false); + target = { target, features }: (target."windows" or false); } ]; @@ -1778,7 +1778,7 @@ rec { { name = "serde_derive"; packageId = "serde_derive"; - target = {target, features}: false; + target = { target, features }: false; } ]; devDependencies = [ @@ -1907,7 +1907,7 @@ rec { { name = "cpufeatures"; packageId = "cpufeatures"; - target = {target, features}: (("aarch64" == target."arch" or null) || ("x86_64" == target."arch" or null) || ("x86" == target."arch" or null)); + target = { target, features }: (("aarch64" == target."arch" or null) || ("x86_64" == target."arch" or null) || ("x86" == target."arch" or null)); } { name = "digest"; @@ -2674,7 +2674,7 @@ rec { { name = "winapi-util"; packageId = "winapi-util"; - target = {target, features}: (target."windows" or false); + target = { target, features }: (target."windows" or false); } ]; @@ -2691,12 +2691,12 @@ rec { { name = "winapi-i686-pc-windows-gnu"; packageId = "winapi-i686-pc-windows-gnu"; - target = {target, features}: (target.name == "i686-pc-windows-gnu"); + target = { target, features }: (target.name == "i686-pc-windows-gnu"); } { name = "winapi-x86_64-pc-windows-gnu"; packageId = "winapi-x86_64-pc-windows-gnu"; - target = {target, features}: (target.name == "x86_64-pc-windows-gnu"); + target = { target, features }: (target.name == "x86_64-pc-windows-gnu"); } ]; features = { @@ -2726,7 +2726,7 @@ rec { { name = "windows-sys"; packageId = "windows-sys"; - target = {target, features}: (target."windows" or false); + target = { target, features }: (target."windows" or false); features = [ "Win32_Foundation" "Win32_Storage_FileSystem" "Win32_System_Console" "Win32_System_SystemInformation" ]; } ]; @@ -3001,42 +3001,42 @@ rec { { name = "windows_aarch64_gnullvm"; packageId = "windows_aarch64_gnullvm"; - target = {target, features}: (target.name == "aarch64-pc-windows-gnullvm"); + target = { target, features }: (target.name == "aarch64-pc-windows-gnullvm"); } { name = "windows_aarch64_msvc"; packageId = "windows_aarch64_msvc"; - target = {target, features}: (("aarch64" == target."arch" or null) && ("msvc" == target."env" or null) && (!(target."windows_raw_dylib" or false))); + target = { target, features }: (("aarch64" == target."arch" or null) && ("msvc" == target."env" or null) && (!(target."windows_raw_dylib" or false))); } { name = "windows_i686_gnu"; packageId = "windows_i686_gnu"; - target = {target, features}: (("x86" == target."arch" or null) && ("gnu" == target."env" or null) && (!("llvm" == target."abi" or null)) && (!(target."windows_raw_dylib" or false))); + target = { target, features }: (("x86" == target."arch" or null) && ("gnu" == target."env" or null) && (!("llvm" == target."abi" or null)) && (!(target."windows_raw_dylib" or false))); } { name = "windows_i686_gnullvm"; packageId = "windows_i686_gnullvm"; - target = {target, features}: (target.name == "i686-pc-windows-gnullvm"); + target = { target, features }: (target.name == "i686-pc-windows-gnullvm"); } { name = "windows_i686_msvc"; packageId = "windows_i686_msvc"; - target = {target, features}: (("x86" == target."arch" or null) && ("msvc" == target."env" or null) && (!(target."windows_raw_dylib" or false))); + target = { target, features }: (("x86" == target."arch" or null) && ("msvc" == target."env" or null) && (!(target."windows_raw_dylib" or false))); } { name = "windows_x86_64_gnu"; packageId = "windows_x86_64_gnu"; - target = {target, features}: (("x86_64" == target."arch" or null) && ("gnu" == target."env" or null) && (!("llvm" == target."abi" or null)) && (!(target."windows_raw_dylib" or false))); + target = { target, features }: (("x86_64" == target."arch" or null) && ("gnu" == target."env" or null) && (!("llvm" == target."abi" or null)) && (!(target."windows_raw_dylib" or false))); } { name = "windows_x86_64_gnullvm"; packageId = "windows_x86_64_gnullvm"; - target = {target, features}: (target.name == "x86_64-pc-windows-gnullvm"); + target = { target, features }: (target.name == "x86_64-pc-windows-gnullvm"); } { name = "windows_x86_64_msvc"; packageId = "windows_x86_64_msvc"; - target = {target, features}: ((("x86_64" == target."arch" or null) || ("arm64ec" == target."arch" or null)) && ("msvc" == target."env" or null) && (!(target."windows_raw_dylib" or false))); + target = { target, features }: ((("x86_64" == target."arch" or null) || ("arm64ec" == target."arch" or null)) && ("msvc" == target."env" or null) && (!(target."windows_raw_dylib" or false))); } ]; diff --git a/crate2nix/templates/Cargo.nix.tera b/crate2nix/templates/Cargo.nix.tera index 4efdf1b7..8637ef07 100644 --- a/crate2nix/templates/Cargo.nix.tera +++ b/crate2nix/templates/Cargo.nix.tera @@ -220,7 +220,7 @@ rec { usesDefaultFeatures = false; {%- endif -%} {%- if dependency.target %} - target = {target, features}: {{dependency.target | cfg_to_nix_expr | safe}}; + target = { target, features }: {{dependency.target | cfg_to_nix_expr | safe}}; {%- endif %} {%- if dependency.features %} features = [ {% for feature in dependency.features %}{{feature}} {% endfor %}]; @@ -246,7 +246,7 @@ rec { usesDefaultFeatures = false; {%- endif -%} {%- if dependency.target %} - target = {target, features}: {{dependency.target | cfg_to_nix_expr | safe}}; + target = { target, features }: {{dependency.target | cfg_to_nix_expr | safe}}; {%- endif %} {%- if dependency.features %} features = [ {% for feature in dependency.features %}{{feature}} {% endfor %}]; @@ -271,7 +271,7 @@ rec { usesDefaultFeatures = false; {%- endif -%} {%- if dependency.target %} - target = {target, features}: {{dependency.target | cfg_to_nix_expr | safe}}; + target = { target, features }: {{dependency.target | cfg_to_nix_expr | safe}}; {%- endif %} {%- if dependency.features %} features = [ {% for feature in dependency.features %}{{feature}} {% endfor %}]; diff --git a/sample_projects/bin_with_git_submodule_dep/Cargo.nix b/sample_projects/bin_with_git_submodule_dep/Cargo.nix index 6b3278d9..fad04a12 100644 --- a/sample_projects/bin_with_git_submodule_dep/Cargo.nix +++ b/sample_projects/bin_with_git_submodule_dep/Cargo.nix @@ -283,7 +283,7 @@ rec { name = "libc"; packageId = "libc"; usesDefaultFeatures = false; - target = {target, features}: (target."unix" or false); + target = { target, features }: (target."unix" or false); } ]; features = { @@ -407,7 +407,7 @@ rec { { name = "libc"; packageId = "libc"; - target = {target, features}: (target."unix" or false); + target = { target, features }: (target."unix" or false); } ]; @@ -468,12 +468,12 @@ rec { { name = "cfg-if"; packageId = "cfg-if"; - target = {target, features}: (target."unix" or false); + target = { target, features }: (target."unix" or false); } { name = "windows-sys"; packageId = "windows-sys"; - target = {target, features}: (target."windows" or false); + target = { target, features }: (target."windows" or false); features = [ "Win32_Foundation" "Win32_System_Diagnostics_Debug" "Win32_System_LibraryLoader" ]; } ]; @@ -1256,37 +1256,37 @@ rec { { name = "windows_aarch64_gnullvm"; packageId = "windows_aarch64_gnullvm"; - target = {target, features}: (target.name == "aarch64-pc-windows-gnullvm"); + target = { target, features }: (target.name == "aarch64-pc-windows-gnullvm"); } { name = "windows_aarch64_msvc"; packageId = "windows_aarch64_msvc"; - target = {target, features}: (("aarch64" == target."arch" or null) && ("msvc" == target."env" or null) && (!(target."windows_raw_dylib" or false))); + target = { target, features }: (("aarch64" == target."arch" or null) && ("msvc" == target."env" or null) && (!(target."windows_raw_dylib" or false))); } { name = "windows_i686_gnu"; packageId = "windows_i686_gnu"; - target = {target, features}: (("x86" == target."arch" or null) && ("gnu" == target."env" or null) && (!(target."windows_raw_dylib" or false))); + target = { target, features }: (("x86" == target."arch" or null) && ("gnu" == target."env" or null) && (!(target."windows_raw_dylib" or false))); } { name = "windows_i686_msvc"; packageId = "windows_i686_msvc"; - target = {target, features}: (("x86" == target."arch" or null) && ("msvc" == target."env" or null) && (!(target."windows_raw_dylib" or false))); + target = { target, features }: (("x86" == target."arch" or null) && ("msvc" == target."env" or null) && (!(target."windows_raw_dylib" or false))); } { name = "windows_x86_64_gnu"; packageId = "windows_x86_64_gnu"; - target = {target, features}: (("x86_64" == target."arch" or null) && ("gnu" == target."env" or null) && (!("llvm" == target."abi" or null)) && (!(target."windows_raw_dylib" or false))); + target = { target, features }: (("x86_64" == target."arch" or null) && ("gnu" == target."env" or null) && (!("llvm" == target."abi" or null)) && (!(target."windows_raw_dylib" or false))); } { name = "windows_x86_64_gnullvm"; packageId = "windows_x86_64_gnullvm"; - target = {target, features}: (target.name == "x86_64-pc-windows-gnullvm"); + target = { target, features }: (target.name == "x86_64-pc-windows-gnullvm"); } { name = "windows_x86_64_msvc"; packageId = "windows_x86_64_msvc"; - target = {target, features}: (("x86_64" == target."arch" or null) && ("msvc" == target."env" or null) && (!(target."windows_raw_dylib" or false))); + target = { target, features }: (("x86_64" == target."arch" or null) && ("msvc" == target."env" or null) && (!(target."windows_raw_dylib" or false))); } ]; diff --git a/sample_projects/codegen/Cargo.nix b/sample_projects/codegen/Cargo.nix index 574b42e8..b25e3f07 100644 --- a/sample_projects/codegen/Cargo.nix +++ b/sample_projects/codegen/Cargo.nix @@ -102,7 +102,7 @@ rec { { name = "winapi"; packageId = "winapi"; - target = {target, features}: ("windows" == target."os" or null); + target = { target, features }: ("windows" == target."os" or null); features = [ "consoleapi" "errhandlingapi" "fileapi" "handleapi" "processenv" ]; } ]; @@ -123,18 +123,18 @@ rec { { name = "hermit-abi"; packageId = "hermit-abi"; - target = {target, features}: ("hermit" == target."os" or null); + target = { target, features }: ("hermit" == target."os" or null); } { name = "libc"; packageId = "libc"; usesDefaultFeatures = false; - target = {target, features}: (target."unix" or false); + target = { target, features }: (target."unix" or false); } { name = "winapi"; packageId = "winapi"; - target = {target, features}: (target."windows" or false); + target = { target, features }: (target."windows" or false); features = [ "consoleapi" "processenv" "minwinbase" "minwindef" "winbase" ]; } ]; @@ -168,7 +168,7 @@ rec { name = "ansi_term"; packageId = "ansi_term"; optional = true; - target = {target, features}: (!(target."windows" or false)); + target = { target, features }: (!(target."windows" or false)); } { name = "atty"; @@ -269,7 +269,7 @@ rec { { name = "winapi"; packageId = "winapi"; - target = {target, features}: (target."windows" or false); + target = { target, features }: (target."windows" or false); features = [ "winsock2" ]; } ]; @@ -491,12 +491,12 @@ rec { { name = "winapi-i686-pc-windows-gnu"; packageId = "winapi-i686-pc-windows-gnu"; - target = {target, features}: (target.name == "i686-pc-windows-gnu"); + target = { target, features }: (target.name == "i686-pc-windows-gnu"); } { name = "winapi-x86_64-pc-windows-gnu"; packageId = "winapi-x86_64-pc-windows-gnu"; - target = {target, features}: (target.name == "x86_64-pc-windows-gnu"); + target = { target, features }: (target.name == "x86_64-pc-windows-gnu"); } ]; features = {