anvil-editor: init at 0.4
[NixPkgs.git] / pkgs / build-support / rust / lib / default.nix
blobc23f779bfe5d979895da3432af7965ae1e939aa8
1 { lib
2 , stdenv
3 , pkgsBuildHost
4 , pkgsBuildTarget
5 , pkgsTargetTarget
6 }:
8 rec {
9   # These environment variables must be set when using `cargo-c` and
10   # several other tools which do not deal well with cross
11   # compilation.  The symptom of the problem they fix is errors due
12   # to buildPlatform CFLAGS being passed to the
13   # hostPlatform-targeted compiler -- for example, `-m64` being
14   # passed on a build=x86_64/host=aarch64 compilation.
15   envVars = let
17     ccForBuild = "${pkgsBuildHost.stdenv.cc}/bin/${pkgsBuildHost.stdenv.cc.targetPrefix}cc";
18     cxxForBuild = "${pkgsBuildHost.stdenv.cc}/bin/${pkgsBuildHost.stdenv.cc.targetPrefix}c++";
20     ccForHost = "${stdenv.cc}/bin/${stdenv.cc.targetPrefix}cc";
21     cxxForHost = "${stdenv.cc}/bin/${stdenv.cc.targetPrefix}c++";
23     # Unfortunately we must use the dangerous `pkgsTargetTarget` here
24     # because hooks are artificially phase-shifted one slot earlier
25     # (they go in nativeBuildInputs, so the hostPlatform looks like
26     # a targetPlatform to them).
27     ccForTarget = "${pkgsTargetTarget.stdenv.cc}/bin/${pkgsTargetTarget.stdenv.cc.targetPrefix}cc";
28     cxxForTarget = "${pkgsTargetTarget.stdenv.cc}/bin/${pkgsTargetTarget.stdenv.cc.targetPrefix}c++";
30     rustBuildPlatform = stdenv.buildPlatform.rust.rustcTarget;
31     rustBuildPlatformSpec = stdenv.buildPlatform.rust.rustcTargetSpec;
32     rustHostPlatform = stdenv.hostPlatform.rust.rustcTarget;
33     rustHostPlatformSpec = stdenv.hostPlatform.rust.rustcTargetSpec;
34     rustTargetPlatform = stdenv.targetPlatform.rust.rustcTarget;
35     rustTargetPlatformSpec = stdenv.targetPlatform.rust.rustcTargetSpec;
36   in {
37     inherit
38       ccForBuild  cxxForBuild  rustBuildPlatform   rustBuildPlatformSpec
39       ccForHost   cxxForHost   rustHostPlatform    rustHostPlatformSpec
40       ccForTarget cxxForTarget rustTargetPlatform  rustTargetPlatformSpec;
42     # Prefix this onto a command invocation in order to set the
43     # variables needed by cargo.
44     #
45     setEnv = ''
46     env \
47     ''
48     # Due to a bug in how splicing and pkgsTargetTarget works, in
49     # situations where pkgsTargetTarget is irrelevant
50     # pkgsTargetTarget.stdenv.cc is often simply wrong.  We must omit
51     # the following lines when rustTargetPlatform collides with
52     # rustHostPlatform.
53     + lib.optionalString (rustTargetPlatform != rustHostPlatform) ''
54       "CC_${stdenv.targetPlatform.rust.cargoEnvVarTarget}=${ccForTarget}" \
55       "CXX_${stdenv.targetPlatform.rust.cargoEnvVarTarget}=${cxxForTarget}" \
56       "CARGO_TARGET_${stdenv.targetPlatform.rust.cargoEnvVarTarget}_LINKER=${ccForTarget}" \
57     '' + ''
58       "CC_${stdenv.hostPlatform.rust.cargoEnvVarTarget}=${ccForHost}" \
59       "CXX_${stdenv.hostPlatform.rust.cargoEnvVarTarget}=${cxxForHost}" \
60       "CARGO_TARGET_${stdenv.hostPlatform.rust.cargoEnvVarTarget}_LINKER=${ccForHost}" \
61     '' + ''
62       "CC_${stdenv.buildPlatform.rust.cargoEnvVarTarget}=${ccForBuild}" \
63       "CXX_${stdenv.buildPlatform.rust.cargoEnvVarTarget}=${cxxForBuild}" \
64       "CARGO_TARGET_${stdenv.buildPlatform.rust.cargoEnvVarTarget}_LINKER=${ccForBuild}" \
65       "CARGO_BUILD_TARGET=${rustBuildPlatform}" \
66       "HOST_CC=${pkgsBuildHost.stdenv.cc}/bin/cc" \
67       "HOST_CXX=${pkgsBuildHost.stdenv.cc}/bin/c++" \
68     '';
69   };
70 } // lib.mapAttrs (old: new: platform:
71   lib.warn "`rust.${old} platform` is deprecated. Use `platform.rust.${lib.showAttrPath new}` instead."
72     lib.getAttrFromPath new platform.rust)
74   toTargetArch = [ "platform" "arch" ];
75   toTargetOs = [ "platform" "os" ];
76   toTargetFamily = [ "platform" "target-family" ];
77   toTargetVendor = [ "platform" "vendor" ];
78   toRustTarget = [ "rustcTarget" ];
79   toRustTargetSpec = [ "rustcTargetSpec" ];
80   toRustTargetSpecShort = [ "cargoShortTarget" ];
81   toRustTargetForUseInEnvVars = [ "cargoEnvVarTarget" ];
82   IsNoStdTarget = [ "isNoStdTarget" ];