diff options
author | Matthew Bauer <mjbauer95@gmail.com> | 2018-11-13 16:54:08 -0600 |
---|---|---|
committer | Matthew Bauer <mjbauer95@gmail.com> | 2018-11-29 19:15:30 -0600 |
commit | 9c8fd412248ad907eee7547b19bf3f7583d2c411 (patch) | |
tree | 0db9bedd232a22f0c17c4d7c9f101d9ddaeed160 /pkgs/test/cross/default.nix | |
parent | ce6d558c4deebf373eae8723cfb7c181be2be9be (diff) | |
download | nixlib-9c8fd412248ad907eee7547b19bf3f7583d2c411.tar nixlib-9c8fd412248ad907eee7547b19bf3f7583d2c411.tar.gz nixlib-9c8fd412248ad907eee7547b19bf3f7583d2c411.tar.bz2 nixlib-9c8fd412248ad907eee7547b19bf3f7583d2c411.tar.lz nixlib-9c8fd412248ad907eee7547b19bf3f7583d2c411.tar.xz nixlib-9c8fd412248ad907eee7547b19bf3f7583d2c411.tar.zst nixlib-9c8fd412248ad907eee7547b19bf3f7583d2c411.zip |
treewide: add emulator to platform
You can use stdenv.hostPlatform.emulator to get an executable that runs cross-built binaries. This could be any emulator. For instance, we use QEMU to emulate Linux targets and Wine to emulate Windows targets. To work with qemu, we need to support custom targets. I’ve reworked the cross tests in pkgs/test/cross to use this functionality. Also, I’ve used talloc to cross-execute with the emulator. There appears to be a cross-execute for all waf builds. In the future, it would be nice to set this for all waf builds. Adds stdenv.hostPlatform.qemuArch attrbute to get the qemuArch for each platform.
Diffstat (limited to 'pkgs/test/cross/default.nix')
-rw-r--r-- | pkgs/test/cross/default.nix | 62 |
1 files changed, 36 insertions, 26 deletions
diff --git a/pkgs/test/cross/default.nix b/pkgs/test/cross/default.nix index 6f41447ca76a..622799106cd2 100644 --- a/pkgs/test/cross/default.nix +++ b/pkgs/test/cross/default.nix @@ -1,12 +1,11 @@ -{ pkgs, pkgsCross, lib }: +{ pkgs, lib }: let - emulators = { - mingw32 = "WINEDEBUG=-all ${pkgs.winePackages.minimal}/bin/wine"; - mingwW64 = "WINEDEBUG=-all ${pkgs.wineWowPackages.minimal}/bin/wine"; - # TODO: add some qemu-based emulaltors here - }; + testedSystems = lib.filterAttrs (name: value: let + platform = lib.systems.elaborate value; + in platform.isLinux || platform.isWindows + ) lib.systems.examples; getExecutable = pkgs: pkgFun: exec: "${pkgFun pkgs}${exec}${pkgs.hostPlatform.extensions.executable}"; @@ -17,6 +16,10 @@ let in pkgs.runCommand "test-${pkgName}-${crossPkgs.hostPlatform.config}" { nativeBuildInputs = [ pkgs.dos2unix ]; } '' + # Just in case we are using wine, get rid of that annoying extra + # stuff. + export WINEDEBUG=-all + HOME=$(pwd) mkdir -p $out @@ -44,29 +47,29 @@ let fi ''; -in + mapMultiPlatformTest = test: lib.mapAttrs (name: system: test rec { + crossPkgs = import pkgs.path { + localSystem = { inherit (pkgs.hostPlatform) config; }; + crossSystem = system; + }; -lib.mapAttrs (name: emulator: let - crossPkgs = pkgsCross.${name}; + emulator = crossPkgs.hostPlatform.emulator pkgs; - # Apply some transformation on windows to get dlls in the right - # place. Unfortunately mingw doesn’t seem to be able to do linking - # properly. - platformFun = pkg: if crossPkgs.hostPlatform.isWindows then - pkgs.buildEnv { - name = "${pkg.name}-winlinks"; - paths = [pkg] ++ pkg.buildInputs; - } else pkg; -in { + # Apply some transformation on windows to get dlls in the right + # place. Unfortunately mingw doesn’t seem to be able to do linking + # properly. + platformFun = pkg: if crossPkgs.hostPlatform.isWindows then + pkgs.buildEnv { + name = "${pkg.name}-winlinks"; + paths = [pkg] ++ pkg.buildInputs; + } else pkg; + }) testedSystems; - hello = compareTest { - inherit emulator crossPkgs; - hostPkgs = pkgs; - exec = "/bin/hello"; - pkgFun = pkgs: pkgs.hello; - }; +in + +lib.mapAttrs (_: mapMultiPlatformTest) { - file = compareTest { + file = {platformFun, crossPkgs, emulator}: compareTest { inherit emulator crossPkgs; hostPkgs = pkgs; exec = "/bin/file"; @@ -77,4 +80,11 @@ in { pkgFun = pkgs: platformFun pkgs.file; }; -}) emulators + hello = {platformFun, crossPkgs, emulator}: compareTest { + inherit emulator crossPkgs; + hostPkgs = pkgs; + exec = "/bin/hello"; + pkgFun = pkgs: pkgs.hello; + }; + +} |