anvil-editor: init at 0.4
[NixPkgs.git] / pkgs / development / libraries / icu / make-icu.nix
blobd7fe46041607edc4bd6c2335f00fe1081a9d1b28
1 { stdenv, lib, buildPackages, fetchurl, fixDarwinDylibNames, testers, updateAutotoolsGnuConfigScriptsHook }:
3 { version, hash, patches ? [], patchFlags ? [], withStatic ? stdenv.hostPlatform.isStatic }:
5 let
6   # Cross-compiled icu4c requires a build-root of a native compile
7   nativeBuildRoot = buildPackages."icu${lib.versions.major version}".buildRootOnly;
9   pname = "icu4c";
11   release = lib.replaceStrings [ "." ] [ "-" ] version;
12   # To test rc versions of ICU replace the line above with the line below.
13   #release = lib.replaceStrings [ "." ] [ "-" ] (if lib.hasSuffix "rc" version then lib.replaceStrings [ "1" ] [ "" ] version else version);
15   baseAttrs = {
16     src = fetchurl {
17       url = "https://github.com/unicode-org/icu/releases/download/release-${release}/icu4c-${lib.replaceStrings [ "." ] [ "_" ] version}-src.tgz";
18       inherit hash;
19     };
21     postUnpack = ''
22       sourceRoot=''${sourceRoot}/source
23       echo Source root reset to ''${sourceRoot}
24     '';
26     # https://sourceware.org/glibc/wiki/Release/2.26#Removal_of_.27xlocale.h.27
27     postPatch = if (stdenv.hostPlatform.libc == "glibc" || stdenv.hostPlatform.libc == "musl") && lib.versionOlder version "62.1"
28       then "substituteInPlace i18n/digitlst.cpp --replace '<xlocale.h>' '<locale.h>'"
29       else null; # won't find locale_t on darwin
31     inherit patchFlags patches;
33     preConfigure = ''
34       sed -i -e "s|/bin/sh|${stdenv.shell}|" configure
36       # $(includedir) is different from $(prefix)/include due to multiple outputs
37       sed -i -e 's|^\(CPPFLAGS = .*\) -I\$(prefix)/include|\1 -I$(includedir)|' config/Makefile.inc.in
38     '' + lib.optionalString stdenv.hostPlatform.isAarch32 ''
39       # From https://archlinuxarm.org/packages/armv7h/icu/files/icudata-stdlibs.patch
40       sed -e 's/LDFLAGSICUDT=-nodefaultlibs -nostdlib/LDFLAGSICUDT=/' -i config/mh-linux
41     '';
43     dontDisableStatic = withStatic;
45     configureFlags = [ "--disable-debug" ]
46       ++ lib.optional (stdenv.hostPlatform.isFreeBSD || stdenv.hostPlatform.isDarwin) "--enable-rpath"
47       ++ lib.optional (stdenv.buildPlatform != stdenv.hostPlatform) "--with-cross-build=${nativeBuildRoot}"
48       ++ lib.optional withStatic "--enable-static";
50     enableParallelBuilding = true;
52     meta = with lib; {
53       description = "Unicode and globalization support library";
54       homepage = "https://icu.unicode.org/";
55       maintainers = with maintainers; [ raskin ];
56       pkgConfigModules = [
57         "icu-i18n"
58         "icu-io"
59         "icu-uc"
60       ];
61       platforms = platforms.all;
62     };
63   };
65   realAttrs = baseAttrs // {
66     inherit pname version;
68     outputs = [ "out" "dev" ] ++ lib.optional withStatic "static";
69     outputBin = "dev";
71     nativeBuildInputs = [ updateAutotoolsGnuConfigScriptsHook ] ++
72       # FIXME: This fixes dylib references in the dylibs themselves, but
73       # not in the programs in $out/bin.
74       lib.optional stdenv.hostPlatform.isDarwin fixDarwinDylibNames;
77     # remove dependency on bootstrap-tools in early stdenv build
78     postInstall = lib.optionalString withStatic ''
79       mkdir -p $static/lib
80       mv -v lib/*.a $static/lib
81     '' + lib.optionalString stdenv.hostPlatform.isDarwin ''
82       sed -i 's/INSTALL_CMD=.*install/INSTALL_CMD=install/' $out/lib/icu/${lib.versions.majorMinor version}/pkgdata.inc
83     '' + (let
84       replacements = [
85         { from = "\${prefix}/include"; to = "${placeholder "dev"}/include"; } # --cppflags-searchpath
86         { from = "\${pkglibdir}/Makefile.inc"; to = "${placeholder "dev"}/lib/icu/Makefile.inc"; } # --incfile
87         { from = "\${pkglibdir}/pkgdata.inc"; to = "${placeholder "dev"}/lib/icu/pkgdata.inc"; } # --incpkgdatafile
88       ];
89     in ''
90       rm $out/share/icu/${lib.versions.majorMinor version}/install-sh $out/share/icu/${lib.versions.majorMinor version}/mkinstalldirs # Avoid having a runtime dependency on bash
92       substituteInPlace "$dev/bin/icu-config" \
93         ${lib.concatMapStringsSep " " (r: "--replace '${r.from}' '${r.to}'") replacements}
94     '');
96     postFixup = ''moveToOutput lib/icu "$dev" '';
97   };
99   buildRootOnlyAttrs = baseAttrs // {
100     pname = pname + "-build-root";
101     inherit version;
103     preConfigure = baseAttrs.preConfigure + ''
104       mkdir build
105       cd build
106       configureScript=../configure
107     '';
109     postBuild = ''
110       cd ..
111       mv build $out
112       echo "Doing build-root only, exiting now" >&2
113       exit 0
114     '';
115   };
117   mkWithAttrs = attrs: stdenv.mkDerivation (finalAttrs: attrs // {
118     passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage;
119     passthru.buildRootOnly = mkWithAttrs buildRootOnlyAttrs;
120   });
122   mkWithAttrs realAttrs