mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-27 03:51:15 +08:00
e063da6790
With some toolchains, building in C++ mode stumbles on many instances of: In file included from ../../src/gdb/../include/splay-tree.h:43:0, from ../../src/gdb/dcache.c:26: build-gnulib/import/inttypes.h:61:3: error: #error "This file assumes that 'int' has exactly 32 bits. Please report your platform and compiler to <bug-gnulib@gnu.org>." # error "This file assumes that 'int' has exactly 32 bits. Please report your platform and compiler to <bug-gnulib@gnu.org>." ^ make: *** [dcache.o] Error 1 That's: #if !(INT_MIN == INT32_MIN && INT_MAX == INT32_MAX) # error "This file assumes that 'int' has exactly 32 bits. Please report your platform and compiler to <bug-gnulib@gnu.org>." #endif I see it when cross building for --host=x86_64-w64-mingw32 using Fedora 20's g++ (gcc version 4.8.4 20141219 (Fedora MinGW 4.8.4-1.fc20)), Simon reports seeing this on several cross compilers too. The issue is that on some hosts that predate C++11, when using C++ one must define __STDC_CONSTANT_MACROS/__STDC_LIMIT_MACROS to make visible the definitions of INTMAX_C / INTMAX_MAX etc. This was a C99 requirement that later C++11 -- the first to define stdint.h -- removed, and then C11 removed it as well. https://www.gnu.org/software/gnulib/manual/html_node/stdint_002eh.html says that gnulib's stdint.h fixes this, but because we run gnulib's configure tests with a C compiler, gnulib determines that mingw's stdint.h is C99-compliant, and doesn't actually replace it. Actually, even though configuring gnulib with a C++ compiler does result in gnulib replacing stdint.h, the resulting replacement is broken for mingw, because it defines uintptr_t incorrectly. I sent a gnulib patch upstream to fix that, here: https://lists.gnu.org/archive/html/bug-gnulib/2015-11/msg00004.html but then even with that, gnulib still stumbles on other configured-with-C++-compiler problems. So for now, until gnulib + C++ is fixed upstream and then gdb's copy is updated, which may take a while, I think it's best to keep configuring gnulib in C, and define __STDC_LIMIT_MACROS/__STDC_CONSTANT_MACROS ourselves, just like C99 intended. gdb/ChangeLog: 2015-11-17 Pedro Alves <palves@redhat.com> * common/common-defs.h (__STDC_CONSTANT_MACROS) (__STDC_LIMIT_MACROS): Define before including stdint.h.
80 lines
2.2 KiB
C
80 lines
2.2 KiB
C
/* Common definitions.
|
|
|
|
Copyright (C) 1986-2015 Free Software Foundation, Inc.
|
|
|
|
This file is part of GDB.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
#ifndef COMMON_DEFS_H
|
|
#define COMMON_DEFS_H
|
|
|
|
#include "config.h"
|
|
#ifdef GDBSERVER
|
|
#include "build-gnulib-gdbserver/config.h"
|
|
#else
|
|
#include "build-gnulib/config.h"
|
|
#endif
|
|
|
|
#include <stdarg.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <stddef.h>
|
|
|
|
/* From:
|
|
https://www.gnu.org/software/gnulib/manual/html_node/stdint_002eh.html
|
|
|
|
"On some hosts that predate C++11, when using C++ one must define
|
|
__STDC_CONSTANT_MACROS to make visible the definitions of constant
|
|
macros such as INTMAX_C, and one must define __STDC_LIMIT_MACROS to
|
|
make visible the definitions of limit macros such as INTMAX_MAX."
|
|
|
|
gnulib doesn't fix this for us correctly yet. See:
|
|
https://lists.gnu.org/archive/html/bug-gnulib/2015-11/msg00004.html
|
|
|
|
Meanwhile, explicitly define these ourselves, as C99 intended. */
|
|
#define __STDC_CONSTANT_MACROS 1
|
|
#define __STDC_LIMIT_MACROS 1
|
|
#include <stdint.h>
|
|
|
|
#include <string.h>
|
|
#include <errno.h>
|
|
#include <alloca.h>
|
|
#include "ansidecl.h"
|
|
#include "libiberty.h"
|
|
#include "pathmax.h"
|
|
#include "gdb/signals.h"
|
|
#include "gdb_locale.h"
|
|
#include "ptid.h"
|
|
#include "common-types.h"
|
|
#include "common-utils.h"
|
|
#include "gdb_assert.h"
|
|
#include "errors.h"
|
|
#include "print-utils.h"
|
|
#include "common-debug.h"
|
|
#include "cleanups.h"
|
|
#include "common-exceptions.h"
|
|
|
|
#ifdef __cplusplus
|
|
# define EXTERN_C extern "C"
|
|
# define EXTERN_C_PUSH extern "C" {
|
|
# define EXTERN_C_POP }
|
|
#else
|
|
# define EXTERN_C extern
|
|
# define EXTERN_C_PUSH
|
|
# define EXTERN_C_POP
|
|
#endif
|
|
|
|
#endif /* COMMON_DEFS_H */
|