summary refs log tree commit diff
path: root/pkgs/development/libraries/libiconv
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/development/libraries/libiconv')
-rw-r--r--pkgs/development/libraries/libiconv/default.nix7
-rw-r--r--pkgs/development/libraries/libiconv/libiconv-1.14-reloc.patch269
-rw-r--r--pkgs/development/libraries/libiconv/libiconv-1.14-wchar.patch102
3 files changed, 377 insertions, 1 deletions
diff --git a/pkgs/development/libraries/libiconv/default.nix b/pkgs/development/libraries/libiconv/default.nix
index 9e65e63ffdb..70b0574a7b4 100644
--- a/pkgs/development/libraries/libiconv/default.nix
+++ b/pkgs/development/libraries/libiconv/default.nix
@@ -10,11 +10,16 @@ stdenv.mkDerivation rec {
     sha256 = "04q6lgl3kglmmhw59igq1n7v3rp1rpkypl366cy1k1yn2znlvckj";
   };
 
+  patches = if stdenv.isCygwin then [
+    ./libiconv-1.14-reloc.patch
+    ./libiconv-1.14-wchar.patch
+  ] else null;
+
   # On Cygwin, Libtool produces a `.dll.a', which is not a "real" DLL
   # (Windows' linker would need to be used somehow to produce an actual
   # DLL.)  Thus, build the static library too, and this is what Gettext
   # will actually use.
-  configureFlags = stdenv.lib.optional stdenv.isCygwin [ "--enable-static" ];
+  configureFlags = if stdenv.isCygwin then [ "--enable-static" ] else null;
 
   crossAttrs = {
     # Disable stripping to avoid "libiconv.a: Archive has no index" (MinGW).
diff --git a/pkgs/development/libraries/libiconv/libiconv-1.14-reloc.patch b/pkgs/development/libraries/libiconv/libiconv-1.14-reloc.patch
new file mode 100644
index 00000000000..005e3379d16
--- /dev/null
+++ b/pkgs/development/libraries/libiconv/libiconv-1.14-reloc.patch
@@ -0,0 +1,269 @@
+--- libiconv-1.14/lib/relocatable.c	2011-08-07 13:48:03.000000000 -0400
++++ libiconv-1.14/lib/relocatable.c	2011-10-15 03:14:13.195133600 -0400
+@@ -2,20 +2,18 @@
+    Copyright (C) 2003-2006, 2008-2011 Free Software Foundation, Inc.
+    Written by Bruno Haible <bruno@clisp.org>, 2003.
+ 
+-   This program is free software; you can redistribute it and/or modify it
+-   under the terms of the GNU Library General Public License as published
+-   by the Free Software Foundation; either version 2, or (at your option)
+-   any later version.
++   This program is free software: you can redistribute it and/or modify
++   it under the terms of the GNU Lesser General Public License as published by
++   the Free Software Foundation; either version 2.1 of the License, or
++   (at your option) any later version.
+ 
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+-   Library General Public License for more details.
++   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++   GNU Lesser General Public License for more details.
+ 
+-   You should have received a copy of the GNU Library General Public
+-   License along with this program; if not, write to the Free Software
+-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+-   USA.  */
++   You should have received a copy of the GNU Lesser General Public License
++   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+ 
+ 
+ /* Tell glibc's <stdio.h> to provide a prototype for getline().
+@@ -87,6 +85,19 @@
+ # define FILE_SYSTEM_PREFIX_LEN(P) 0
+ #endif
+ 
++/* Whether to enable the more costly support for relocatable libraries.
++   It allows libraries to be have been installed with a different original
++   prefix than the program.  But it is quite costly, especially on Cygwin
++   platforms, see below.  Therefore we enable it by default only on native
++   Win32 platforms.  */
++#ifndef ENABLE_COSTLY_RELOCATABLE
++# if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__
++#  define ENABLE_COSTLY_RELOCATABLE 1
++# else
++#  define ENABLE_COSTLY_RELOCATABLE 0
++# endif
++#endif
++
+ /* Original installation prefix.  */
+ static char *orig_prefix;
+ static size_t orig_prefix_len;
+@@ -156,7 +167,7 @@
+ #endif
+ }
+ 
+-#if !defined IN_LIBRARY || (defined PIC && defined INSTALLDIR)
++#if !defined IN_LIBRARY || (defined PIC && defined INSTALLDIR && ENABLE_COSTLY_RELOCATABLE)
+ 
+ /* Convenience function:
+    Computes the current installation prefix, based on the original
+@@ -286,7 +297,7 @@
+ 
+ #endif /* !IN_LIBRARY || PIC */
+ 
+-#if defined PIC && defined INSTALLDIR
++#if defined PIC && defined INSTALLDIR && ENABLE_COSTLY_RELOCATABLE
+ 
+ /* Full pathname of shared library, or NULL.  */
+ static char *shared_library_fullname;
+@@ -332,7 +343,9 @@
+ #if (defined __linux__ && (__GLIBC__ >= 2 || defined __UCLIBC__)) || defined __CYGWIN__
+   /* Linux has /proc/self/maps. glibc 2 and uClibc have the getline()
+      function.
+-     Cygwin >= 1.5 has /proc/self/maps and the getline() function too.  */
++     Cygwin >= 1.5 has /proc/self/maps and the getline() function too.
++     But it is costly: ca. 0.3 ms on Linux, 3 ms on Cygwin 1.5, and 5 ms on
++     Cygwin 1.7.  */
+   FILE *fp;
+ 
+   /* Open the current process' maps file.  It describes one VMA per line.  */
+@@ -405,7 +418,7 @@
+ const char *
+ relocate (const char *pathname)
+ {
+-#if defined PIC && defined INSTALLDIR
++#if defined PIC && defined INSTALLDIR && ENABLE_COSTLY_RELOCATABLE
+   static int initialized;
+ 
+   /* Initialization code for a shared library.  */
+--- libiconv-1.14/libcharset/lib/relocatable.c	2011-08-07 13:48:03.000000000 -0400
++++ libiconv-1.14/libcharset/lib/relocatable.c	2011-10-15 03:14:27.878133600 -0400
+@@ -2,20 +2,18 @@
+    Copyright (C) 2003-2006, 2008-2011 Free Software Foundation, Inc.
+    Written by Bruno Haible <bruno@clisp.org>, 2003.
+ 
+-   This program is free software; you can redistribute it and/or modify it
+-   under the terms of the GNU Library General Public License as published
+-   by the Free Software Foundation; either version 2, or (at your option)
+-   any later version.
++   This program is free software: you can redistribute it and/or modify
++   it under the terms of the GNU Lesser General Public License as published by
++   the Free Software Foundation; either version 2.1 of the License, or
++   (at your option) any later version.
+ 
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+-   Library General Public License for more details.
++   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++   GNU Lesser General Public License for more details.
+ 
+-   You should have received a copy of the GNU Library General Public
+-   License along with this program; if not, write to the Free Software
+-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+-   USA.  */
++   You should have received a copy of the GNU Lesser General Public License
++   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+ 
+ 
+ /* Tell glibc's <stdio.h> to provide a prototype for getline().
+@@ -87,6 +85,19 @@
+ # define FILE_SYSTEM_PREFIX_LEN(P) 0
+ #endif
+ 
++/* Whether to enable the more costly support for relocatable libraries.
++   It allows libraries to be have been installed with a different original
++   prefix than the program.  But it is quite costly, especially on Cygwin
++   platforms, see below.  Therefore we enable it by default only on native
++   Win32 platforms.  */
++#ifndef ENABLE_COSTLY_RELOCATABLE
++# if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__
++#  define ENABLE_COSTLY_RELOCATABLE 1
++# else
++#  define ENABLE_COSTLY_RELOCATABLE 0
++# endif
++#endif
++
+ /* Original installation prefix.  */
+ static char *orig_prefix;
+ static size_t orig_prefix_len;
+@@ -156,7 +167,7 @@
+ #endif
+ }
+ 
+-#if !defined IN_LIBRARY || (defined PIC && defined INSTALLDIR)
++#if !defined IN_LIBRARY || (defined PIC && defined INSTALLDIR && ENABLE_COSTLY_RELOCATABLE)
+ 
+ /* Convenience function:
+    Computes the current installation prefix, based on the original
+@@ -286,7 +297,7 @@
+ 
+ #endif /* !IN_LIBRARY || PIC */
+ 
+-#if defined PIC && defined INSTALLDIR
++#if defined PIC && defined INSTALLDIR && ENABLE_COSTLY_RELOCATABLE
+ 
+ /* Full pathname of shared library, or NULL.  */
+ static char *shared_library_fullname;
+@@ -332,7 +343,9 @@
+ #if (defined __linux__ && (__GLIBC__ >= 2 || defined __UCLIBC__)) || defined __CYGWIN__
+   /* Linux has /proc/self/maps. glibc 2 and uClibc have the getline()
+      function.
+-     Cygwin >= 1.5 has /proc/self/maps and the getline() function too.  */
++     Cygwin >= 1.5 has /proc/self/maps and the getline() function too.
++     But it is costly: ca. 0.3 ms on Linux, 3 ms on Cygwin 1.5, and 5 ms on
++     Cygwin 1.7.  */
+   FILE *fp;
+ 
+   /* Open the current process' maps file.  It describes one VMA per line.  */
+@@ -405,7 +418,7 @@
+ const char *
+ relocate (const char *pathname)
+ {
+-#if defined PIC && defined INSTALLDIR
++#if defined PIC && defined INSTALLDIR && ENABLE_COSTLY_RELOCATABLE
+   static int initialized;
+ 
+   /* Initialization code for a shared library.  */
+--- libiconv-1.14/srclib/relocatable.c	2011-08-07 09:42:06.000000000 -0400
++++ libiconv-1.14/srclib/relocatable.c	2011-10-15 03:14:37.739133600 -0400
+@@ -3,16 +3,16 @@
+    Written by Bruno Haible <bruno@clisp.org>, 2003.
+ 
+    This program is free software: you can redistribute it and/or modify
+-   it under the terms of the GNU General Public License as published by
+-   the Free Software Foundation; either version 3 of the License, or
++   it under the terms of the GNU Lesser General Public License as published by
++   the Free Software Foundation; either version 2.1 of the License, or
+    (at your option) any later version.
+ 
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-   GNU General Public License for more details.
++   GNU Lesser General Public License for more details.
+ 
+-   You should have received a copy of the GNU General Public License
++   You should have received a copy of the GNU Lesser General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+ 
+ 
+@@ -85,6 +85,19 @@
+ # define FILE_SYSTEM_PREFIX_LEN(P) 0
+ #endif
+ 
++/* Whether to enable the more costly support for relocatable libraries.
++   It allows libraries to be have been installed with a different original
++   prefix than the program.  But it is quite costly, especially on Cygwin
++   platforms, see below.  Therefore we enable it by default only on native
++   Win32 platforms.  */
++#ifndef ENABLE_COSTLY_RELOCATABLE
++# if (defined _WIN32 || defined __WIN32__) && !defined __CYGWIN__
++#  define ENABLE_COSTLY_RELOCATABLE 1
++# else
++#  define ENABLE_COSTLY_RELOCATABLE 0
++# endif
++#endif
++
+ /* Original installation prefix.  */
+ static char *orig_prefix;
+ static size_t orig_prefix_len;
+@@ -154,7 +167,7 @@
+ #endif
+ }
+ 
+-#if !defined IN_LIBRARY || (defined PIC && defined INSTALLDIR)
++#if !defined IN_LIBRARY || (defined PIC && defined INSTALLDIR && ENABLE_COSTLY_RELOCATABLE)
+ 
+ /* Convenience function:
+    Computes the current installation prefix, based on the original
+@@ -284,7 +297,7 @@
+ 
+ #endif /* !IN_LIBRARY || PIC */
+ 
+-#if defined PIC && defined INSTALLDIR
++#if defined PIC && defined INSTALLDIR && ENABLE_COSTLY_RELOCATABLE
+ 
+ /* Full pathname of shared library, or NULL.  */
+ static char *shared_library_fullname;
+@@ -330,7 +343,9 @@
+ #if (defined __linux__ && (__GLIBC__ >= 2 || defined __UCLIBC__)) || defined __CYGWIN__
+   /* Linux has /proc/self/maps. glibc 2 and uClibc have the getline()
+      function.
+-     Cygwin >= 1.5 has /proc/self/maps and the getline() function too.  */
++     Cygwin >= 1.5 has /proc/self/maps and the getline() function too.
++     But it is costly: ca. 0.3 ms on Linux, 3 ms on Cygwin 1.5, and 5 ms on
++     Cygwin 1.7.  */
+   FILE *fp;
+ 
+   /* Open the current process' maps file.  It describes one VMA per line.  */
+@@ -403,7 +418,7 @@
+ const char *
+ relocate (const char *pathname)
+ {
+-#if defined PIC && defined INSTALLDIR
++#if defined PIC && defined INSTALLDIR && ENABLE_COSTLY_RELOCATABLE
+   static int initialized;
+ 
+   /* Initialization code for a shared library.  */
+--- libiconv-1.14/srcm4/gnulib-comp.m4	2011-08-07 09:42:12.000000000 -0400
++++ libiconv-1.14/srcm4/gnulib-comp.m4	2011-08-30 02:40:45.597317000 -0400
+@@ -164,6 +164,7 @@ gl_UNISTD_MODULE_INDICATOR([readlink])
+ gl_RELOCATABLE([$gl_source_base])
+ if test $RELOCATABLE = yes; then
+   AC_LIBOBJ([progreloc])
++  AC_LIBOBJ([relocatable])
+ fi
+ gl_FUNC_READLINK_SEPARATE
+ gl_CANONICALIZE_LGPL_SEPARATE
diff --git a/pkgs/development/libraries/libiconv/libiconv-1.14-wchar.patch b/pkgs/development/libraries/libiconv/libiconv-1.14-wchar.patch
new file mode 100644
index 00000000000..0e4ddd931bb
--- /dev/null
+++ b/pkgs/development/libraries/libiconv/libiconv-1.14-wchar.patch
@@ -0,0 +1,102 @@
+--- libiconv-1.14/libcharset/lib/localcharset.c	2011-02-28 17:43:35.000000000 -0500
++++ libiconv-1.14/libcharset/lib/localcharset.c	2011-08-28 00:16:57.238000000 -0400
+@@ -54,10 +54,6 @@
+ #   include <locale.h>
+ #  endif
+ # endif
+-# ifdef __CYGWIN__
+-#  define WIN32_LEAN_AND_MEAN
+-#  include <windows.h>
+-# endif
+ #elif defined WIN32_NATIVE
+ # define WIN32_LEAN_AND_MEAN
+ # include <windows.h>
+@@ -124,7 +120,7 @@
+   cp = charset_aliases;
+   if (cp == NULL)
+     {
+-#if !(defined DARWIN7 || defined VMS || defined WIN32_NATIVE || defined __CYGWIN__)
++#if !(defined DARWIN7 || defined VMS || defined WIN32_NATIVE)
+       const char *dir;
+       const char *base = "charset.alias";
+       char *file_name;
+@@ -309,7 +305,7 @@
+            "DECKOREAN" "\0" "EUC-KR" "\0";
+ # endif
+ 
+-# if defined WIN32_NATIVE || defined __CYGWIN__
++# if defined WIN32_NATIVE
+       /* To avoid the troubles of installing a separate file in the same
+          directory as the DLL and of retrieving the DLL's directory at
+          runtime, simply inline the aliases here.  */
+@@ -365,64 +361,12 @@
+ 
+ # if HAVE_LANGINFO_CODESET
+ 
+-  /* Most systems support nl_langinfo (CODESET) nowadays.  */
+-  codeset = nl_langinfo (CODESET);
+-
+-#  ifdef __CYGWIN__
+-  /* Cygwin < 1.7 does not have locales.  nl_langinfo (CODESET) always
+-     returns "US-ASCII".  Return the suffix of the locale name from the
+-     environment variables (if present) or the codepage as a number.  */
+-  if (codeset != NULL && strcmp (codeset, "US-ASCII") == 0)
+-    {
+-      const char *locale;
+-      static char buf[2 + 10 + 1];
+-
+-      locale = getenv ("LC_ALL");
+-      if (locale == NULL || locale[0] == '\0')
+-        {
+-          locale = getenv ("LC_CTYPE");
+-          if (locale == NULL || locale[0] == '\0')
+-            locale = getenv ("LANG");
+-        }
+-      if (locale != NULL && locale[0] != '\0')
+-        {
+-          /* If the locale name contains an encoding after the dot, return
+-             it.  */
+-          const char *dot = strchr (locale, '.');
+-
+-          if (dot != NULL)
+-            {
+-              const char *modifier;
+-
+-              dot++;
+-              /* Look for the possible @... trailer and remove it, if any.  */
+-              modifier = strchr (dot, '@');
+-              if (modifier == NULL)
+-                return dot;
+-              if (modifier - dot < sizeof (buf))
+-                {
+-                  memcpy (buf, dot, modifier - dot);
+-                  buf [modifier - dot] = '\0';
+-                  return buf;
+-                }
+-            }
+-        }
+-
+-      /* Woe32 has a function returning the locale's codepage as a number:
+-         GetACP().  This encoding is used by Cygwin, unless the user has set
+-         the environment variable CYGWIN=codepage:oem (which very few people
+-         do).
+-         Output directed to console windows needs to be converted (to
+-         GetOEMCP() if the console is using a raster font, or to
+-         GetConsoleOutputCP() if it is using a TrueType font).  Cygwin does
+-         this conversion transparently (see winsup/cygwin/fhandler_console.cc),
+-         converting to GetConsoleOutputCP().  This leads to correct results,
+-         except when SetConsoleOutputCP has been called and a raster font is
+-         in use.  */
+-      sprintf (buf, "CP%u", GetACP ());
+-      codeset = buf;
+-    }
+-#  endif
++  /* Most systems support nl_langinfo (CODESET) nowadays.
++     POSIX allows that the returned pointer may point to a static area that
++     may be overwritten by subsequent calls to setlocale or nl_langinfo. */
++  static char codeset_buf[64];
++  codeset_buf[0] = '\0';
++  codeset = strncat (codeset_buf, nl_langinfo (CODESET), sizeof (codeset_buf));
+ 
+ # else
+