The test-quotearg test always fails on MacOS X and AIX. The reason is that this test attempts to override the gettext() function from libintl by defining a gettext() function in the main compilation unit. When libintl is a shared library, this works only when the object file format is ELF. But MacOS X and AIX don't use ELF, so the test fails.
The fix is to use the real gettext() function, and let it access a particular .mo file. I'm committing this: 2009-01-25 Bruno Haible <br...@clisp.org> Make test-quotearg work on MacOS X and AIX. * tests/test-quotearg.sh: New file. * tests/locale/fr/LC_MESSAGES/test-quotearg.po: New file. * tests/locale/fr/LC_MESSAGES/test-quotearg.mo: New file. * tests/test-quotearg.c: Include <locale.h> and gettext.h. Don't include <libintl.h>. (fake_locale): Remove variable. (gettext, dgettext, dcgettext): Remove functions. (main): Instead of setting a fake locale, set a real locale. Call textdomain and bindtextdomain. * modules/quotearg-tests (Files): Add the new files. (Depends-on): Add gettext, setenv, unsetenv. (configure.ac): Invoke gt_LOCALE_FR and gt_LOCALE_FR_UTF8. (Makefile.am): Add test-quotearg.sh to TESTS, remove test-quotearg. Augment TESTS_ENVIRONMENT. ======================= tests/test-quotearg.sh ============================== #!/bin/sh # Choose an existing locale. The locale encoding does not matter; see the # comment in test-quotearg.po. if test $LOCALE_FR_UTF8 != none; then locale=$LOCALE_FR_UTF8 else if test $LOCALE_FR != none; then locale=$LOCALE_FR else locale=none fi fi LOCALE=$locale LOCALEDIR="$srcdir/locale" \ ./test-quotearg${EXEEXT} ============ tests/locale/fr/LC_MESSAGES/test-quotearg.po =================== # Message catalog that maps the ASCII replacements for single-quote characters # to real single-quote characters. # The header entry is commented out on purpose, so that gettext() performs no # no character set conversion from the PO file's encoding to the locale # encoding. This allows us to use the same PO file in various locales. #msgid "" #msgstr "" #"Project-Id-Version: GNU gnulib\n" #"PO-Revision-Date: 2009-01-26 01:02+01:00\n" #"Last-Translator: Eric Blake <e...@byu.net>\n" #"Language-Team: Undetermined <u...@li.org>\n" #"MIME-Version: 1.0\n" #"Content-Type: text/plain; charset=UTF-8\n" #"Content-Transfer-Encoding: 8bit\n" msgid "`" msgstr "\302\253" msgid "'" msgstr "\302\273" ============================================================================= --- tests/test-quotearg.c.orig 2009-01-26 03:18:10.000000000 +0100 +++ tests/test-quotearg.c 2009-01-26 02:31:02.000000000 +0100 @@ -22,6 +22,7 @@ #include "quotearg.h" #include <ctype.h> +#include <locale.h> #include <stdbool.h> #include <stdint.h> #include <stdio.h> @@ -29,20 +30,7 @@ #include <string.h> #include "progname.h" - -#if ENABLE_NLS -/* On Linux, gettext is optionally defined as a forwarding macro, - which would cause syntax errors in our definition below. But on - platforms that require -lintl, we cannot #undef gettext, since we - want to provide the entry point libintl_gettext. So we disable - optimizations to avoid the Linux macros. */ -# undef __OPTIMIZE__ -# include <libintl.h> - -/* These quotes are borrowed from a pt_PT.utf8 translation. */ -# define LQ "\302\253" -# define RQ "\302\273" -#endif +#include "gettext.h" #define ASSERT(expr) \ do \ @@ -163,6 +151,11 @@ }; #if ENABLE_NLS + +/* These quotes are borrowed from a pt_PT.utf8 translation. */ +# define LQ "\302\253" +# define RQ "\302\273" + static struct result_groups locale_results[] = { /* locale_quoting_style */ { { LQ RQ, LQ "\\0001\\0" RQ, 11, LQ "simple" RQ, @@ -180,6 +173,7 @@ { LQ RQ, LQ "\\0001\\0" RQ, 11, LQ "simple" RQ, LQ " \\t\\n'\"\\033?""?/\\\\" RQ, LQ "a\\:b" RQ, LQ "a\\\\b" RQ } } }; + #endif /* ENABLE_NLS */ static void @@ -251,40 +245,6 @@ return p; } -#if ENABLE_NLS -/* True if the locale should be faked. */ -static bool fake_locale; - -/* A replacement gettext that allows testing of locale quotes without - requiring a locale. */ -char * -gettext (char const *str) -{ - if (fake_locale) - { - static char lq[] = LQ; - static char rq[] = RQ; - if (strcmp (str, "`") == 0) - return lq; - if (strcmp (str, "'") == 0) - return rq; - } - return (char *) str; -} - -char * -dgettext (char const *d, char const *str) -{ - return gettext (str); -} - -char * -dcgettext (char const *d, char const *str, int c) -{ - return gettext (str); -} -#endif /* ENABLE_NLS */ - int main (int argc, char *argv[]) { @@ -292,7 +252,7 @@ set_program_name (argv[0]); - /* This program is hard-wired to the C locale since it does not call + /* This program part is hard-wired to the C locale since it does not call setlocale. */ ASSERT (!isprint ('\033')); for (i = literal_quoting_style; i <= clocale_quoting_style; i++) @@ -325,21 +285,37 @@ ASSERT (set_quoting_flags (NULL, 0) == QA_SPLIT_TRIGRAPHS); #if ENABLE_NLS - /* Rather than change locales, and require a .gmo file with - translations for "`" and "'" that match our expectations, we - merely override the gettext function to satisfy the link - dependencies of quotearg.c. */ - fake_locale = true; - - set_quoting_style (NULL, locale_quoting_style); - compare_strings (use_quotearg_buffer, &locale_results[0].group1); - compare_strings (use_quotearg, &locale_results[0].group2); - compare_strings (use_quotearg_colon, &locale_results[0].group3); - - set_quoting_style (NULL, clocale_quoting_style); - compare_strings (use_quotearg_buffer, &locale_results[1].group1); - compare_strings (use_quotearg, &locale_results[1].group2); - compare_strings (use_quotearg_colon, &locale_results[1].group3); + /* Clean up environment. */ + unsetenv ("LANGUAGE"); + unsetenv ("LC_ALL"); + unsetenv ("LC_MESSAGES"); + unsetenv ("LC_CTYPE"); + unsetenv ("LANG"); + unsetenv ("OUTPUT_CHARSET"); + + /* This program part runs in a French UTF-8 locale. It uses + the test-quotearg.mo message catalog. */ + { + const char *locale_name = getenv ("LOCALE"); + + if (locale_name != NULL && strcmp (locale_name, "none") != 0 + && setenv ("LC_ALL", locale_name, 1) == 0 + && setlocale (LC_ALL, "") != NULL) + { + textdomain ("test-quotearg"); + bindtextdomain ("test-quotearg", getenv ("LOCALEDIR")); + + set_quoting_style (NULL, locale_quoting_style); + compare_strings (use_quotearg_buffer, &locale_results[0].group1); + compare_strings (use_quotearg, &locale_results[0].group2); + compare_strings (use_quotearg_colon, &locale_results[0].group3); + + set_quoting_style (NULL, clocale_quoting_style); + compare_strings (use_quotearg_buffer, &locale_results[1].group1); + compare_strings (use_quotearg, &locale_results[1].group2); + compare_strings (use_quotearg_colon, &locale_results[1].group3); + } + } #endif /* ENABLE_NLS */ quotearg_free (); --- modules/quotearg-tests.orig 2009-01-26 03:18:10.000000000 +0100 +++ modules/quotearg-tests 2009-01-26 03:18:09.000000000 +0100 @@ -1,13 +1,24 @@ Files: +tests/test-quotearg.sh tests/test-quotearg.c +tests/locale/fr/LC_MESSAGES/test-quotearg.po +tests/locale/fr/LC_MESSAGES/test-quotearg.mo +m4/locale-fr.m4 +m4/codeset.m4 Depends-on: +gettext progname stdint +setenv +unsetenv configure.ac: +gt_LOCALE_FR +gt_LOCALE_FR_UTF8 Makefile.am: -TESTS += test-quotearg +TESTS += test-quotearg.sh +TESTS_ENVIRONMENT += EXEEXT='@EXEEXT@' srcdir='$(srcdir)' LOCALE_FR='@LOCALE_FR@' LOCALE_FR_UTF8='@LOCALE_FR_UTF8@' check_PROGRAMS += test-quotearg test_quotearg_LDADD = $(LDADD) @LIBINTL@