about summary refs log tree commit diff
path: root/nixpkgs/pkgs/development/libraries/gettext
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/development/libraries/gettext')
-rw-r--r--nixpkgs/pkgs/development/libraries/gettext/CVE-2018-18751-bison.patch323
-rw-r--r--nixpkgs/pkgs/development/libraries/gettext/absolute-paths.diff21
-rw-r--r--nixpkgs/pkgs/development/libraries/gettext/default.nix110
-rw-r--r--nixpkgs/pkgs/development/libraries/gettext/gettext-setup-hook.sh17
4 files changed, 471 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/development/libraries/gettext/CVE-2018-18751-bison.patch b/nixpkgs/pkgs/development/libraries/gettext/CVE-2018-18751-bison.patch
new file mode 100644
index 000000000000..b734c1c8b027
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/gettext/CVE-2018-18751-bison.patch
@@ -0,0 +1,323 @@
+This patch was generated by re-running Bison 3.0.4 on pro-gram-gen.y after
+applying CVE-2018-18751.patch. This patch removes the need to add bison to
+nativeBuildInputs.
+
+--- a/gettext-tools/src/po-gram-gen.c
++++ b/gettext-tools/src/po-gram-gen.c
+@@ -568,9 +568,9 @@ static const yytype_uint8 yytranslate[] =
+ static const yytype_uint16 yyrline[] =
+ {
+        0,   169,   169,   171,   172,   173,   174,   179,   187,   195,
+-     216,   240,   249,   258,   269,   278,   292,   301,   315,   321,
+-     332,   338,   350,   361,   372,   376,   391,   414,   422,   434,
+-     442
++     216,   237,   246,   255,   266,   275,   289,   298,   312,   318,
++     329,   335,   347,   358,   369,   373,   388,   411,   419,   431,
++     439
+ };
+ #endif
+
+@@ -1419,14 +1419,11 @@ yyreduce:
+                   check_obsolete ((yyvsp[-3].message_intro), (yyvsp[-1].string));
+                   check_obsolete ((yyvsp[-3].message_intro), (yyvsp[0].rhs));
+                   if (!(yyvsp[-3].message_intro).obsolete || pass_obsolete_entries)
+-                    {
+-                      do_callback_message ((yyvsp[-3].message_intro).ctxt, string2, &(yyvsp[-3].message_intro).pos, (yyvsp[-1].string).string,
+-                                           (yyvsp[0].rhs).rhs.msgstr, (yyvsp[0].rhs).rhs.msgstr_len, &(yyvsp[0].rhs).pos,
+-                                           (yyvsp[-3].message_intro).prev_ctxt,
+-                                           (yyvsp[-3].message_intro).prev_id, (yyvsp[-3].message_intro).prev_id_plural,
+-                                           (yyvsp[-3].message_intro).obsolete);
+-                      free ((yyvsp[-1].string).string);
+-                    }
++                    do_callback_message ((yyvsp[-3].message_intro).ctxt, string2, &(yyvsp[-3].message_intro).pos, (yyvsp[-1].string).string,
++                                         (yyvsp[0].rhs).rhs.msgstr, (yyvsp[0].rhs).rhs.msgstr_len, &(yyvsp[0].rhs).pos,
++                                         (yyvsp[-3].message_intro).prev_ctxt,
++                                         (yyvsp[-3].message_intro).prev_id, (yyvsp[-3].message_intro).prev_id_plural,
++                                         (yyvsp[-3].message_intro).obsolete);
+                   else
+                     {
+                       free_message_intro ((yyvsp[-3].message_intro));
+@@ -1435,11 +1432,11 @@ yyreduce:
+                       free ((yyvsp[0].rhs).rhs.msgstr);
+                     }
+                 }
+-#line 1439 "po-gram-gen.c" /* yacc.c:1646  */
++#line 1436 "po-gram-gen.c" /* yacc.c:1646  */
+     break;
+
+   case 11:
+-#line 241 "po-gram-gen.y" /* yacc.c:1646  */
++#line 238 "po-gram-gen.y" /* yacc.c:1646  */
+     {
+                   check_obsolete ((yyvsp[-2].message_intro), (yyvsp[-1].stringlist));
+                   check_obsolete ((yyvsp[-2].message_intro), (yyvsp[0].string));
+@@ -1448,11 +1445,11 @@ yyreduce:
+                   string_list_destroy (&(yyvsp[-1].stringlist).stringlist);
+                   free ((yyvsp[0].string).string);
+                 }
+-#line 1452 "po-gram-gen.c" /* yacc.c:1646  */
++#line 1449 "po-gram-gen.c" /* yacc.c:1646  */
+     break;
+
+   case 12:
+-#line 250 "po-gram-gen.y" /* yacc.c:1646  */
++#line 247 "po-gram-gen.y" /* yacc.c:1646  */
+     {
+                   check_obsolete ((yyvsp[-2].message_intro), (yyvsp[-1].stringlist));
+                   check_obsolete ((yyvsp[-2].message_intro), (yyvsp[0].rhs));
+@@ -1461,22 +1458,22 @@ yyreduce:
+                   string_list_destroy (&(yyvsp[-1].stringlist).stringlist);
+                   free ((yyvsp[0].rhs).rhs.msgstr);
+                 }
+-#line 1465 "po-gram-gen.c" /* yacc.c:1646  */
++#line 1462 "po-gram-gen.c" /* yacc.c:1646  */
+     break;
+
+   case 13:
+-#line 259 "po-gram-gen.y" /* yacc.c:1646  */
++#line 256 "po-gram-gen.y" /* yacc.c:1646  */
+     {
+                   check_obsolete ((yyvsp[-1].message_intro), (yyvsp[0].stringlist));
+                   po_gram_error_at_line (&(yyvsp[-1].message_intro).pos, _("missing 'msgstr' section"));
+                   free_message_intro ((yyvsp[-1].message_intro));
+                   string_list_destroy (&(yyvsp[0].stringlist).stringlist);
+                 }
+-#line 1476 "po-gram-gen.c" /* yacc.c:1646  */
++#line 1473 "po-gram-gen.c" /* yacc.c:1646  */
+     break;
+
+   case 14:
+-#line 270 "po-gram-gen.y" /* yacc.c:1646  */
++#line 267 "po-gram-gen.y" /* yacc.c:1646  */
+     {
+                   (yyval.message_intro).prev_ctxt = NULL;
+                   (yyval.message_intro).prev_id = NULL;
+@@ -1485,11 +1482,11 @@ yyreduce:
+                   (yyval.message_intro).pos = (yyvsp[0].string).pos;
+                   (yyval.message_intro).obsolete = (yyvsp[0].string).obsolete;
+                 }
+-#line 1489 "po-gram-gen.c" /* yacc.c:1646  */
++#line 1486 "po-gram-gen.c" /* yacc.c:1646  */
+     break;
+
+   case 15:
+-#line 279 "po-gram-gen.y" /* yacc.c:1646  */
++#line 276 "po-gram-gen.y" /* yacc.c:1646  */
+     {
+                   check_obsolete ((yyvsp[-1].prev), (yyvsp[0].string));
+                   (yyval.message_intro).prev_ctxt = (yyvsp[-1].prev).ctxt;
+@@ -1499,11 +1496,11 @@ yyreduce:
+                   (yyval.message_intro).pos = (yyvsp[0].string).pos;
+                   (yyval.message_intro).obsolete = (yyvsp[0].string).obsolete;
+                 }
+-#line 1503 "po-gram-gen.c" /* yacc.c:1646  */
++#line 1500 "po-gram-gen.c" /* yacc.c:1646  */
+     break;
+
+   case 16:
+-#line 293 "po-gram-gen.y" /* yacc.c:1646  */
++#line 290 "po-gram-gen.y" /* yacc.c:1646  */
+     {
+                   check_obsolete ((yyvsp[-1].string), (yyvsp[0].stringlist));
+                   (yyval.prev).ctxt = (yyvsp[-1].string).string;
+@@ -1512,11 +1509,11 @@ yyreduce:
+                   (yyval.prev).pos = (yyvsp[-1].string).pos;
+                   (yyval.prev).obsolete = (yyvsp[-1].string).obsolete;
+                 }
+-#line 1516 "po-gram-gen.c" /* yacc.c:1646  */
++#line 1513 "po-gram-gen.c" /* yacc.c:1646  */
+     break;
+
+   case 17:
+-#line 302 "po-gram-gen.y" /* yacc.c:1646  */
++#line 299 "po-gram-gen.y" /* yacc.c:1646  */
+     {
+                   check_obsolete ((yyvsp[-2].string), (yyvsp[-1].stringlist));
+                   check_obsolete ((yyvsp[-2].string), (yyvsp[0].string));
+@@ -1526,21 +1523,21 @@ yyreduce:
+                   (yyval.prev).pos = (yyvsp[-2].string).pos;
+                   (yyval.prev).obsolete = (yyvsp[-2].string).obsolete;
+                 }
+-#line 1530 "po-gram-gen.c" /* yacc.c:1646  */
++#line 1527 "po-gram-gen.c" /* yacc.c:1646  */
+     break;
+
+   case 18:
+-#line 316 "po-gram-gen.y" /* yacc.c:1646  */
++#line 313 "po-gram-gen.y" /* yacc.c:1646  */
+     {
+                   (yyval.string).string = NULL;
+                   (yyval.string).pos = (yyvsp[0].pos).pos;
+                   (yyval.string).obsolete = (yyvsp[0].pos).obsolete;
+                 }
+-#line 1540 "po-gram-gen.c" /* yacc.c:1646  */
++#line 1537 "po-gram-gen.c" /* yacc.c:1646  */
+     break;
+
+   case 19:
+-#line 322 "po-gram-gen.y" /* yacc.c:1646  */
++#line 319 "po-gram-gen.y" /* yacc.c:1646  */
+     {
+                   check_obsolete ((yyvsp[-2].pos), (yyvsp[-1].stringlist));
+                   check_obsolete ((yyvsp[-2].pos), (yyvsp[0].pos));
+@@ -1548,21 +1545,21 @@ yyreduce:
+                   (yyval.string).pos = (yyvsp[0].pos).pos;
+                   (yyval.string).obsolete = (yyvsp[0].pos).obsolete;
+                 }
+-#line 1552 "po-gram-gen.c" /* yacc.c:1646  */
++#line 1549 "po-gram-gen.c" /* yacc.c:1646  */
+     break;
+
+   case 20:
+-#line 333 "po-gram-gen.y" /* yacc.c:1646  */
++#line 330 "po-gram-gen.y" /* yacc.c:1646  */
+     {
+                   (yyval.string).string = NULL;
+                   (yyval.string).pos = (yyvsp[0].pos).pos;
+                   (yyval.string).obsolete = (yyvsp[0].pos).obsolete;
+                 }
+-#line 1562 "po-gram-gen.c" /* yacc.c:1646  */
++#line 1559 "po-gram-gen.c" /* yacc.c:1646  */
+     break;
+
+   case 21:
+-#line 339 "po-gram-gen.y" /* yacc.c:1646  */
++#line 336 "po-gram-gen.y" /* yacc.c:1646  */
+     {
+                   check_obsolete ((yyvsp[-2].pos), (yyvsp[-1].stringlist));
+                   check_obsolete ((yyvsp[-2].pos), (yyvsp[0].pos));
+@@ -1570,11 +1567,11 @@ yyreduce:
+                   (yyval.string).pos = (yyvsp[0].pos).pos;
+                   (yyval.string).obsolete = (yyvsp[0].pos).obsolete;
+                 }
+-#line 1574 "po-gram-gen.c" /* yacc.c:1646  */
++#line 1571 "po-gram-gen.c" /* yacc.c:1646  */
+     break;
+
+   case 22:
+-#line 351 "po-gram-gen.y" /* yacc.c:1646  */
++#line 348 "po-gram-gen.y" /* yacc.c:1646  */
+     {
+                   check_obsolete ((yyvsp[-1].pos), (yyvsp[0].stringlist));
+                   plural_counter = 0;
+@@ -1582,30 +1579,30 @@ yyreduce:
+                   (yyval.string).pos = (yyvsp[-1].pos).pos;
+                   (yyval.string).obsolete = (yyvsp[-1].pos).obsolete;
+                 }
+-#line 1586 "po-gram-gen.c" /* yacc.c:1646  */
++#line 1583 "po-gram-gen.c" /* yacc.c:1646  */
+     break;
+
+   case 23:
+-#line 362 "po-gram-gen.y" /* yacc.c:1646  */
++#line 359 "po-gram-gen.y" /* yacc.c:1646  */
+     {
+                   check_obsolete ((yyvsp[-1].pos), (yyvsp[0].stringlist));
+                   (yyval.string).string = string_list_concat_destroy (&(yyvsp[0].stringlist).stringlist);
+                   (yyval.string).pos = (yyvsp[-1].pos).pos;
+                   (yyval.string).obsolete = (yyvsp[-1].pos).obsolete;
+                 }
+-#line 1597 "po-gram-gen.c" /* yacc.c:1646  */
++#line 1594 "po-gram-gen.c" /* yacc.c:1646  */
+     break;
+
+   case 24:
+-#line 373 "po-gram-gen.y" /* yacc.c:1646  */
++#line 370 "po-gram-gen.y" /* yacc.c:1646  */
+     {
+                   (yyval.rhs) = (yyvsp[0].rhs);
+                 }
+-#line 1605 "po-gram-gen.c" /* yacc.c:1646  */
++#line 1602 "po-gram-gen.c" /* yacc.c:1646  */
+     break;
+
+   case 25:
+-#line 377 "po-gram-gen.y" /* yacc.c:1646  */
++#line 374 "po-gram-gen.y" /* yacc.c:1646  */
+     {
+                   check_obsolete ((yyvsp[-1].rhs), (yyvsp[0].rhs));
+                   (yyval.rhs).rhs.msgstr = XNMALLOC ((yyvsp[-1].rhs).rhs.msgstr_len + (yyvsp[0].rhs).rhs.msgstr_len, char);
+@@ -1617,11 +1614,11 @@ yyreduce:
+                   (yyval.rhs).pos = (yyvsp[-1].rhs).pos;
+                   (yyval.rhs).obsolete = (yyvsp[-1].rhs).obsolete;
+                 }
+-#line 1621 "po-gram-gen.c" /* yacc.c:1646  */
++#line 1618 "po-gram-gen.c" /* yacc.c:1646  */
+     break;
+
+   case 26:
+-#line 392 "po-gram-gen.y" /* yacc.c:1646  */
++#line 389 "po-gram-gen.y" /* yacc.c:1646  */
+     {
+                   check_obsolete ((yyvsp[-4].pos), (yyvsp[-3].pos));
+                   check_obsolete ((yyvsp[-4].pos), (yyvsp[-2].number));
+@@ -1640,11 +1637,11 @@ yyreduce:
+                   (yyval.rhs).pos = (yyvsp[-4].pos).pos;
+                   (yyval.rhs).obsolete = (yyvsp[-4].pos).obsolete;
+                 }
+-#line 1644 "po-gram-gen.c" /* yacc.c:1646  */
++#line 1641 "po-gram-gen.c" /* yacc.c:1646  */
+     break;
+
+   case 27:
+-#line 415 "po-gram-gen.y" /* yacc.c:1646  */
++#line 412 "po-gram-gen.y" /* yacc.c:1646  */
+     {
+                   string_list_init (&(yyval.stringlist).stringlist);
+                   string_list_append (&(yyval.stringlist).stringlist, (yyvsp[0].string).string);
+@@ -1652,11 +1649,11 @@ yyreduce:
+                   (yyval.stringlist).pos = (yyvsp[0].string).pos;
+                   (yyval.stringlist).obsolete = (yyvsp[0].string).obsolete;
+                 }
+-#line 1656 "po-gram-gen.c" /* yacc.c:1646  */
++#line 1653 "po-gram-gen.c" /* yacc.c:1646  */
+     break;
+
+   case 28:
+-#line 423 "po-gram-gen.y" /* yacc.c:1646  */
++#line 420 "po-gram-gen.y" /* yacc.c:1646  */
+     {
+                   check_obsolete ((yyvsp[-1].stringlist), (yyvsp[0].string));
+                   (yyval.stringlist).stringlist = (yyvsp[-1].stringlist).stringlist;
+@@ -1665,11 +1662,11 @@ yyreduce:
+                   (yyval.stringlist).pos = (yyvsp[-1].stringlist).pos;
+                   (yyval.stringlist).obsolete = (yyvsp[-1].stringlist).obsolete;
+                 }
+-#line 1669 "po-gram-gen.c" /* yacc.c:1646  */
++#line 1666 "po-gram-gen.c" /* yacc.c:1646  */
+     break;
+
+   case 29:
+-#line 435 "po-gram-gen.y" /* yacc.c:1646  */
++#line 432 "po-gram-gen.y" /* yacc.c:1646  */
+     {
+                   string_list_init (&(yyval.stringlist).stringlist);
+                   string_list_append (&(yyval.stringlist).stringlist, (yyvsp[0].string).string);
+@@ -1677,11 +1674,11 @@ yyreduce:
+                   (yyval.stringlist).pos = (yyvsp[0].string).pos;
+                   (yyval.stringlist).obsolete = (yyvsp[0].string).obsolete;
+                 }
+-#line 1681 "po-gram-gen.c" /* yacc.c:1646  */
++#line 1678 "po-gram-gen.c" /* yacc.c:1646  */
+     break;
+
+   case 30:
+-#line 443 "po-gram-gen.y" /* yacc.c:1646  */
++#line 440 "po-gram-gen.y" /* yacc.c:1646  */
+     {
+                   check_obsolete ((yyvsp[-1].stringlist), (yyvsp[0].string));
+                   (yyval.stringlist).stringlist = (yyvsp[-1].stringlist).stringlist;
+@@ -1690,11 +1687,11 @@ yyreduce:
+                   (yyval.stringlist).pos = (yyvsp[-1].stringlist).pos;
+                   (yyval.stringlist).obsolete = (yyvsp[-1].stringlist).obsolete;
+                 }
+-#line 1694 "po-gram-gen.c" /* yacc.c:1646  */
++#line 1691 "po-gram-gen.c" /* yacc.c:1646  */
+     break;
+
+
+-#line 1698 "po-gram-gen.c" /* yacc.c:1646  */
++#line 1695 "po-gram-gen.c" /* yacc.c:1646  */
+       default: break;
+     }
+   /* User semantic actions sometimes alter yychar, and that requires
diff --git a/nixpkgs/pkgs/development/libraries/gettext/absolute-paths.diff b/nixpkgs/pkgs/development/libraries/gettext/absolute-paths.diff
new file mode 100644
index 000000000000..af37f61a9a41
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/gettext/absolute-paths.diff
@@ -0,0 +1,21 @@
+diff --git a/gettext-runtime/src/gettext.sh.in b/gettext-runtime/src/gettext.sh.in
+index 1dfa3bb..d6ef8a8 100644
+--- a/gettext-runtime/src/gettext.sh.in
++++ b/gettext-runtime/src/gettext.sh.in
+@@ -86,14 +86,14 @@ fi
+ # looks up the translation of MSGID and substitutes shell variables in the
+ # result.
+ eval_gettext () {
+-  gettext "$1" | (export PATH `envsubst --variables "$1"`; envsubst "$1")
++  @out@/bin/gettext "$1" | (export PATH `@out@/bin/envsubst --variables "$1"`; @out@/bin/envsubst "$1")
+ }
+ 
+ # eval_ngettext MSGID MSGID-PLURAL COUNT
+ # looks up the translation of MSGID / MSGID-PLURAL for COUNT and substitutes
+ # shell variables in the result.
+ eval_ngettext () {
+-  ngettext "$1" "$2" "$3" | (export PATH `envsubst --variables "$1 $2"`; envsubst "$1 $2")
++  @out@/bin/ngettext "$1" "$2" "$3" | (export PATH `@out@/bin/envsubst --variables "$1 $2"`; @out@/bin/envsubst "$1 $2")
+ }
+ 
+ # Note: This use of envsubst is much safer than using the shell built-in 'eval'
diff --git a/nixpkgs/pkgs/development/libraries/gettext/default.nix b/nixpkgs/pkgs/development/libraries/gettext/default.nix
new file mode 100644
index 000000000000..6eb8bae435be
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/gettext/default.nix
@@ -0,0 +1,110 @@
+{ stdenv, lib, fetchurl, libiconv, xz, bison, automake115x, autoconf }:
+
+let allowBisonDependency = !stdenv.isDarwin; in
+stdenv.mkDerivation rec {
+  name = "gettext-${version}";
+  version = "0.19.8.1";
+
+  src = fetchurl {
+    url = "mirror://gnu/gettext/${name}.tar.gz";
+    sha256 = "0hsw28f9q9xaggjlsdp2qmbp2rbd1mp0njzan2ld9kiqwkq2m57z";
+  };
+  patches = [
+    ./absolute-paths.diff
+    (fetchurl {
+      name = "CVE-2018-18751.patch";
+      url = "https://git.savannah.gnu.org/gitweb/?p=gettext.git;a=patch;h=dce3a16e5e9368245735e29bf498dcd5e3e474a4";
+      sha256 = "1lpjwwcjr1sb879faj0xyzw02kma0ivab6xwn3qciy13qy6fq5xn";
+    })
+  ] ++ lib.optionals (!allowBisonDependency) [
+    # Only necessary for CVE-2018-18751.patch:
+    ./CVE-2018-18751-bison.patch
+  ];
+
+  outputs = [ "out" "man" "doc" "info" ];
+
+  hardeningDisable = [ "format" ];
+
+  LDFLAGS = if stdenv.isSunOS then "-lm -lmd -lmp -luutil -lnvpair -lnsl -lidmap -lavl -lsec" else "";
+
+  configureFlags = [
+     "--disable-csharp" "--with-xz"
+     # avoid retaining reference to CF during stdenv bootstrap
+  ] ++ lib.optionals stdenv.isDarwin [
+    "gt_cv_func_CFPreferencesCopyAppValue=no"
+    "gt_cv_func_CFLocaleCopyCurrent=no"
+  ] ++ stdenv.lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [
+    # On cross building, gettext supposes that the wchar.h from libc
+    # does not fulfill gettext needs, so it tries to work with its
+    # own wchar.h file, which does not cope well with the system's
+    # wchar.h and stddef.h (gcc-4.3 - glibc-2.9)
+    "gl_cv_func_wcwidth_works=yes"
+  ];
+
+  postPatch = ''
+   substituteAllInPlace gettext-runtime/src/gettext.sh.in
+   substituteInPlace gettext-tools/projects/KDE/trigger --replace "/bin/pwd" pwd
+   substituteInPlace gettext-tools/projects/GNOME/trigger --replace "/bin/pwd" pwd
+   substituteInPlace gettext-tools/src/project-id --replace "/bin/pwd" pwd
+  '' + lib.optionalString stdenv.hostPlatform.isCygwin ''
+    sed -i -e "s/\(cldr_plurals_LDADD = \)/\\1..\/gnulib-lib\/libxml_rpl.la /" gettext-tools/src/Makefile.in
+    sed -i -e "s/\(libgettextsrc_la_LDFLAGS = \)/\\1..\/gnulib-lib\/libxml_rpl.la /" gettext-tools/src/Makefile.in
+  '';
+
+  nativeBuildInputs = [
+    xz
+    xz.bin
+  ]
+  # Only necessary for CVE-2018-18751.patch (unless CVE-2018-18751-bison.patch
+  # is also applied):
+  ++ lib.optional allowBisonDependency bison
+  ++ [
+    # Only necessary for CVE-2018-18751.patch:
+    automake115x
+    autoconf
+  ];
+  # HACK, see #10874 (and 14664)
+  buildInputs = stdenv.lib.optional (!stdenv.isLinux && !stdenv.hostPlatform.isCygwin) libiconv;
+
+  setupHooks = [
+    ../../../build-support/setup-hooks/role.bash
+    ./gettext-setup-hook.sh
+  ];
+  gettextNeedsLdflags = stdenv.hostPlatform.libc != "glibc" && !stdenv.hostPlatform.isMusl;
+
+  enableParallelBuilding = true;
+  enableParallelChecking = false; # fails sometimes
+
+  meta = with lib; {
+    description = "Well integrated set of translation tools and documentation";
+
+    longDescription = ''
+      Usually, programs are written and documented in English, and use
+      English at execution time for interacting with users.  Using a common
+      language is quite handy for communication between developers,
+      maintainers and users from all countries.  On the other hand, most
+      people are less comfortable with English than with their own native
+      language, and would rather be using their mother tongue for day to
+      day's work, as far as possible.  Many would simply love seeing their
+      computer screen showing a lot less of English, and far more of their
+      own language.
+
+      GNU `gettext' is an important step for the GNU Translation Project, as
+      it is an asset on which we may build many other steps. This package
+      offers to programmers, translators, and even users, a well integrated
+      set of tools and documentation. Specifically, the GNU `gettext'
+      utilities are a set of tools that provides a framework to help other
+      GNU packages produce multi-lingual messages.
+    '';
+
+    homepage = https://www.gnu.org/software/gettext/;
+
+    maintainers = with maintainers; [ zimbatm vrthra ];
+    license = licenses.gpl2Plus;
+    platforms = platforms.all;
+  };
+}
+
+// stdenv.lib.optionalAttrs stdenv.isDarwin {
+  makeFlags = "CFLAGS=-D_FORTIFY_SOURCE=0";
+}
diff --git a/nixpkgs/pkgs/development/libraries/gettext/gettext-setup-hook.sh b/nixpkgs/pkgs/development/libraries/gettext/gettext-setup-hook.sh
new file mode 100644
index 000000000000..ad3763c29b64
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/gettext/gettext-setup-hook.sh
@@ -0,0 +1,17 @@
+gettextDataDirsHook() {
+    # See pkgs/build-support/setup-hooks/role.bash
+    getHostRoleEnvHook
+    if [ -d "$1/share/gettext" ]; then
+        addToSearchPath "GETTEXTDATADIRS${role_post}" "$1/share/gettext"
+    fi
+}
+
+addEnvHooks "$hostOffset" gettextDataDirsHook
+
+# libintl must be listed in load flags on non-Glibc
+# it doesn't hurt to have it in Glibc either though
+if [ -n "@gettextNeedsLdflags@" -a -z "$dontAddExtraLibs" ]; then
+    # See pkgs/build-support/setup-hooks/role.bash
+    getHostRole
+    export NIX_${role_pre}LDFLAGS+=" -lintl"
+fi