From c739c420db5b9d56c335414be1696c57f2dbbb6a Mon Sep 17 00:00:00 2001 From: John Ericson Date: Sun, 24 Nov 2019 23:07:20 +0000 Subject: [PATCH] Add support for cross compiling to `js-ghcjs` This platform doesn't have a C compiler, and so relies and the changes in the previous commit to work. --- lib/systems/doubles.nix | 2 ++ pkgs/stdenv/booter.nix | 9 ++++++--- pkgs/stdenv/cross/default.nix | 8 +++++++- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/lib/systems/doubles.nix b/lib/systems/doubles.nix index 58cff18e648..f07e9da33bc 100644 --- a/lib/systems/doubles.nix +++ b/lib/systems/doubles.nix @@ -27,6 +27,8 @@ let "riscv32-linux" "riscv64-linux" "aarch64-none" "avr-none" "arm-none" "i686-none" "x86_64-none" "powerpc-none" "msp430-none" "riscv64-none" "riscv32-none" + + "js-ghcjs" ]; allParsed = map parse.mkSystemFromString all; diff --git a/pkgs/stdenv/booter.nix b/pkgs/stdenv/booter.nix index 1df05099fbf..8a574652204 100644 --- a/pkgs/stdenv/booter.nix +++ b/pkgs/stdenv/booter.nix @@ -121,9 +121,12 @@ stageFuns: let postStage = buildPackages: { __raw = true; stdenv.cc = - if buildPackages.stdenv.cc.isClang or false - then buildPackages.clang - else buildPackages.gcc; + if buildPackages.stdenv.hasCC + then + if buildPackages.stdenv.cc.isClang or false + then buildPackages.clang + else buildPackages.gcc + else buildPackages.stdenv.cc; }; in dfold folder postStage (_: {}) withAllowCustomOverrides diff --git a/pkgs/stdenv/cross/default.nix b/pkgs/stdenv/cross/default.nix index 4e5c4cc2e83..44d412e041b 100644 --- a/pkgs/stdenv/cross/default.nix +++ b/pkgs/stdenv/cross/default.nix @@ -51,12 +51,18 @@ in lib.init bootStages ++ [ extraBuildInputs = [ ]; # Old ones run on wrong platform allowedRequisites = null; + hasCC = !targetPlatform.isGhcjs; + cc = if crossSystem.useiOSPrebuilt or false then buildPackages.darwin.iosSdkPkgs.clang else if crossSystem.useAndroidPrebuilt or false then buildPackages."androidndkPkgs_${crossSystem.ndkVer}".clang else if targetPlatform.isGhcjs - then null + # Need to use `throw` so tryEval for splicing works, ugh. Using + # `null` or skipping the attribute would cause an eval failure + # `tryEval` wouldn't catch, wrecking accessing previous stages + # when there is a C compiler and everything should be fine. + then throw "no C compile provided for this platform" else if crossSystem.useLLVM or false then buildPackages.llvmPackages_8.lldClang else buildPackages.gcc;