Enabling cross-builds with uclibc again (I had that too much abandoned).

Hydra now should even test it.


svn path=/nixpkgs/trunk/; revision=20500
This commit is contained in:
Lluís Batlle i Rossell 2010-03-09 15:48:25 +00:00
parent 67e7ad56d7
commit 1522caa556
4 changed files with 52 additions and 27 deletions

View File

@ -1,17 +1,17 @@
{stdenv, fetchurl, linuxHeaders, gccCross ? null}:
{stdenv, fetchurl, linuxHeaders, cross ? null, gccCross ? null}:
assert stdenv.isLinux;
assert cross != null -> gccCross != null;
let
target = if (gccCross != null) then gccCross.target else null;
enableArmEABI = (target == null && stdenv.system "armv5tel-linux")
|| (target != null && target.arch == "arm");
enableArmEABI = (cross == null && stdenv.platform.kernelArch == "arm")
|| (cross != null && cross.arch == "arm");
configArmEABI = if enableArmEABI then
''-e 's/.*CONFIG_ARM_OABI.*//' \
-e 's/.*CONFIG_ARM_EABI.*/CONFIG_ARM_EABI=y/' '' else "";
enableBigEndian = (target != null && target.bigEndian);
enableBigEndian = (cross != null && cross.bigEndian);
configBigEndian = if enableBigEndian then ""
else
@ -19,12 +19,12 @@ let
-e 's/.*ARCH_WANTS_BIG_ENDIAN.*/#ARCH_WANTS_BIG_ENDIAN=y/' \
-e 's/.*ARCH_WANTS_LITTLE_ENDIAN.*/ARCH_WANTS_LITTLE_ENDIAN=y/' '';
archMakeFlag = if (target != null) then "ARCH=${target.arch}" else "";
crossMakeFlag = if (target != null) then "CROSS=${target.config}-" else "";
archMakeFlag = if (cross != null) then "ARCH=${cross.arch}" else "";
crossMakeFlag = if (cross != null) then "CROSS=${cross.config}-" else "";
in
stdenv.mkDerivation {
name = "uclibc-0.9.30.1" + stdenv.lib.optionalString (target != null)
("-" + target.config);
name = "uclibc-0.9.30.1" + stdenv.lib.optionalString (cross != null)
("-" + cross.config);
src = fetchurl {
url = http://www.uclibc.org/downloads/uClibc-0.9.30.1.tar.bz2;
@ -46,7 +46,7 @@ stdenv.mkDerivation {
'';
# Cross stripping hurts.
dontStrip = if (target != null) then true else false;
dontStrip = if (cross != null) then true else false;
makeFlags = [ crossMakeFlag "VERBOSE=1" ];
@ -54,13 +54,13 @@ stdenv.mkDerivation {
patches = [ ./unifdef-getline.patch ];
# This will allow the usual gcc-cross-wrapper strip phase work as usual
crossConfig = if (target != null) then target.config else null;
# # This will allow the usual gcc-cross-wrapper strip phase work as usual
# crossConfig = if (cross != null) then cross.config else null;
installPhase = ''
mkdir -p $out
make PREFIX=$out VERBOSE=1 install ${crossMakeFlag}
(cd $out/include && ln -s ${linuxHeaders}/include/* .) || exit 1
(cd $out/include && ln -s $(ls -d ${linuxHeaders}/include/* | grep -v "scsi$") .)
sed -i s@/lib/@$out/lib/@g $out/lib/libc.so
'';

View File

@ -3740,9 +3740,14 @@ let
installLocales = getPkgConfig "glibc" "locales" false;
});
glibcCross = glibc211Cross;
# We can choose:
libcCross = glibc211Cross;
# libcCross = uclibcCross;
libcCrossChooser = name : if (name == "glibc") then glibcCross
else if (name == "uclibc") then uclibcCross
else throw "Unknown libc";
libcCross = libcCrossChooser crossSystem.libc;
eglibc = import ../development/libraries/eglibc {
inherit fetchsvn stdenv;
@ -6395,10 +6400,11 @@ let
};
*/
uclibcCross = target: import ../os-specific/linux/uclibc {
uclibcCross = import ../os-specific/linux/uclibc {
inherit fetchurl stdenv;
linuxHeaders = linuxHeadersCross target;
gccCross = gccCrossStageStatic target;
linuxHeaders = linuxHeadersCross;
gccCross = gccCrossStageStatic;
cross = assert crossSystem != null; crossSystem;
};
udev = makeOverridable (import ../os-specific/linux/udev) {

View File

@ -37,6 +37,7 @@ let
float = "soft";
withTLS = true;
platform = pkgs.platforms.sheevaplug;
libc = "glibc";
openssl.system = "linux-generic32";
};
@ -48,6 +49,27 @@ in {
});
}) // (
/* Test some cross builds to the Sheevaplug - uclibc*/
let
crossSystem = {
config = "armv5tel-unknown-linux-gnueabi";
bigEndian = false;
arch = "arm";
float = "soft";
withTLS = true;
platform = pkgs.platforms.sheevaplug;
libc = "uclibc";
openssl.system = "linux-generic32";
};
in {
crossSheevaplugLinuxUclibc = mapTestOnCross crossSystem (
basic //
{
ubootSheevaplug.hostDrv = nativePlatforms;
});
}) // (
/* Test some cross builds to the mipsel */
let
crossSystem = {
@ -56,6 +78,7 @@ let
arch = "mips";
float = "soft";
withTLS = true;
libc = "glibc";
platform = {
name = "malta";
kernelBaseConfig = "malta_defconfig";
@ -80,6 +103,7 @@ let
float = "hard";
withTLS = true;
cpu = "ultrasparc";
libc = "glibc";
platform = {
name = "ultrasparc";
kernelHeadersBaseConfig = "sparc64_defconfig";

View File

@ -52,18 +52,13 @@ rec {
(path: value:
let
job = toJob value;
getPkg = pkgs: setCrossMaintainers
(pkgs.lib.addMetaAttrs { schedulingPriority = toString job.schedulingPriority; }
getPkg = pkgs: (pkgs.lib.addMetaAttrs {
schedulingPriority = toString job.schedulingPriority;
maintainers = crossMaintainers;
}
(pkgs.lib.getAttrFromPath path pkgs));
in testOnCross crossSystem job.systems getPkg);
setCrossMaintainers = pkg:
pkg //
{
meta = (if pkg ? meta then pkg.meta else {})
// { maintainers = crossMaintainers; };
};
/* Find all packages that have a meta.platforms field listing the
supported platforms. */
packagesWithMetaPlatform = attrSet: