diff --git a/core/glibc/0001-localedata-Do-not-generate-output-if-warnings-were-p.patch b/core/glibc/0001-localedata-Do-not-generate-output-if-warnings-were-p.patch new file mode 100644 index 000000000..f07973a0c --- /dev/null +++ b/core/glibc/0001-localedata-Do-not-generate-output-if-warnings-were-p.patch @@ -0,0 +1,69 @@ +From 732dd3a63d39c7ca77e817b462285c14551c8b49 Mon Sep 17 00:00:00 2001 +From: Carlos O'Donell +Date: Thu, 3 Feb 2022 16:01:52 -0500 +Subject: [PATCH] localedata: Do not generate output if warnings were present. + +With LC_MONETARY parsing fixed we can now generate locales +without forcing output with '-c'. + +Removing '-c' from localedef invocation is the equivalent of +using -Werror for localedef. The glibc locale sources should +always be clean and free from warnings. + +We remove '-c' from both test locale generation and the targets +used for installing locales e.g. install-locale-archive, and +install-locale-files. + +Tested on x86_64 and i686 without regressions. +Tested with install-locale-archive target. +Tested with install-locale-files target. + +Reviewed-by: DJ Delorie +(cherry picked from commit 1c7a34567d21fbd3b706c77cd794956b43daefe7) +--- + localedata/Makefile | 4 ++-- + localedata/gen-locale.sh | 10 ++++++++-- + 2 files changed, 10 insertions(+), 4 deletions(-) + +diff --git a/localedata/Makefile b/localedata/Makefile +index 9ae2e5c161..7741ac3b5e 100644 +--- a/localedata/Makefile ++++ b/localedata/Makefile +@@ -468,11 +468,11 @@ define build-one-locale + endef + + $(INSTALL-SUPPORTED-LOCALE-ARCHIVE): install-locales-dir +- @flags="-c"; \ ++ @flags=""; \ + $(build-one-locale) + + $(INSTALL-SUPPORTED-LOCALE-FILES): install-locales-dir +- @flags="-c --no-archive --no-hard-links"; \ ++ @flags="--no-archive --no-hard-links"; \ + $(build-one-locale) + + tst-setlocale-ENV = LC_ALL=ja_JP.EUC-JP +diff --git a/localedata/gen-locale.sh b/localedata/gen-locale.sh +index 7fce35f212..8053c816a6 100644 +--- a/localedata/gen-locale.sh ++++ b/localedata/gen-locale.sh +@@ -54,8 +54,14 @@ modifier=`echo $locfile|sed 's|[^.]*[.]\([^@ ]*\)\(@[^ ]*\)\?/LC_CTYPE|\2|'` + + echo "Generating locale $locale.$charmap: this might take a while..." + +-# Run quietly and force output. +-flags="--quiet -c" ++# Do not force output with '-c', all locales should compile without ++# warning or errors. There is likewise no need to run quietly with ++# '--quiet' since all locales should compile without additional ++# diagnostics. If there are messages printed then we want to see ++# them, fix them, and the associated error or warning. During ++# development it may be beneficialy to put '--quiet -c' here to allow ++# you to develop in-progress locales. ++flags="" + + # For SJIS the charmap is SHIFT_JIS. We just want the locale to have + # a slightly nicer name instead of using "*.SHIFT_SJIS", but that +-- +2.35.1 + diff --git a/core/glibc/0001-localedef-Update-LC_MONETARY-handling-Bug-28845.patch b/core/glibc/0001-localedef-Update-LC_MONETARY-handling-Bug-28845.patch new file mode 100644 index 000000000..9f3b2cd3b --- /dev/null +++ b/core/glibc/0001-localedef-Update-LC_MONETARY-handling-Bug-28845.patch @@ -0,0 +1,302 @@ +From 3feecd80013c822a12d4b01c5c25e155dfbc6e2f Mon Sep 17 00:00:00 2001 +From: Carlos O'Donell +Date: Thu, 3 Feb 2022 16:51:59 -0500 +Subject: [PATCH] localedef: Update LC_MONETARY handling (Bug 28845) + +ISO C17, POSIX Issue 7, and ISO 30112 all allow the char* +types to be empty strings i.e. "", integer or char values to +be -1 or CHAR_MAX respectively, with the exception of +decimal_point which must be non-empty in ISO C. Note that +the defaults for mon_grouping vary, but are functionaly +equivalent e.g. "\177" (no further grouping reuqired) vs. +"" (no grouping defined for all groups). + +We include a broad comment talking about harmonizing ISO C, +POSIX, ISO 30112, and the default C/POSIX locale for glibc. + +We reorder all setting based on locale/categories.def order. + +We soften all missing definitions from errors to warnings when +defaults exist. + +Given that ISO C, POSIX and ISO 30112 allow the empty string +we change LC_MONETARY handling of mon_decimal_point to allow +the empty string. If mon_decimal_point is not defined at all +then we pick the existing legacy glibc default value of + i.e. ".". + +We also set the default for mon_thousands_sep_wc at the +same time as mon_thousands_sep, but this is not a change in +behaviour, it is always either a matching value or L'\0', +but if in the future we change the default to a non-empty +string we would need to update both at the same time. + +Tested on x86_64 and i686 without regressions. +Tested with install-locale-archive target. +Tested with install-locale-files target. + +Reviewed-by: DJ Delorie +(cherry picked from commit 2ab8b74567dc0a9a3c98696e6444881997dd6c49) +--- + locale/programs/ld-monetary.c | 182 +++++++++++++++++++++++++++------- + 1 file changed, 146 insertions(+), 36 deletions(-) + +diff --git a/locale/programs/ld-monetary.c b/locale/programs/ld-monetary.c +index 3b0412b405..18698bbe94 100644 +--- a/locale/programs/ld-monetary.c ++++ b/locale/programs/ld-monetary.c +@@ -196,21 +196,105 @@ No definition for %s category found"), "LC_MONETARY"); + } + } + ++ /* Generally speaking there are 3 standards the define the default, ++ warning, and error behaviour of LC_MONETARY. They are ISO/IEC TR 30112, ++ ISO/IEC 9899:2018 (ISO C17), and POSIX.1-2017. Within 30112 we have the ++ definition of a standard i18n FDCC-set, which for LC_MONETARY has the ++ following default values: ++ int_curr_symbol "" ++ currency_symbol "" ++ mon_decimal_point "" i.e. "," ++ mon_thousand_sep "" ++ mon_grouping "\177" i.e. CHAR_MAX ++ positive_sign "" ++ negative_sign "" i.e. "." ++ int_frac_digits -1 ++ frac_digits -1 ++ p_cs_precedes -1 ++ p_sep_by_space -1 ++ n_cs_precedes -1 ++ n_sep_by_space -1 ++ p_sign_posn -1 ++ n_sign_posn -1 ++ Under 30112 a keyword that is not provided implies an empty string "" ++ for string values or a -1 for integer values, and indicates the value ++ is unspecified with no default implied. No errors are considered. ++ The exception is mon_grouping which is a string with a terminating ++ CHAR_MAX. ++ For POSIX Issue 7 we have: ++ https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap07.html ++ and again values not provided default to "" or -1, and indicate the value ++ is not available to the locale. The exception is mon_grouping which is ++ a string with a terminating CHAR_MAX. For the POSIX locale the values of ++ LC_MONETARY should be: ++ int_curr_symbol "" ++ currency_symbol "" ++ mon_decimal_point "" ++ mon_thousands_sep "" ++ mon_grouping "\177" i.e. CHAR_MAX ++ positive_sign "" ++ negative_sign "" ++ int_frac_digits -1 ++ frac_digits -1 ++ p_cs_precedes -1 ++ p_sep_by_space -1 ++ n_cs_precedes -1 ++ n_sep_by_space -1 ++ p_sign_posn -1 ++ n_sign_posn -1 ++ int_p_cs_precedes -1 ++ int_p_sep_by_space -1 ++ int_n_cs_precedes -1 ++ int_n_sep_by_space -1 ++ int_p_sign_posn -1 ++ int_n_sign_posn -1 ++ Like with 30112, POSIX also considers no error if the keywords are ++ missing, only that if the cateory as a whole is missing the referencing ++ of the category results in unspecified behaviour. ++ For ISO C17 there is no default value provided, but the localeconv ++ specification in 7.11.2.1 admits that members of char * type may point ++ to "" to indicate a value is not available or is of length zero. ++ The exception is decimal_point (not mon_decimal_point) which must be a ++ defined non-empty string. The values of char, which are generally ++ mapped to integer values in 30112 and POSIX, must be non-negative ++ numbers that map to CHAR_MAX when a value is not available in the ++ locale. ++ In ISO C17 for the "C" locale all values are empty strings "", or ++ CHAR_MAX, with the exception of decimal_point which is "." (defined ++ in LC_NUMERIC). ISO C17 makes no exception for mon_grouping like ++ 30112 and POSIX, but a value of "" is functionally equivalent to ++ "\177" since neither defines a grouping (though the latter terminates ++ the grouping). ++ ++ Lastly, we must consider the legacy C/POSIX locale that implemented ++ as a builtin in glibc and wether a default value mapping to the ++ C/POSIX locale may benefit the user from a compatibility perspective. ++ ++ Thus given 30112, POSIX, ISO C, and the builtin C/POSIX locale we ++ need to pick appropriate defaults below. */ ++ ++ /* The members of LC_MONETARY are handled in the order of their definition ++ in locale/categories.def. Please keep them in that order. */ ++ ++ /* The purpose of TEST_ELEM is to define a default value for the fields ++ in the category if the field was not defined in the cateory. If the ++ category was present but we didn't see a definition for the field then ++ we also issue a warning, otherwise the only warning you get is the one ++ earlier when a default category is created (completely missing category). ++ This missing field warning is glibc-specific since no standard requires ++ this warning, but we consider it valuable to print a warning for all ++ missing fields in the category. */ + #define TEST_ELEM(cat, initval) \ + if (monetary->cat == NULL) \ + { \ + if (! nothing) \ +- record_error (0, 0, _("%s: field `%s' not defined"), \ +- "LC_MONETARY", #cat); \ ++ record_warning (_("%s: field `%s' not defined"), \ ++ "LC_MONETARY", #cat); \ + monetary->cat = initval; \ + } + ++ /* Keyword: int_curr_symbol. */ + TEST_ELEM (int_curr_symbol, ""); +- TEST_ELEM (currency_symbol, ""); +- TEST_ELEM (mon_thousands_sep, ""); +- TEST_ELEM (positive_sign, ""); +- TEST_ELEM (negative_sign, ""); +- + /* The international currency symbol must come from ISO 4217. */ + if (monetary->int_curr_symbol != NULL) + { +@@ -247,41 +331,63 @@ not correspond to a valid name in ISO 4217 [--no-warnings=intcurrsym]"), + } + } + +- /* The decimal point must not be empty. This is not said explicitly +- in POSIX but ANSI C (ISO/IEC 9899) says in 4.4.2.1 it has to be +- != "". */ ++ /* Keyword: currency_symbol */ ++ TEST_ELEM (currency_symbol, ""); ++ ++ /* Keyword: mon_decimal_point */ ++ /* ISO C17 7.11.2.1.3 explicitly allows mon_decimal_point to be the ++ empty string e.g. "". This indicates the value is not available in the ++ current locale or is of zero length. However, if the value was never ++ defined then we issue a warning and use a glibc-specific default. ISO ++ 30112 in the i18n FDCC-Set uses ",", and POSIX Issue 7 in the ++ POSIX locale uses "". It is specific to glibc that the default is ++ "."; we retain this existing behaviour for backwards compatibility. */ + if (monetary->mon_decimal_point == NULL) + { + if (! nothing) +- record_error (0, 0, _("%s: field `%s' not defined"), +- "LC_MONETARY", "mon_decimal_point"); ++ record_warning (_("%s: field `%s' not defined, using defaults"), ++ "LC_MONETARY", "mon_decimal_point"); + monetary->mon_decimal_point = "."; + monetary->mon_decimal_point_wc = L'.'; + } +- else if (monetary->mon_decimal_point[0] == '\0' && ! be_quiet && ! nothing) ++ ++ /* Keyword: mon_thousands_sep */ ++ if (monetary->mon_thousands_sep == NULL) + { +- record_error (0, 0, _("\ +-%s: value for field `%s' must not be an empty string"), +- "LC_MONETARY", "mon_decimal_point"); ++ if (! nothing) ++ record_warning (_("%s: field `%s' not defined, using defaults"), ++ "LC_MONETARY", "mon_thousands_sep"); ++ monetary->mon_thousands_sep = ""; ++ monetary->mon_thousands_sep_wc = L'\0'; + } + ++ /* Keyword: mon_grouping */ + if (monetary->mon_grouping_len == 0) + { + if (! nothing) +- record_error (0, 0, _("%s: field `%s' not defined"), +- "LC_MONETARY", "mon_grouping"); +- ++ record_warning (_("%s: field `%s' not defined"), ++ "LC_MONETARY", "mon_grouping"); ++ /* Missing entries are given 1 element in their bytearray with ++ a value of CHAR_MAX which indicates that "No further grouping ++ is to be performed" (functionally equivalent to ISO C's "C" ++ locale default of ""). */ + monetary->mon_grouping = (char *) "\177"; + monetary->mon_grouping_len = 1; + } + ++ /* Keyword: positive_sign */ ++ TEST_ELEM (positive_sign, ""); ++ ++ /* Keyword: negative_sign */ ++ TEST_ELEM (negative_sign, ""); ++ + #undef TEST_ELEM + #define TEST_ELEM(cat, min, max, initval) \ + if (monetary->cat == -2) \ + { \ + if (! nothing) \ +- record_error (0, 0, _("%s: field `%s' not defined"), \ +- "LC_MONETARY", #cat); \ ++ record_warning (_("%s: field `%s' not defined"), \ ++ "LC_MONETARY", #cat); \ + monetary->cat = initval; \ + } \ + else if ((monetary->cat < min || monetary->cat > max) \ +@@ -300,16 +406,11 @@ not correspond to a valid name in ISO 4217 [--no-warnings=intcurrsym]"), + TEST_ELEM (p_sign_posn, -1, 4, -1); + TEST_ELEM (n_sign_posn, -1, 4, -1); + +- /* The non-POSIX.2 extensions are optional. */ +- if (monetary->duo_int_curr_symbol == NULL) +- monetary->duo_int_curr_symbol = monetary->int_curr_symbol; +- if (monetary->duo_currency_symbol == NULL) +- monetary->duo_currency_symbol = monetary->currency_symbol; +- +- if (monetary->duo_int_frac_digits == -2) +- monetary->duo_int_frac_digits = monetary->int_frac_digits; +- if (monetary->duo_frac_digits == -2) +- monetary->duo_frac_digits = monetary->frac_digits; ++ /* Keyword: crncystr */ ++ monetary->crncystr = (char *) xmalloc (strlen (monetary->currency_symbol) ++ + 2); ++ monetary->crncystr[0] = monetary->p_cs_precedes ? '-' : '+'; ++ strcpy (&monetary->crncystr[1], monetary->currency_symbol); + + #undef TEST_ELEM + #define TEST_ELEM(cat, alt, min, max) \ +@@ -327,6 +428,17 @@ not correspond to a valid name in ISO 4217 [--no-warnings=intcurrsym]"), + TEST_ELEM (int_p_sign_posn, p_sign_posn, -1, 4); + TEST_ELEM (int_n_sign_posn, n_sign_posn, -1, 4); + ++ /* The non-POSIX.2 extensions are optional. */ ++ if (monetary->duo_int_curr_symbol == NULL) ++ monetary->duo_int_curr_symbol = monetary->int_curr_symbol; ++ if (monetary->duo_currency_symbol == NULL) ++ monetary->duo_currency_symbol = monetary->currency_symbol; ++ ++ if (monetary->duo_int_frac_digits == -2) ++ monetary->duo_int_frac_digits = monetary->int_frac_digits; ++ if (monetary->duo_frac_digits == -2) ++ monetary->duo_frac_digits = monetary->frac_digits; ++ + TEST_ELEM (duo_p_cs_precedes, p_cs_precedes, -1, 1); + TEST_ELEM (duo_p_sep_by_space, p_sep_by_space, -1, 2); + TEST_ELEM (duo_n_cs_precedes, n_cs_precedes, -1, 1); +@@ -349,17 +461,15 @@ not correspond to a valid name in ISO 4217 [--no-warnings=intcurrsym]"), + if (monetary->duo_valid_to == 0) + monetary->duo_valid_to = 99991231; + ++ /* Keyword: conversion_rate */ + if (monetary->conversion_rate[0] == 0) + { + monetary->conversion_rate[0] = 1; + monetary->conversion_rate[1] = 1; + } + +- /* Create the crncystr entry. */ +- monetary->crncystr = (char *) xmalloc (strlen (monetary->currency_symbol) +- + 2); +- monetary->crncystr[0] = monetary->p_cs_precedes ? '-' : '+'; +- strcpy (&monetary->crncystr[1], monetary->currency_symbol); ++ /* A value for monetary-decimal-point-wc was set when ++ monetary_decimal_point was set, likewise for monetary-thousands-sep-wc. */ + } + + +-- +2.35.1 + diff --git a/core/glibc/PKGBUILD b/core/glibc/PKGBUILD index f9ccfe824..6ca110eba 100644 --- a/core/glibc/PKGBUILD +++ b/core/glibc/PKGBUILD @@ -10,19 +10,17 @@ # - Specify our build host type # - Disabled distcc # - Strip out Arch x86 multilib -# - Don't --enable-static-pie, broken on ARM # - Don't --enable-cet, x86 only noautobuild=1 pkgname=glibc pkgver=2.35 -pkgrel=2 +pkgrel=3 arch=(x86_64) url='https://www.gnu.org/software/libc' license=(GPL LGPL) makedepends=(git gd python) -optdepends=('perl: for mtrace') options=(!strip staticlibs !lto !distcc) #_commit=3de512be7ea6053255afed6154db9ee31d4e557a #source=(git+https://sourceware.org/git/glibc.git#commit=$_commit @@ -30,7 +28,10 @@ source=(https://ftp.gnu.org/gnu/glibc/glibc-$pkgver.tar.xz{,.sig} locale.gen.txt locale-gen sdt.h sdt-config.h - disable-clone3.diff) + disable-clone3.diff + 0001-localedef-Update-LC_MONETARY-handling-Bug-28845.patch + 0001-localedata-Do-not-generate-output-if-warnings-were-p.patch +) validpgpkeys=(7273542B39962DF7B299931416792B4EA25340F8 # Carlos O'Donell BC7C7372637EC10C57D7AA6579C43DFBF1CF2187) # Siddhesh Poyarekar b2sums=('623c728884f070cd87ffeb9203f74206197c52405ac9bc44f3dd519a3468b8e8ae2536c883e5d17d94417dbd1e91775de2e674314e4ff7424f9720026d6b7063' @@ -39,7 +40,9 @@ b2sums=('623c728884f070cd87ffeb9203f74206197c52405ac9bc44f3dd519a3468b8e8ae2536c '1f6d927b4972220b1c00abee5329c5d6bc01ed5bee57b20db0c7d7433292f7d666b02baf9968267f8e378b1f3bb273e8eef0ccbf22d21400ac36949d7615a474' 'a6a5e2f2a627cc0d13d11a82458cfd0aa75ec1c5a3c7647e5d5a3bb1d4c0770887a3909bfda1236803d5bc9801bfd6251e13483e9adf797e4725332cd0d91a0e' '214e995e84b342fe7b2a7704ce011b7c7fc74c2971f98eeb3b4e677b99c860addc0a7d91b8dc0f0b8be7537782ee331999e02ba48f4ccc1c331b60f27d715678' - 'edef5f724f68ea95c6b0127bd13a10245f548afc381b2d0a6d1d06ee9f87b7dd89c6becd35d5ae722bf838594eb870a747f67f07f46e7d63f8c8d1a43cce4a52') + 'edef5f724f68ea95c6b0127bd13a10245f548afc381b2d0a6d1d06ee9f87b7dd89c6becd35d5ae722bf838594eb870a747f67f07f46e7d63f8c8d1a43cce4a52' + '3c4de02d6308a4d39693e6effa08894ae096397347e439b93b0b5328aba41a373f7f2eeb88c109970f69cca65aaa74ba14e384d6d033f6a913438f4f920854a6' + 'b6014af23688ea971d7af38d58829c8016a0af63770b7f5e8bc986c13ea2cafefe0935ff483b1b37c87ebe3e652b6e0c48ab43dd8ae752d0ed7fecc3751432f4') prepare() { mkdir -p glibc-build @@ -53,6 +56,10 @@ prepare() { # Patch src: https://patchwork.ozlabs.org/project/glibc/patch/87eebkf8ph.fsf@oldenburg.str.redhat.com/ patch -Np1 -i "${srcdir}"/disable-clone3.diff + # Fix C.UTF-8 generation errors + # https://bugs.archlinux.org/task/73797 + patch -Np1 -i "${srcdir}"/0001-localedef-Update-LC_MONETARY-handling-Bug-28845.patch + patch -Np1 -i "${srcdir}"/0001-localedata-Do-not-generate-output-if-warnings-were-p.patch } build() { @@ -60,12 +67,9 @@ build() { --prefix=/usr --with-headers=/usr/include --with-bugurl=https://github.com/archlinuxarm/PKGBUILDs/issues - --enable-add-ons --enable-bind-now - --enable-lock-elision --disable-multi-arch --enable-stack-protector=strong - --enable-stackguard-randomization --enable-systemtap --disable-profile --disable-crypt @@ -103,7 +107,7 @@ build() { echo "CFLAGS += -Wp,-D_FORTIFY_SOURCE=2" >> configparms make -O - # build info pages manually for reprducibility + # build info pages manually for reproducibility make info } @@ -127,7 +131,7 @@ check() { # The following tests fail due to restrictions in the Arch build system # The correct fix is to add the following to the systemd-nspawn call: - # --capability=CAP_IPC_LOCK --system-call-filter="@clock @pkey" + # --system-call-filter="@clock @memlock @pkey" skip_test test-errno-linux sysdeps/unix/sysv/linux/Makefile skip_test tst-ntp_gettime sysdeps/unix/sysv/linux/Makefile skip_test tst-ntp_gettimex sysdeps/unix/sysv/linux/Makefile @@ -142,17 +146,15 @@ check() { package() { pkgdesc='GNU C Library' depends=('linux-api-headers>=4.10' tzdata filesystem) - optdepends=('gd: for memusagestat') + optdepends=('gd: for memusagestat' + 'perl: for mtrace') install=glibc.install backup=(etc/gai.conf etc/locale.gen etc/nscd.conf) - install -dm755 "$pkgdir/etc" - touch "$pkgdir/etc/ld.so.conf" - make -C glibc-build install_root="$pkgdir" install - rm -f "$pkgdir"/etc/ld.so.{cache,conf} + rm -f "$pkgdir"/etc/ld.so.cache # Shipped in tzdata rm -f "$pkgdir"/usr/bin/{tzselect,zdump,zic} @@ -180,18 +182,15 @@ package() { # Do not strip these for gdb and valgrind functionality, but strip the rest find "$pkgdir"/usr/lib \ - -not -name 'ld-*.so' \ - -not -name 'libc-*.so' \ - -not -name 'libpthread-*.so' \ - -not -name 'libthread_db-*.so' \ - -name '*-*.so' -type f -exec strip $STRIP_SHARED {} + 2> /dev/null || true + -not -name 'ld-*.so*' \ + -not -name 'libc.so*' \ + -not -name 'libpthread.so*' \ + -not -name 'libthread_db.so*' \ + -name '*.so*' -type f -exec strip $STRIP_SHARED {} + 2> /dev/null || true fi # Provide tracing probes to libstdc++ for exceptions, possibly for other # libraries too. Useful for gdb's catch command. install -Dm644 "$srcdir/sdt.h" "$pkgdir/usr/include/sys/sdt.h" install -Dm644 "$srcdir/sdt-config.h" "$pkgdir/usr/include/sys/sdt-config.h" - - # Provided by libxcrypt; keep the old shared library for backwards compatibility - rm -f "$pkgdir"/usr/include/crypt.h "$pkgdir"/usr/lib/libcrypt.{a,so} }