rust: allow linker to be different from compiler

authored by Yureka and committed by Alyssa Ross b8076b89 7fe20b91

+12 -8
+2 -2
pkgs/build-support/rust/hooks/default.nix
··· 66 66 67 67 cargoConfig = '' 68 68 [target."${stdenv.buildPlatform.rust.rustcTarget}"] 69 - "linker" = "${rust.envVars.ccForBuild}" 69 + "linker" = "${rust.envVars.linkerForBuild}" 70 70 ${lib.optionalString (stdenv.buildPlatform.config != stdenv.hostPlatform.config) '' 71 71 [target."${stdenv.hostPlatform.rust.rustcTarget}"] 72 - "linker" = "${rust.envVars.ccForHost}" 72 + "linker" = "${rust.envVars.linkerForHost}" 73 73 ''} 74 74 "rustflags" = [ "-C", "target-feature=${if stdenv.hostPlatform.isStatic then "+" else "-"}crt-static" ] 75 75 '';
+10 -6
pkgs/build-support/rust/lib/default.nix
··· 14 14 envVars = let 15 15 ccForBuild = "${buildPackages.stdenv.cc}/bin/${buildPackages.stdenv.cc.targetPrefix}cc"; 16 16 cxxForBuild = "${buildPackages.stdenv.cc}/bin/${buildPackages.stdenv.cc.targetPrefix}c++"; 17 + linkerForBuild = ccForBuild; 18 + 17 19 ccForHost = "${stdenv.cc}/bin/${stdenv.cc.targetPrefix}cc"; 18 20 cxxForHost = "${stdenv.cc}/bin/${stdenv.cc.targetPrefix}c++"; 21 + linkerForHost = ccForHost; 19 22 20 23 # Unfortunately we must use the dangerous `targetPackages` here 21 24 # because hooks are artificially phase-shifted one slot earlier ··· 23 26 # a targetPlatform to them). 24 27 ccForTarget = "${targetPackages.stdenv.cc}/bin/${targetPackages.stdenv.cc.targetPrefix}cc"; 25 28 cxxForTarget = "${targetPackages.stdenv.cc}/bin/${targetPackages.stdenv.cc.targetPrefix}c++"; 29 + linkerForTarget = ccForTarget; 26 30 27 31 rustBuildPlatform = stdenv.buildPlatform.rust.rustcTarget; 28 32 rustBuildPlatformSpec = stdenv.buildPlatform.rust.rustcTargetSpec; ··· 32 36 rustTargetPlatformSpec = stdenv.targetPlatform.rust.rustcTargetSpec; 33 37 in { 34 38 inherit 35 - ccForBuild cxxForBuild rustBuildPlatform rustBuildPlatformSpec 36 - ccForHost cxxForHost rustHostPlatform rustHostPlatformSpec 37 - ccForTarget cxxForTarget rustTargetPlatform rustTargetPlatformSpec; 39 + ccForBuild cxxForBuild linkerForBuild rustBuildPlatform rustBuildPlatformSpec 40 + ccForHost cxxForHost linkerForHost rustHostPlatform rustHostPlatformSpec 41 + ccForTarget cxxForTarget linkerForTarget rustTargetPlatform rustTargetPlatformSpec; 38 42 39 43 # Prefix this onto a command invocation in order to set the 40 44 # variables needed by cargo. ··· 50 54 + lib.optionalString (rustTargetPlatform != rustHostPlatform) '' 51 55 "CC_${stdenv.targetPlatform.rust.cargoEnvVarTarget}=${ccForTarget}" \ 52 56 "CXX_${stdenv.targetPlatform.rust.cargoEnvVarTarget}=${cxxForTarget}" \ 53 - "CARGO_TARGET_${stdenv.targetPlatform.rust.cargoEnvVarTarget}_LINKER=${ccForTarget}" \ 57 + "CARGO_TARGET_${stdenv.targetPlatform.rust.cargoEnvVarTarget}_LINKER=${linkerForTarget}" \ 54 58 '' + '' 55 59 "CC_${stdenv.hostPlatform.rust.cargoEnvVarTarget}=${ccForHost}" \ 56 60 "CXX_${stdenv.hostPlatform.rust.cargoEnvVarTarget}=${cxxForHost}" \ 57 - "CARGO_TARGET_${stdenv.hostPlatform.rust.cargoEnvVarTarget}_LINKER=${ccForHost}" \ 61 + "CARGO_TARGET_${stdenv.hostPlatform.rust.cargoEnvVarTarget}_LINKER=${linkerForHost}" \ 58 62 '' + '' 59 63 "CC_${stdenv.buildPlatform.rust.cargoEnvVarTarget}=${ccForBuild}" \ 60 64 "CXX_${stdenv.buildPlatform.rust.cargoEnvVarTarget}=${cxxForBuild}" \ 61 - "CARGO_TARGET_${stdenv.buildPlatform.rust.cargoEnvVarTarget}_LINKER=${ccForBuild}" \ 65 + "CARGO_TARGET_${stdenv.buildPlatform.rust.cargoEnvVarTarget}_LINKER=${linkerForBuild}" \ 62 66 "CARGO_BUILD_TARGET=${rustBuildPlatform}" \ 63 67 "HOST_CC=${buildPackages.stdenv.cc}/bin/cc" \ 64 68 "HOST_CXX=${buildPackages.stdenv.cc}/bin/c++" \