Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
206 changes: 116 additions & 90 deletions pkgs/top-level/release-cross.nix
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
with import ./release-lib.nix { supportedSystems = []; };
with import ./release-lib.nix { supportedSystems = [ builtins.currentSystem ]; };
let
lib = import ../../lib;

nativePlatforms = linux;

/* Basic list of packages to cross-build */
Expand All @@ -20,39 +22,68 @@ 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";
{
# 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;
};

in {
crossSheevaplugLinux = mapTestOnCross crossSystem (
basic //
{
ubootSheevaplug.crossDrv = nativePlatforms;
});
}) // (

/* Test some cross builds on 32 bit mingw-w64 */
let
crossSystem = {
/* 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;
});


/* 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;
Expand All @@ -62,19 +93,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;
Expand All @@ -84,63 +114,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;
Expand All @@ -152,13 +179,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;
}
12 changes: 6 additions & 6 deletions pkgs/top-level/release-lib.nix
Original file line number Diff line number Diff line change
Expand Up @@ -46,23 +46,23 @@ 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: {system ? builtins.currentSystem}:
if elem system systems
then f (allPackages { inherit system crossSystem; })
else {};
testOnCross = crossSystem: systems: f: forAllSupportedSystems systems
(system: hydraJob' (f (allPackages { inherit system crossSystem; })));


/* Given a nested set where the leaf nodes are lists of platforms,
Expand Down