@ -56,8 +56,15 @@ rec {
# Return a modified stdenv that adds a cross compiler to the
# builds.
makeStdenvCross = stdenvOrig : cross : cc : let
stdenv = stdenvOrig . override {
makeStdenvCross = { stdenv
, cc
, buildPlatform , hostPlatform , targetPlatform
} @ overrideArgs : let
stdenv = overrideArgs . stdenv . override {
# TODO(@Ericson2314): Cannot do this for now because then Nix thinks the
# resulting derivation should be built on the host platform.
#hostPlatform = buildPlatform;
#targetPlatform = hostPlatform;
inherit cc ;
allowedRequisites = null ;
@ -70,7 +77,12 @@ rec {
mkDerivation =
{ name ? " " , buildInputs ? [ ] , nativeBuildInputs ? [ ]
, propagatedBuildInputs ? [ ] , propagatedNativeBuildInputs ? [ ]
, selfNativeBuildInput ? false , . . .
, configureFlags ? [ ]
, # Target is not included by default because most programs don't care.
# Including it then would cause needless massive rebuilds.
configurePlatforms ? args . crossAttrs . configurePlatforms or [ " b u i l d " " h o s t " ]
, selfNativeBuildInput ? args . crossAttrs . selfNativeBuildInput or false
, . . .
} @ args :
let
@ -93,16 +105,23 @@ rec {
nativeInputsFromBuildInputs = stdenv . lib . filter hostAsNativeDrv buildInputsNotNull ;
in
stdenv . mkDerivation ( args // {
name = name + " - " + cross . config ;
name = name + " - " + hostPlatform . config ;
nativeBuildInputs = nativeBuildInputs
++ nativeInputsFromBuildInputs
++ stdenv . lib . optional selfNativeBuildInput nativeDrv
# without proper `file` command, libtool sometimes fails
# to recognize 64-bit DLLs
++ stdenv . lib . optional ( cross . config == " x 8 6 _ 6 4 - w 6 4 - m i n g w 3 2 " ) pkgs . file
++ stdenv . lib . optional ( cross . config == " a a r c h 6 4 - l i n u x - g n u " ) pkgs . updateAutotoolsGnuConfigScriptsHook
++ stdenv . lib . optional ( hostPlatform . config == " x 8 6 _ 6 4 - w 6 4 - m i n g w 3 2 " ) pkgs . file
++ stdenv . lib . optional ( hostPlatform . config == " a a r c h 6 4 - l i n u x - g n u " ) pkgs . updateAutotoolsGnuConfigScriptsHook
;
# This parameter is sometimes a string and sometimes a list, yuck
configureFlags = let inherit ( stdenv . lib ) optional elem ; in
( if stdenv . lib . isString configureFlags then [ configureFlags ] else configureFlags )
++ optional ( elem " b u i l d " configurePlatforms ) " - - b u i l d = ${ buildPlatform . config } "
++ optional ( elem " h o s t " configurePlatforms ) " - - h o s t = ${ hostPlatform . config } "
++ optional ( elem " t a r g e t " configurePlatforms ) " - - t a r g e t = ${ targetPlatform . config } " ;
# Cross-linking dynamic libraries, every buildInput should
# be propagated because ld needs the -rpath-link to find
# any library needed to link the program dynamically at
@ -111,7 +130,7 @@ rec {
propagatedBuildInputs = propagatedBuildInputs ++ buildInputs ;
propagatedNativeBuildInputs = propagatedNativeBuildInputs ;
crossConfig = cross . config ;
crossConfig = hostPlatform . config ;
} // args . crossAttrs or { } ) ;
} ;