http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54659
Tobias Burnus <burnus at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |burnus at gcc dot gnu.org, | |rguenther at suse dot de --- Comment #1 from Tobias Burnus <burnus at gcc dot gnu.org> 2012-10-26 10:36:30 UTC --- >From PR 54281: | With --disable-nls intl.h does | | #ifdef ENABLE_NLS | #include <libintl.h> | extern void gcc_init_libintl (void); | extern size_t gcc_gettext_width (const char *); | #else | /* Stubs. */ | # undef textdomain | # define textdomain(domain) (domain) | # undef bindtextdomain | # define bindtextdomain(domain, directory) (domain) | # undef gettext | # define gettext(msgid) (msgid) | | which wrecks an included libintl.h: | We end up including libintl.h through | | gcc/double-int.h | #include <gmp.h> | #include <iosfwd> (here from GCC 4.1) | #include <bits/c++locale.h> | #include <libintl.h> Side note: On my system only GCC 4.1's c++locale.h includes libintl.h, GCC 4.3/4.4/4.5/4.6/4.7 don't. And: | Possibly by looking for and | including libintl.h before re-defining those macros? It's the toplevel | intl.h btw. | Another fix is to include all system headers (and thus gmp.h) from system.h | which always comes before includes of intl.h. The patch for PR 54281 comment 10 (Rev. 190487) changed it to: #if defined(HAVE_LIBINTL_H) || defined(ENABLE_NLS) # include <libintl.h> #endif #ifdef ENABLE_NLS ... #else /* Stubs. */ # undef textdomain # define textdomain(domain) (domain) ... As written in comment 0, that breaks MinGW builds as libintl.h re-defined fprint on non-POSIX-printf systems. If one now tries to undo the effect by using: #if defined(HAVE_LIBINTL_H) || defined(ENABLE_NLS) # include <libintl.h> # if !defined(ENABLE_NLS) # undef fprintf # undef sprintf # undef snprintf # undef vfprintf # endif #endif One ends up with: libbackend.a(ipa-pure-const.o): In function `check_decl': C:\MinGW\msys\1.0\home\brad\gfortran\ibin\gcc/../../gcc-trunk/gcc/ipa-pure-const.c:253: undefined reference to `_libintl _fprintf' ... libcommon-target.a(opts.o): In function `wrap_help': C:\MinGW\msys\1.0\home\brad\gfortran\ibin\gcc/../../gcc-trunk/gcc/opts.c:884: undefined reference to `___printf__' Without having tested with neither MinGW nor with GCC 4.1/Linux, I wonder whether one could do something like: #if defined(HAVE_LIBINTL_H) && !defined(ENABLE_NLS) # define _LIBINTL_H 1 #end if #ifdef (ENABLE_NLS) # include <libintl.h> #endif Or is that too evil or won't it work?