-
-
Notifications
You must be signed in to change notification settings - Fork 18.7k
Expand file tree
/
Copy pathdefault.nix
More file actions
135 lines (116 loc) · 5.46 KB
/
default.nix
File metadata and controls
135 lines (116 loc) · 5.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
{
fetchurl,
stdenv,
lib,
darwin,
updateAutotoolsGnuConfigScriptsHook,
enableStatic ? stdenv.hostPlatform.isStatic,
enableShared ? !stdenv.hostPlatform.isStatic,
enableDarwinABICompat ? stdenv.hostPlatform.isDarwin,
}:
# assert !stdenv.hostPlatform.isLinux || stdenv.hostPlatform != stdenv.buildPlatform; # TODO: improve on cross
let
# libiconv is propagated by the SDK in the stdenv. Avoid an infinite recursion by using a stdenv
# with an SDK that does not try to propagate it.
stdenv' = if stdenv.hostPlatform.isDarwin then darwin.bootstrapStdenv else stdenv;
in
stdenv'.mkDerivation rec {
pname = "libiconv";
version = "1.19";
src = fetchurl {
url = "mirror://gnu/libiconv/${pname}-${version}.tar.gz";
sha256 = "sha256-iN2WqMBGTsoUT8eRrmDNMc2O54Mh5nOX4l/AlcShmqY=";
};
enableParallelBuilding = true;
# necessary to build on FreeBSD native pending inclusion of
# https://git.savannah.gnu.org/cgit/config.git/commit/?id=e4786449e1c26716e3f9ea182caf472e4dbc96e0
nativeBuildInputs = [ updateAutotoolsGnuConfigScriptsHook ];
# https://github.com/NixOS/nixpkgs/pull/192630#discussion_r978985593
hardeningDisable = lib.optional (stdenv.hostPlatform.libc == "bionic") "fortify";
setupHooks =
# Match the default behavior on Darwin, which does not automatically link libiconv.
lib.optionals (!stdenv.hostPlatform.isDarwin) [
../../../build-support/setup-hooks/role.bash
./setup-hook.sh
];
patches = [
# Add support for the UTF-8-MAC encoding. This is needed for correct behavior of applications that interact with
# the filesystem on Darwin because it uses a variant of NFD to store filenames.
(fetchurl {
url = "https://raw.githubusercontent.com/macports/macports-ports/ce1083dbec406fcea0f2678308ae85639798aa6e/textproc/libiconv/files/patch-utf8mac.diff";
hash = "sha256-aqoTDIunKnWLHPizdWbU6eCDZXaj2s+GJwtg6Spzfio=";
})
];
# The patch for UTF-8-MAC requires -p0. It can’t use `fetchpatch2` because that results in an infinite recursion.
patchFlags = [ "-p0" ];
postPatch =
lib.optionalString
(
(stdenv.hostPlatform != stdenv.buildPlatform && stdenv.hostPlatform.isMinGW) || stdenv.cc.nativeLibc
)
''
sed '/^_GL_WARN_ON_USE (gets/d' -i srclib/stdio.in.h
''
+ lib.optionalString (!enableShared) ''
sed -i -e '/preload/d' Makefile.in
''
# The system libiconv is based on libiconv 1.11 with some ABI differences. The following changes
# build a compatible libiconv on Darwin, allowing it to be sustituted in place of the system one
# using `install_name_tool`. This removes the need to for a separate, Darwin-specific libiconv
# derivation and allows Darwin to benefit from upstream updates and fixes.
+ lib.optionalString enableDarwinABICompat ''
for iconv_h_in in iconv.h.in iconv.h.build.in; do
substituteInPlace "include/$iconv_h_in" \
--replace-fail "#define iconv libiconv" "" \
--replace-fail "#define iconv_close libiconv_close" "" \
--replace-fail "#define iconv_open libiconv_open" "" \
--replace-fail "#define iconv_open_into libiconv_open_into" "" \
--replace-fail "#define iconvctl libiconvctl" "" \
--replace-fail "#define iconvlist libiconvlist" ""
done
'';
# This is hacky, but `libiconv.dylib` needs to reexport `libcharset.dylib` to match the behavior
# of the system libiconv on Darwin. Trying to do this by modifying the `Makefile` results in an
# error linking `iconv` because `libcharset.dylib` is not at its final path yet. Avoid the error
# by building without the reexport then clean and rebuild `libiconv.dylib` with the reexport.
#
# For an explanation why `libcharset.dylib` is reexported, see:
# https://github.com/apple-oss-distributions/libiconv/blob/a167071feb7a83a01b27ec8d238590c14eb6faff/xcodeconfig/libiconv.xcconfig
postBuild = lib.optionalString enableDarwinABICompat ''
make clean -C lib
NIX_CFLAGS_COMPILE+=" -Wl,-reexport-lcharset -L. " make -C lib -j$NIX_BUILD_CORES SHELL=$SHELL
'';
configureFlags = [
(lib.enableFeature enableStatic "static")
(lib.enableFeature enableShared "shared")
]
++ lib.optional stdenv.hostPlatform.isFreeBSD "--with-pic"
# Work around build failure caused by the gnulib workaround for
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114870.
# remove after gnulib is updated
++ lib.optional stdenv.hostPlatform.isCygwin "gl_cv_clean_version_stddef=yes";
preBuild = ''
# The UTF-8-MAC patch requires regenerating `flags.h`
make -C lib genflags
lib/genflags > lib/flags.h
'';
passthru = { inherit setupHooks; };
meta = {
description = "Iconv(3) implementation";
longDescription = ''
Some programs, like mailers and web browsers, must be able to convert
between a given text encoding and the user's encoding. Other programs
internally store strings in Unicode, to facilitate internal processing,
and need to convert between internal string representation (Unicode)
and external string representation (a traditional encoding) when they
are doing I/O. GNU libiconv is a conversion library for both kinds of
applications.
'';
homepage = "https://www.gnu.org/software/libiconv/";
license = lib.licenses.lgpl2Plus;
maintainers = [ ];
mainProgram = "iconv";
# This library is not needed on GNU platforms.
hydraPlatforms = lib.platforms.cygwin ++ lib.platforms.darwin ++ lib.platforms.freebsd;
};
}