Skip to content

Commit

Permalink
icu: Fix cross-building.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
shlevy committed Feb 24, 2018
1 parent 39ccb6a commit 7142440
Show file tree
Hide file tree
Showing 2 changed files with 86 additions and 53 deletions.
125 changes: 77 additions & 48 deletions 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";
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;
};
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 '<xlocale.h>' '<locale.h>'"
else null; # won't find locale_t on darwin

inherit patchFlags patches;

outputs = [ "out" "dev" ];
outputBin = "dev";
preConfigure = ''
sed -i -e "s|/bin/sh|${stdenv.shell}|" configure
# FIXME: This fixes dylib references in the dylibs themselves, but
# not in the programs in $out/bin.
buildInputs = stdenv.lib.optional stdenv.isDarwin fixDarwinDylibNames;
# $(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
'';

postUnpack = ''
sourceRoot=''${sourceRoot}/source
echo Source root reset to ''${sourceRoot}
'';
configureFlags = "--disable-debug" +
stdenv.lib.optionalString (stdenv.isFreeBSD || stdenv.isDarwin) " --enable-rpath" +
stdenv.lib.optionalString (buildPlatform != hostPlatform) " --with-cross-build=${nativeBuildRoot}";

# 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 '<xlocale.h>' '<locale.h>'"
else null; # won't find locale_t on darwin
enableParallelBuilding = true;

inherit patchFlags patches;
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;

preConfigure = ''
sed -i -e "s|/bin/sh|${stdenv.shell}|" configure
outputs = [ "out" "dev" ];
outputBin = "dev";

# $(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
'';
# FIXME: This fixes dylib references in the dylibs themselves, but
# not in the programs in $out/bin.
buildInputs = stdenv.lib.optional stdenv.isDarwin fixDarwinDylibNames;

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"
'';

# 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" '';
};

postFixup = ''moveToOutput lib/icu "$dev" '';
buildRootOnlyAttrs = baseAttrs // {
name = pname + "-build-root-" + version;

enableParallelBuilding = true;
preConfigure = baseAttrs.preConfigure + ''
mkdir build
cd build
configureScript=../configure
'';

meta = with stdenv.lib; {
description = "Unicode and globalization support library";
homepage = http://site.icu-project.org/;
maintainers = with maintainers; [ raskin ];
platforms = platforms.all;
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 attrs
14 changes: 9 additions & 5 deletions pkgs/top-level/all-packages.nix
Expand Up @@ -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'
});

Expand Down

4 comments on commit 7142440

@shlevy
Copy link
Member Author

@shlevy shlevy commented on 7142440 Feb 24, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Mic92
Copy link
Member

@Mic92 Mic92 commented on 7142440 Feb 24, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this breaks evaluation:

nix-build pkgs/top-level/release.nix -A tarball
these derivations will be built:
  /nix/store/8arf8lflgrkbm2gkzxxvkihzl4m03g22-nixpkgs-tarball-18.03pre1234.abcdef.drv
building '/nix/store/8arf8lflgrkbm2gkzxxvkihzl4m03g22-nixpkgs-tarball-18.03pre1234.abcdef.drv'...
unpacking sources
unpacking source archive /nix/store/l0gj2hr6jdlc5776fxip8bm8f5gpbwmg-nixpkgs
source root is nixpkgs
patching sources
autoconfPhase
No bootstrap, bootstrap.sh, configure.in or configure.ac. Assuming this is not an GNU Autotools package.
configuring
release name is nixpkgs-18.03pre1234.abcdef
git-revision is abcdef
building
no Makefile, doing nothing
running tests
warning: you did not specify ‘--add-root’; the result might be removed by the garbage collector
warning: you did not specify ‘--add-root’; the result might be removed by the garbage collector
checking Nixpkgs on i686-linux
error: while evaluating ‘callPackageWith’ at /build/nixpkgs/lib/customisation.nix:113:35, called from /build/nixpkgs/pkgs/top-level/all-packages.nix:9213:11:
while evaluating ‘makeOverridable’ at /build/nixpkgs/lib/customisation.nix:72:24, called from /build/nixpkgs/lib/customisation.nix:117:8:
anonymous function at /build/nixpkgs/pkgs/development/libraries/icu/58.nix:1:1 called with unexpected argument ‘nativeBuildRoot’, at /build/nixpkgs/lib/customisation.nix:74:12
build time elapsed:  0m0.094s 0m0.116s 0m3.366s 0m6.273s
builder for '/nix/store/8arf8lflgrkbm2gkzxxvkihzl4m03g22-nixpkgs-tarball-18.03pre1234.abcdef.drv' failed with exit code 1
error: build of '/nix/store/8arf8lflgrkbm2gkzxxvkihzl4m03g22-nixpkgs-tarball-18.03pre1234.abcdef.drv' failed

@shlevy
Copy link
Member Author

@shlevy shlevy commented on 7142440 Feb 24, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 80cb13b

@Ericson2314
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to me. Sometimes we have the cross build just depend on the native build but I see how this is different.

Please sign in to comment.