diff --git a/pkgs/development/libraries/gettext/default.nix b/pkgs/development/libraries/gettext/default.nix index 8f6277ca2e9..15f11f8a133 100644 --- a/pkgs/development/libraries/gettext/default.nix +++ b/pkgs/development/libraries/gettext/default.nix @@ -12,11 +12,13 @@ stdenv.mkDerivation (rec { configureFlags = [ "--disable-csharp" "--with-xz" ] ++ (stdenv.lib.optionals stdenv.isCygwin - [ # We have a static libiconv, so we can only build the static lib. - "--disable-shared" "--enable-static" - + [ "--disable-java" + "--disable-native-java" # Share the cache among the various `configure' runs. "--config-cache" + "--with-included-gettext" + "--with-included-glib" + "--with-included-libcroco" ]); # On cross building, gettext supposes that the wchar.h from libc @@ -28,6 +30,8 @@ stdenv.mkDerivation (rec { echo gl_cv_func_wcwidth_works=yes > cachefile configureFlags="$configureFlags --cache-file=`pwd`/cachefile" fi + '' + stdenv.lib.optionalString stdenv.isCygwin '' + sed -i -e "s/\(am_libgettextlib_la_OBJECTS = \)error.lo/\\1/" gettext-tools/gnulib-lib/Makefile.in ''; buildInputs = [ xz ] ++ stdenv.lib.optional (!stdenv.isLinux) libiconv; 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 , 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 . */ + + + /* Tell glibc's 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 , 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 . */ + + + /* Tell glibc's 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 , 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 . */ + + +@@ -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 + # endif + # endif +-# ifdef __CYGWIN__ +-# define WIN32_LEAN_AND_MEAN +-# include +-# endif + #elif defined WIN32_NATIVE + # define WIN32_LEAN_AND_MEAN + # include +@@ -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 +