diff options
-rw-r--r-- | lib/systems/default.nix | 40 | ||||
-rw-r--r-- | lib/systems/examples.nix | 13 | ||||
-rw-r--r-- | pkgs/applications/virtualization/qemu/default.nix | 24 | ||||
-rw-r--r-- | pkgs/development/libraries/talloc/default.nix | 14 | ||||
-rw-r--r-- | pkgs/test/cross/default.nix | 62 | ||||
-rw-r--r-- | pkgs/top-level/all-packages.nix | 2 | ||||
-rw-r--r-- | pkgs/top-level/release-lib.nix | 2 |
7 files changed, 107 insertions, 50 deletions
diff --git a/lib/systems/default.nix b/lib/systems/default.nix index 0b3475fefb9..25df5e17406 100644 --- a/lib/systems/default.nix +++ b/lib/systems/default.nix @@ -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; diff --git a/lib/systems/examples.nix b/lib/systems/examples.nix index acd673df666..c799b9ec449 100644 --- a/lib/systems/examples.nix +++ b/lib/systems/examples.nix @@ -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"; diff --git a/pkgs/applications/virtualization/qemu/default.nix b/pkgs/applications/virtualization/qemu/default.nix index d9495bd984e..ea330d59555 100644 --- a/pkgs/applications/virtualization/qemu/default.nix +++ b/pkgs/applications/virtualization/qemu/default.nix @@ -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"; diff --git a/pkgs/development/libraries/talloc/default.nix b/pkgs/development/libraries/talloc/default.nix index 7c758d29835..74558760935 100644 --- a/pkgs/development/libraries/talloc/default.nix +++ b/pkgs/development/libraries/talloc/default.nix @@ -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; { diff --git a/pkgs/test/cross/default.nix b/pkgs/test/cross/default.nix index 6f41447ca76..622799106cd 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; + }; + +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 522eb613f1b..267039c37a7 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -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 {}; diff --git a/pkgs/top-level/release-lib.nix b/pkgs/top-level/release-lib.nix index 957de2dcc30..7e7cac95b9c 100644 --- a/pkgs/top-level/release-lib.nix +++ b/pkgs/top-level/release-lib.nix @@ -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; |