Merge pull request #50212 from matthewbauer/host-emulator

Add "emulator" function to systems
This commit is contained in:
Matthew Bauer 2018-11-29 19:34:20 -06:00 committed by GitHub
commit f435272ce3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 108 additions and 51 deletions

View File

@ -66,6 +66,46 @@ rec {
# uname -r
release = null;
};
qemuArch =
if final.isArm then "arm"
else if final.isx86_64 then "x86_64"
else if final.isx86 then "i386"
else {
"powerpc" = "ppc";
"powerpc64" = "ppc64";
"powerpc64le" = "ppc64";
"mips64" = "mips";
"mipsel64" = "mipsel";
}.${final.parsed.cpu.name} or final.parsed.cpu.name;
emulator = pkgs: let
qemu-user = pkgs.qemu.override {
smartcardSupport = false;
spiceSupport = false;
openGLSupport = false;
virglSupport = false;
vncSupport = false;
gtkSupport = false;
sdlSupport = false;
pulseSupport = false;
smbdSupport = false;
seccompSupport = false;
hostCpuTargets = ["${final.qemuArch}-linux-user"];
};
wine-name = "wine${toString final.parsed.cpu.bits}";
wine = (pkgs.winePackagesFor wine-name).minimal;
in
if final.parsed.kernel.name == pkgs.stdenv.hostPlatform.parsed.kernel.name &&
(final.parsed.cpu.name == pkgs.stdenv.hostPlatform.parsed.cpu.name ||
(final.platform.isi686 && pkgs.stdenv.hostPlatform.isx86_64))
then pkgs.runtimeShell
else if final.isWindows
then "${wine}/bin/${wine-name}"
else if final.isLinux && pkgs.stdenv.hostPlatform.isLinux
then "${qemu-user}/bin/qemu-${final.qemuArch}"
else throw "Don't know how to run ${final.config} executables.";
} // mapAttrs (n: v: v final.parsed) inspect.predicates
// args;
in assert final.useAndroidPrebuilt -> final.isAndroid;

View File

@ -2,7 +2,14 @@
# `crossSystem`. They are put here for user convenience, but also used by cross
# tests and linux cross stdenv building, so handle with care!
{ lib }:
let platforms = import ./platforms.nix { inherit lib; }; in
let
platforms = import ./platforms.nix { inherit lib; };
riscv = bits: {
config = "riscv${bits}-unknown-linux-gnu";
platform = platforms.riscv-multiplatform bits;
};
in
rec {
#
@ -92,10 +99,6 @@ rec {
musl64 = { config = "x86_64-unknown-linux-musl"; };
musl32 = { config = "i686-unknown-linux-musl"; };
riscv = bits: {
config = "riscv${bits}-unknown-linux-gnu";
platform = platforms.riscv-multiplatform bits;
};
riscv64 = riscv "64";
riscv32 = riscv "32";

View File

@ -18,6 +18,10 @@
, virglSupport ? openGLSupport, virglrenderer
, smbdSupport ? false, samba
, hostCpuOnly ? false
, hostCpuTargets ? (if hostCpuOnly
then (stdenv.lib.optional stdenv.isx86_64 "i386-softmmu"
++ ["${stdenv.hostPlatform.qemuArch}-softmmu"])
else null)
, nixosTestRunner ? false
}:
@ -27,11 +31,6 @@ let
+ optionalString pulseSupport "pa,"
+ optionalString sdlSupport "sdl,";
hostCpuTargets = if stdenv.isx86_64 then "i386-softmmu,x86_64-softmmu"
else if stdenv.isi686 then "i386-softmmu"
else if stdenv.isAarch32 then "arm-softmmu"
else if stdenv.isAarch64 then "aarch64-softmmu"
else throw "Don't know how to build a 'hostCpuOnly = true' QEMU";
in
stdenv.mkDerivation rec {
@ -113,7 +112,7 @@ stdenv.mkDerivation rec {
++ optional smartcardSupport "--enable-smartcard"
++ optional spiceSupport "--enable-spice"
++ optional usbredirSupport "--enable-usb-redir"
++ optional hostCpuOnly "--target-list=${hostCpuTargets}"
++ optional (hostCpuTargets != null) "--target-list=${stdenv.lib.concatStringsSep "," hostCpuTargets}"
++ optional stdenv.isDarwin "--enable-cocoa"
++ optional stdenv.isLinux "--enable-linux-aio"
++ optional gtkSupport "--enable-gtk"
@ -135,12 +134,13 @@ stdenv.mkDerivation rec {
'';
# Add a qemu-kvm wrapper for compatibility/convenience.
postInstall =
if stdenv.isx86_64 then ''makeWrapper $out/bin/qemu-system-x86_64 $out/bin/qemu-kvm --add-flags "\$([ -e /dev/kvm ] && echo -enable-kvm)"''
else if stdenv.isi686 then ''makeWrapper $out/bin/qemu-system-i386 $out/bin/qemu-kvm --add-flags "\$([ -e /dev/kvm ] && echo -enable-kvm)"''
else if stdenv.isAarch32 then ''makeWrapper $out/bin/qemu-system-arm $out/bin/qemu-kvm --add-flags "\$([ -e /dev/kvm ] && echo -enable-kvm)"''
else if stdenv.isAarch64 then ''makeWrapper $out/bin/qemu-system-aarch64 $out/bin/qemu-kvm --add-flags "\$([ -e /dev/kvm ] && echo -enable-kvm)"''
else "";
postInstall = ''
if [ -x $out/bin/qemu-system-${stdenv.hostPlatform.qemuArch} ]; then
makeWrapper $out/bin/qemu-system-${stdenv.hostPlatform.qemuArch} \
$out/bin/qemu-kvm \
--add-flags "\$([ -e /dev/kvm ] && echo -enable-kvm)"
fi
'';
passthru = {
qemu-system-i386 = "bin/qemu-system-i386";

View File

@ -1,5 +1,6 @@
{ stdenv, fetchurl, python, pkgconfig, readline, libxslt
, docbook_xsl, docbook_xml_dtd_42, fixDarwinDylibNames
, buildPackages
}:
stdenv.mkDerivation rec {
@ -10,10 +11,9 @@ stdenv.mkDerivation rec {
sha256 = "1kk76dyav41ip7ddbbf04yfydb4jvywzi2ps0z2vla56aqkn11di";
};
nativeBuildInputs = [ pkgconfig fixDarwinDylibNames ];
buildInputs = [
python readline libxslt docbook_xsl docbook_xml_dtd_42
];
nativeBuildInputs = [ pkgconfig fixDarwinDylibNames python
docbook_xsl docbook_xml_dtd_42 ];
buildInputs = [ readline libxslt ];
prePatch = ''
patchShebangs buildtools/bin/waf
@ -23,10 +23,14 @@ stdenv.mkDerivation rec {
"--enable-talloc-compat1"
"--bundled-libraries=NONE"
"--builtin-libraries=replace"
] ++ stdenv.lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [
"--cross-compile"
"--cross-execute=${stdenv.hostPlatform.emulator buildPackages}"
];
configurePlatforms = [];
postInstall = ''
ar q $out/lib/libtalloc.a bin/default/talloc_[0-9]*.o
${stdenv.cc.targetPrefix}ar q $out/lib/libtalloc.a bin/default/talloc_[0-9]*.o
'';
meta = with stdenv.lib; {

View File

@ -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
'';
mapMultiPlatformTest = test: lib.mapAttrs (name: system: test rec {
crossPkgs = import pkgs.path {
localSystem = { inherit (pkgs.hostPlatform) config; };
crossSystem = system;
};
emulator = crossPkgs.hostPlatform.emulator pkgs;
# Apply some transformation on windows to get dlls in the right
# place. Unfortunately mingw doesnt 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;
in
lib.mapAttrs (name: emulator: let
crossPkgs = pkgsCross.${name};
lib.mapAttrs (_: mapMultiPlatformTest) {
# Apply some transformation on windows to get dlls in the right
# place. Unfortunately mingw doesnt 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 {
hello = compareTest {
inherit emulator crossPkgs;
hostPkgs = pkgs;
exec = "/bin/hello";
pkgFun = pkgs: pkgs.hello;
};
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;
};
}

View File

@ -12533,7 +12533,7 @@ with pkgs;
taglib-sharp = callPackage ../development/libraries/taglib-sharp { };
talloc = callPackage ../development/libraries/talloc {
python = python2;
python = buildPackages.python2;
};
tclap = callPackage ../development/libraries/tclap {};

View File

@ -54,7 +54,7 @@ rec {
# More poor man's memoisation
pkgsForCross = let
examplesByConfig = lib.flip lib.mapAttrs'
(builtins.removeAttrs lib.systems.examples [ "riscv" ])
lib.systems.examples
(_: crossSystem: nameValuePair crossSystem.config {
inherit crossSystem;
pkgsFor = mkPkgsFor crossSystem;