From 74753d01f8249ab1119314fa3d8ac60ccf6e601e Mon Sep 17 00:00:00 2001 From: John Ericson Date: Sun, 25 Dec 2016 08:11:12 -0800 Subject: [PATCH 1/4] release-cross: Reformat to be far more legible --- pkgs/top-level/release-cross.nix | 170 +++++++++++++++---------------- 1 file changed, 80 insertions(+), 90 deletions(-) diff --git a/pkgs/top-level/release-cross.nix b/pkgs/top-level/release-cross.nix index f670eaea98a7..9b6d509eae99 100644 --- a/pkgs/top-level/release-cross.nix +++ b/pkgs/top-level/release-cross.nix @@ -20,39 +20,34 @@ let basic = basicCrossDrv // basicNativeDrv; in -( -/* Test some cross builds to the Sheevaplug */ -let - crossSystem = { - config = "armv5tel-unknown-linux-gnueabi"; - bigEndian = false; - arch = "arm"; - float = "soft"; - withTLS = true; - platform = pkgs.platforms.sheevaplug; - libc = "glibc"; - openssl.system = "linux-generic32"; - }; +{ + /* Test some cross builds to the Sheevaplug */ + crossSheevaplugLinux = let + crossSystem = { + config = "armv5tel-unknown-linux-gnueabi"; + bigEndian = false; + arch = "arm"; + float = "soft"; + withTLS = true; + platform = pkgs.platforms.sheevaplug; + libc = "glibc"; + openssl.system = "linux-generic32"; + }; + in mapTestOnCross crossSystem (basic // { + ubootSheevaplug.crossDrv = nativePlatforms; + }); -in { - crossSheevaplugLinux = mapTestOnCross crossSystem ( - basic // - { - ubootSheevaplug.crossDrv = nativePlatforms; - }); -}) // ( -/* Test some cross builds on 32 bit mingw-w64 */ -let - crossSystem = { + /* Test some cross builds on 32 bit mingw-w64 */ + crossMingw32 = let + crossSystem = { config = "i686-w64-mingw32"; arch = "x86"; # Irrelevant libc = "msvcrt"; # This distinguishes the mingw (non posix) toolchain platform = {}; - }; -in { - crossMingw32 = mapTestOnCross crossSystem { + }; + in mapTestOnCross crossSystem { coreutils.crossDrv = nativePlatforms; boehmgc.crossDrv = nativePlatforms; gmp.crossDrv = nativePlatforms; @@ -62,19 +57,18 @@ in { libunistring.crossDrv = nativePlatforms; windows.wxMSW.crossDrv = nativePlatforms; }; -}) // ( -/* Test some cross builds on 64 bit mingw-w64 */ -let - crossSystem = { + + /* Test some cross builds on 64 bit mingw-w64 */ + crossMingwW64 = let + crossSystem = { # That's the triplet they use in the mingw-w64 docs. config = "x86_64-w64-mingw32"; arch = "x86_64"; # Irrelevant libc = "msvcrt"; # This distinguishes the mingw (non posix) toolchain platform = {}; - }; -in { - crossMingwW64 = mapTestOnCross crossSystem { + }; + in mapTestOnCross crossSystem { coreutils.crossDrv = nativePlatforms; boehmgc.crossDrv = nativePlatforms; gmp.crossDrv = nativePlatforms; @@ -84,63 +78,60 @@ in { libunistring.crossDrv = nativePlatforms; windows.wxMSW.crossDrv = nativePlatforms; }; -}) // ( -/* Linux on the fuloong */ -let - crossSystem = { - config = "mips64el-unknown-linux"; - bigEndian = false; - arch = "mips"; - float = "hard"; - withTLS = true; - libc = "glibc"; - platform = { - name = "fuloong-minipc"; - kernelMajor = "2.6"; - kernelBaseConfig = "lemote2f_defconfig"; - kernelHeadersBaseConfig = "fuloong2e_defconfig"; - uboot = null; - kernelArch = "mips"; - kernelAutoModules = false; - kernelTarget = "vmlinux"; - }; - openssl.system = "linux-generic32"; - gcc = { - arch = "loongson2f"; - abi = "n32"; - }; - }; -in { - fuloongminipc = mapTestOnCross crossSystem { + /* Linux on the fuloong */ + fuloongminipc = let + crossSystem = { + config = "mips64el-unknown-linux"; + bigEndian = false; + arch = "mips"; + float = "hard"; + withTLS = true; + libc = "glibc"; + platform = { + name = "fuloong-minipc"; + kernelMajor = "2.6"; + kernelBaseConfig = "lemote2f_defconfig"; + kernelHeadersBaseConfig = "fuloong2e_defconfig"; + uboot = null; + kernelArch = "mips"; + kernelAutoModules = false; + kernelTarget = "vmlinux"; + }; + openssl.system = "linux-generic32"; + gcc = { + arch = "loongson2f"; + abi = "n32"; + }; + }; + in mapTestOnCross crossSystem { coreutils.crossDrv = nativePlatforms; ed.crossDrv = nativePlatforms; patch.crossDrv = nativePlatforms; }; -}) // ( -/* Linux on Raspberrypi */ -let - crossSystem = { - config = "armv6l-unknown-linux-gnueabi"; - bigEndian = false; - arch = "arm"; - float = "hard"; - fpu = "vfp"; - withTLS = true; - libc = "glibc"; - platform = pkgs.platforms.raspberrypi; - openssl.system = "linux-generic32"; - gcc = { - arch = "armv6"; + + /* Linux on Raspberrypi */ + rpi = let + crossSystem = { + config = "armv6l-unknown-linux-gnueabi"; + bigEndian = false; + arch = "arm"; + float = "hard"; fpu = "vfp"; - float = "softfp"; - abi = "aapcs-linux"; + withTLS = true; + libc = "glibc"; + platform = pkgs.platforms.raspberrypi; + openssl.system = "linux-generic32"; + gcc = { + arch = "armv6"; + fpu = "vfp"; + float = "softfp"; + abi = "aapcs-linux"; + }; }; - }; -in { - rpi = mapTestOnCross crossSystem { + in mapTestOnCross crossSystem { coreutils.crossDrv = nativePlatforms; ed.crossDrv = nativePlatforms; patch.crossDrv = nativePlatforms; @@ -152,13 +143,12 @@ in { binutils.crossDrv = nativePlatforms; mpg123.crossDrv = nativePlatforms; }; -}) // ( -/* Cross-built bootstrap tools for every supported platform */ -let - tools = import ../stdenv/linux/make-bootstrap-tools-cross.nix { system = "x86_64-linux"; }; - maintainers = [ pkgs.lib.maintainers.dezgeg ]; - mkBootstrapToolsJob = bt: hydraJob' (pkgs.lib.addMetaAttrs { inherit maintainers; } bt.dist); -in { - bootstrapTools = pkgs.lib.mapAttrs (name: mkBootstrapToolsJob) tools; -}) + + /* Cross-built bootstrap tools for every supported platform */ + bootstrapTools = let + tools = import ../stdenv/linux/make-bootstrap-tools-cross.nix { system = "x86_64-linux"; }; + maintainers = [ pkgs.lib.maintainers.dezgeg ]; + mkBootstrapToolsJob = bt: hydraJob' (pkgs.lib.addMetaAttrs { inherit maintainers; } bt.dist); + in pkgs.lib.mapAttrs (name: mkBootstrapToolsJob) tools; +} From db0dbd0b81cdcb879186645a3eec47a9882f2366 Mon Sep 17 00:00:00 2001 From: John Ericson Date: Sun, 25 Dec 2016 10:17:03 -0800 Subject: [PATCH 2/4] release-cross: Use the same genAttrs logic for `testOnCross` as `testOn` Eventually we'll want to test cross-compiling *from* various platforms. For now, its good to be consistent. --- pkgs/top-level/release-cross.nix | 2 +- pkgs/top-level/release-lib.nix | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/pkgs/top-level/release-cross.nix b/pkgs/top-level/release-cross.nix index 9b6d509eae99..cbafc65195db 100644 --- a/pkgs/top-level/release-cross.nix +++ b/pkgs/top-level/release-cross.nix @@ -1,4 +1,4 @@ -with import ./release-lib.nix { supportedSystems = []; }; +with import ./release-lib.nix { supportedSystems = [ builtins.currentSystem ]; }; let nativePlatforms = linux; diff --git a/pkgs/top-level/release-lib.nix b/pkgs/top-level/release-lib.nix index 5f6dd49d6ecc..fba8429c9c70 100644 --- a/pkgs/top-level/release-lib.nix +++ b/pkgs/top-level/release-lib.nix @@ -59,10 +59,9 @@ rec { /* Similar to the testOn function, but with an additional 'crossSystem' parameter for allPackages, defining the target platform for cross builds. */ - testOnCross = crossSystem: systems: f: {system ? builtins.currentSystem}: - if elem system systems - then f (allPackages { inherit system crossSystem; }) - else {}; + testOnCross = crossSystem: systems: f: genAttrs + (filter (x: elem x supportedSystems) systems) + (system: hydraJob' (f (allPackages { inherit system crossSystem; }))); /* Given a nested set where the leaf nodes are lists of platforms, From 916012121cb950d66ab04ff62eff16b2d94edb7f Mon Sep 17 00:00:00 2001 From: John Ericson Date: Sun, 25 Dec 2016 10:38:37 -0800 Subject: [PATCH 3/4] release-cross: Factor out system filtering --- pkgs/top-level/release-lib.nix | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pkgs/top-level/release-lib.nix b/pkgs/top-level/release-lib.nix index fba8429c9c70..5fe87711c016 100644 --- a/pkgs/top-level/release-lib.nix +++ b/pkgs/top-level/release-lib.nix @@ -46,21 +46,22 @@ rec { interested in the result of cross building a package. */ crossMaintainers = [ maintainers.viric ]; + forAllSupportedSystems = systems: f: + genAttrs (filter (x: elem x supportedSystems) systems) f; /* Build a package on the given set of platforms. The function `f' is called for each supported platform with Nixpkgs for that platform as an argument . We return an attribute set containing a derivation for each supported platform, i.e. ‘{ x86_64-linux = f pkgs_x86_64_linux; i686-linux = f pkgs_i686_linux; ... }’. */ - testOn = systems: f: genAttrs - (filter (x: elem x supportedSystems) systems) (system: hydraJob' (f (pkgsFor system))); + testOn = systems: f: forAllSupportedSystems systems + (system: hydraJob' (f (pkgsFor system))); /* Similar to the testOn function, but with an additional 'crossSystem' parameter for allPackages, defining the target platform for cross builds. */ - testOnCross = crossSystem: systems: f: genAttrs - (filter (x: elem x supportedSystems) systems) + testOnCross = crossSystem: systems: f: forAllSupportedSystems systems (system: hydraJob' (f (allPackages { inherit system crossSystem; }))); From 1d0e91831be906e63bdcd9d32ff721b67462699b Mon Sep 17 00:00:00 2001 From: John Ericson Date: Sun, 25 Dec 2016 10:50:53 -0800 Subject: [PATCH 4/4] release-cross: Test for unchanged native derivations These derivations do not care about the target platform, and thus should not be affected by cross-compiling. Currently, these tests *fail*, but they will be fixed soon by a latter PR. The release-cross job doesn't block a channel, so this should be no problem. --- pkgs/top-level/release-cross.nix | 36 ++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/pkgs/top-level/release-cross.nix b/pkgs/top-level/release-cross.nix index cbafc65195db..de64c2b3cc7d 100644 --- a/pkgs/top-level/release-cross.nix +++ b/pkgs/top-level/release-cross.nix @@ -1,5 +1,7 @@ with import ./release-lib.nix { supportedSystems = [ builtins.currentSystem ]; }; let + lib = import ../../lib; + nativePlatforms = linux; /* Basic list of packages to cross-build */ @@ -22,6 +24,40 @@ let in { + # These `nativeDrv`s should be identical to their vanilla ones --- cross + # compiling should not affect the native derivation. + ensureUnaffected = let + # Absurd values are fine here, as we are not building anything. In fact, + # there probably a good idea to try to be "more parametric" --- i.e. avoid + # any special casing. + crossSystem = { + config = "foosys"; + libc = "foolibc"; + }; + + # Converting to a string (drv path) before checking equality is probably a + # good idea lest there be some irrelevant pass-through debug attrs that + # cause false negatives. + testEqualOne = path: system: let + f = attrs: builtins.toString (lib.getAttrFromPath path (allPackages attrs)); + in assert f { inherit system; } == f { inherit system crossSystem; }; true; + + testEqual = path: systems: forAllSupportedSystems systems (testEqualOne path); + + mapTestEqual = lib.mapAttrsRecursive testEqual; + + in mapTestEqual { + boehmgc = nativePlatforms; + libffi = nativePlatforms; + libiconv = nativePlatforms; + libtool = nativePlatforms; + zlib = nativePlatforms; + readline = nativePlatforms; + libxml2 = nativePlatforms; + guile = nativePlatforms; + }; + + /* Test some cross builds to the Sheevaplug */ crossSheevaplugLinux = let crossSystem = {