This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug bootstrap/54659] [4.8 Regression] Bootstrap with --disable-nls broken under Windows
- From: "rguenther at suse dot de" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Fri, 26 Oct 2012 12:05:14 +0000
- Subject: [Bug bootstrap/54659] [4.8 Regression] Bootstrap with --disable-nls broken under Windows
- Auto-submitted: auto-generated
- References: <bug-54659-4@http.gcc.gnu.org/bugzilla/>
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54659
--- Comment #2 from rguenther at suse dot de <rguenther at suse dot de> 2012-10-26 12:05:14 UTC ---
On Fri, 26 Oct 2012, burnus at gcc dot gnu.org wrote:
>
> 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?
Fact is that all this stuff happens because gmp.h is not included
from system.h ...