From 7142440d75f8a55daf830ccf7628d4f739d124c5 Mon Sep 17 00:00:00 2001 From: Shea Levy Date: Sat, 24 Feb 2018 08:02:06 -0500 Subject: [PATCH] icu: Fix cross-building. The icu4c cross-build process requires access to a full buildRoot of a native build, so we add a variant of the build that just does the buildPhase and copies the buildRoot to $out for access by the cross compile. --- pkgs/development/libraries/icu/base.nix | 151 ++++++++++++++---------- pkgs/top-level/all-packages.nix | 14 ++- 2 files changed, 99 insertions(+), 66 deletions(-) diff --git a/pkgs/development/libraries/icu/base.nix b/pkgs/development/libraries/icu/base.nix index 2c8392c8bac8..87551ee6ee03 100644 --- a/pkgs/development/libraries/icu/base.nix +++ b/pkgs/development/libraries/icu/base.nix @@ -1,66 +1,95 @@ { version, sha256, patches ? [], patchFlags ? "" }: -{ stdenv, fetchurl, fetchpatch, fixDarwinDylibNames }: +{ stdenv, fetchurl, fetchpatch, fixDarwinDylibNames + # Cross-compiled icu4c requires a build-root of a native compile +, buildRootOnly ? false, nativeBuildRoot, buildPlatform, hostPlatform +}: let pname = "icu4c"; + + baseAttrs = { + src = fetchurl { + url = "http://download.icu-project.org/files/${pname}/${version}/${pname}-" + + (stdenv.lib.replaceChars ["."] ["_"] version) + "-src.tgz"; + inherit sha256; + }; + + postUnpack = '' + sourceRoot=''${sourceRoot}/source + echo Source root reset to ''${sourceRoot} + ''; + + # https://sourceware.org/glibc/wiki/Release/2.26#Removal_of_.27xlocale.h.27 + postPatch = if (stdenv.hostPlatform.libc == "glibc" || stdenv.hostPlatform.libc == "musl") + then "substituteInPlace i18n/digitlst.cpp --replace '' ''" + else null; # won't find locale_t on darwin + + inherit patchFlags patches; + + preConfigure = '' + sed -i -e "s|/bin/sh|${stdenv.shell}|" configure + + # $(includedir) is different from $(prefix)/include due to multiple outputs + sed -i -e 's|^\(CPPFLAGS = .*\) -I\$(prefix)/include|\1 -I$(includedir)|' config/Makefile.inc.in + '' + stdenv.lib.optionalString stdenv.isArm '' + # From https://archlinuxarm.org/packages/armv7h/icu/files/icudata-stdlibs.patch + sed -e 's/LDFLAGSICUDT=-nodefaultlibs -nostdlib/LDFLAGSICUDT=/' -i config/mh-linux + ''; + + configureFlags = "--disable-debug" + + stdenv.lib.optionalString (stdenv.isFreeBSD || stdenv.isDarwin) " --enable-rpath" + + stdenv.lib.optionalString (buildPlatform != hostPlatform) " --with-cross-build=${nativeBuildRoot}"; + + enableParallelBuilding = true; + + meta = with stdenv.lib; { + description = "Unicode and globalization support library"; + homepage = http://site.icu-project.org/; + maintainers = with maintainers; [ raskin ]; + platforms = platforms.all; + }; + }; + + realAttrs = baseAttrs // { + name = pname + "-" + version; + + outputs = [ "out" "dev" ]; + outputBin = "dev"; + + # FIXME: This fixes dylib references in the dylibs themselves, but + # not in the programs in $out/bin. + buildInputs = stdenv.lib.optional stdenv.isDarwin fixDarwinDylibNames; + + # remove dependency on bootstrap-tools in early stdenv build + postInstall = stdenv.lib.optionalString stdenv.isDarwin '' + sed -i 's/INSTALL_CMD=.*install/INSTALL_CMD=install/' $out/lib/icu/${version}/pkgdata.inc + '' + '' + substituteInPlace "$dev/bin/icu-config" \ + --replace \''${pkglibdir}/Makefile.inc "$dev/lib/icu/Makefile.inc" + ''; + + postFixup = ''moveToOutput lib/icu "$dev" ''; + }; + + buildRootOnlyAttrs = baseAttrs // { + name = pname + "-build-root-" + version; + + preConfigure = baseAttrs.preConfigure + '' + mkdir build + cd build + configureScript=../configure + ''; + + postBuild = '' + cd .. + mv build $out + echo "Doing build-root only, exiting now" >&2 + exit 0 + ''; + }; + + attrs = if buildRootOnly + then buildRootOnlyAttrs + else realAttrs; in -stdenv.mkDerivation { - name = pname + "-" + version; - - src = fetchurl { - url = "http://download.icu-project.org/files/${pname}/${version}/${pname}-" - + (stdenv.lib.replaceChars ["."] ["_"] version) + "-src.tgz"; - inherit sha256; - }; - - outputs = [ "out" "dev" ]; - outputBin = "dev"; - - # FIXME: This fixes dylib references in the dylibs themselves, but - # not in the programs in $out/bin. - buildInputs = stdenv.lib.optional stdenv.isDarwin fixDarwinDylibNames; - - postUnpack = '' - sourceRoot=''${sourceRoot}/source - echo Source root reset to ''${sourceRoot} - ''; - - # https://sourceware.org/glibc/wiki/Release/2.26#Removal_of_.27xlocale.h.27 - postPatch = if (stdenv.hostPlatform.libc == "glibc" || stdenv.hostPlatform.libc == "musl") - then "substituteInPlace i18n/digitlst.cpp --replace '' ''" - else null; # won't find locale_t on darwin - - inherit patchFlags patches; - - preConfigure = '' - sed -i -e "s|/bin/sh|${stdenv.shell}|" configure - - # $(includedir) is different from $(prefix)/include due to multiple outputs - sed -i -e 's|^\(CPPFLAGS = .*\) -I\$(prefix)/include|\1 -I$(includedir)|' config/Makefile.inc.in - '' + stdenv.lib.optionalString stdenv.isArm '' - # From https://archlinuxarm.org/packages/armv7h/icu/files/icudata-stdlibs.patch - sed -e 's/LDFLAGSICUDT=-nodefaultlibs -nostdlib/LDFLAGSICUDT=/' -i config/mh-linux - ''; - - configureFlags = "--disable-debug" + - stdenv.lib.optionalString (stdenv.isFreeBSD || stdenv.isDarwin) " --enable-rpath"; - - # remove dependency on bootstrap-tools in early stdenv build - postInstall = stdenv.lib.optionalString stdenv.isDarwin '' - sed -i 's/INSTALL_CMD=.*install/INSTALL_CMD=install/' $out/lib/icu/${version}/pkgdata.inc - '' + '' - substituteInPlace "$dev/bin/icu-config" \ - --replace \''${pkglibdir}/Makefile.inc "$dev/lib/icu/Makefile.inc" - ''; - - postFixup = ''moveToOutput lib/icu "$dev" ''; - - enableParallelBuilding = true; - - meta = with stdenv.lib; { - description = "Unicode and globalization support library"; - homepage = http://site.icu-project.org/; - maintainers = with maintainers; [ raskin ]; - platforms = platforms.all; - }; -} +stdenv.mkDerivation attrs diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index d4e236f94426..b8b4e46ceb39 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -9210,16 +9210,20 @@ with pkgs; hyena = callPackage ../development/libraries/hyena { }; - icu58 = callPackage ../development/libraries/icu/58.nix + icu58 = callPackage ../development/libraries/icu/58.nix { + nativeBuildRoot = buildPackages.icu58.override { buildRootOnly = true; }; + } // (stdenv.lib.optionalAttrs (stdenv.cc.isGNU && stdenv.hostPlatform.isi686) { stdenv = overrideCC stdenv gcc6; # with gcc-7: undefined reference to `__divmoddi4' }); - icu59 = callPackage ../development/libraries/icu/59.nix - (stdenv.lib.optionalAttrs (stdenv.cc.isGNU && stdenv.hostPlatform.isi686) { + icu59 = callPackage ../development/libraries/icu/59.nix { + nativeBuildRoot = buildPackages.icu59.override { buildRootOnly = true; }; + } // (stdenv.lib.optionalAttrs (stdenv.cc.isGNU && stdenv.hostPlatform.isi686) { stdenv = overrideCC stdenv gcc6; # with gcc-7: undefined reference to `__divmoddi4' }); - icu60 = callPackage ../development/libraries/icu/60.nix - (stdenv.lib.optionalAttrs (stdenv.cc.isGNU && stdenv.hostPlatform.isi686) { + icu60 = callPackage ../development/libraries/icu/60.nix { + nativeBuildRoot = buildPackages.icu60.override { buildRootOnly = true; }; + } // (stdenv.lib.optionalAttrs (stdenv.cc.isGNU && stdenv.hostPlatform.isi686) { stdenv = overrideCC stdenv gcc6; # with gcc-7: undefined reference to `__divmoddi4' });