Fallback to stub-termcap.c on all hosts

Currently building gdb is impossible without an installed termcap or
curses library.  But, GDB already has a very minimal termcap in the
tree to handle this situation for Windows -- gdb/stub-termcap.c.  This
patch makes that the fallback for all hosts.

Testing this on GNU/Linux (by simply hacking away the termcap/curses
detection in gdb/configure.ac), we trip on:

 ../readline/libreadline.a(terminal.o): In function `_rl_init_terminal_io':
 /home/pedro/gdb/mygit/src/readline/terminal.c:527: undefined reference to `PC'
 /home/pedro/gdb/mygit/src/readline/terminal.c:528: undefined reference to `BC'
 /home/pedro/gdb/mygit/src/readline/terminal.c:529: undefined reference to `UP'
 /home/pedro/gdb/mygit/src/readline/terminal.c:538: undefined reference to `PC'
 /home/pedro/gdb/mygit/src/readline/terminal.c:539: undefined reference to `BC'
 /home/pedro/gdb/mygit/src/readline/terminal.c:540: undefined reference to `UP'

These are globals that are normally defined by termcap (or ncurses'
termcap emulation).

Now, we could just define replacements in stub-termcap.c, but
readline/terminal.c (at least the copy in our tree) has this:

 #if !defined (__linux__) && !defined (NCURSES_VERSION)
 #  if defined (__EMX__) || defined (NEED_EXTERN_PC)
 extern
 #  endif /* __EMX__ || NEED_EXTERN_PC */
 char PC, *BC, *UP;
 #endif /* !__linux__ && !NCURSES_VERSION */

which can result in readline defining the globals too.  That will
usually work out in C, given that "-fcommon" is usually the default
for C compilers, but that won't work for C++, or C with -fno-common
(link fails with "multiple definition" errors)...

Mirroring those #ifdef conditions in the stub termcap screams
"brittle" to me -- I can see them changing in latter readline
versions.

Work around that by simply using __attribute__((weak)).
Windows/PE/COFF's do support weak, but not on gcc 3.4 based toolchains
(4.8.x does work).  Given the file never needed the variables while it
was Windows-only, just continue not defining them there.  All other
supported hosts should support this.

gdb/ChangeLog:
2015-04-06  Pedro Alves  <palves@redhat.com>
	    Bernd Edlinger  <bernd.edlinger@hotmail.de>

	* configure.ac: Remove the mingw32-specific stub-termcap.o
	fallback, and instead fallback to the stub termcap on all hosts.
	* configure: Regenerate.
	* stub-termcap.c [!__MINGW32__] (PC, BC, UP): Define as weak
	symbols.
This commit is contained in:
Pedro Alves 2015-04-06 12:35:18 +01:00
parent 1fa29f1060
commit 7a85168daf
4 changed files with 31 additions and 13 deletions

View File

@ -1,3 +1,12 @@
2015-04-06 Pedro Alves <palves@redhat.com>
Bernd Edlinger <bernd.edlinger@hotmail.de>
* configure.ac: Remove the mingw32-specific stub-termcap.o
fallback, and instead fallback to the stub termcap on all hosts.
* configure: Regenerate.
* stub-termcap.c [!__MINGW32__] (PC, BC, UP): Define as weak
symbols.
2015-04-03 Pierre-Marie de Rodat <derodat@adacore.com>
* gdbtypes.c (is_dynamic_type_internal): Remove the unused

7
gdb/configure vendored
View File

@ -7455,11 +7455,6 @@ case $host_os in
go32* | *djgpp*)
ac_cv_search_tgetent="none required"
;;
*mingw32*)
if test x"$curses_found" != xyes; then
ac_cv_search_tgetent="none required"
CONFIG_OBS="$CONFIG_OBS stub-termcap.o"
fi ;;
esac
# These are the libraries checked by Readline.
@ -7521,7 +7516,7 @@ fi
if test "$ac_cv_search_tgetent" = no; then
as_fn_error "no termcap library found" "$LINENO" 5
CONFIG_OBS="$CONFIG_OBS stub-termcap.o"
fi

View File

@ -617,18 +617,13 @@ case $host_os in
go32* | *djgpp*)
ac_cv_search_tgetent="none required"
;;
*mingw32*)
if test x"$curses_found" != xyes; then
ac_cv_search_tgetent="none required"
CONFIG_OBS="$CONFIG_OBS stub-termcap.o"
fi ;;
esac
# These are the libraries checked by Readline.
AC_SEARCH_LIBS(tgetent, [termcap tinfo curses ncurses])
if test "$ac_cv_search_tgetent" = no; then
AC_MSG_ERROR([no termcap library found])
CONFIG_OBS="$CONFIG_OBS stub-termcap.o"
fi
AC_ARG_WITH([system-readline],

View File

@ -40,9 +40,28 @@ extern char *tgoto (const char *cap, int col, int row);
}
#endif
/* These globals below are global termcap variables that readline
references.
Actually, depending on preprocessor conditions that we don't want
to mirror here (as they may change depending on readline versions),
readline may define these globals as well, relying on the linker
merging them if needed (-fcommon). That doesn't work with
-fno-common or C++, so instead we define the symbols as weak.
Don't do this on Windows though, as MinGW gcc 3.4.2 doesn't support
weak (later versions, e.g., 4.8, do support it). Given this stub
file originally was Windows only, and we only needed this when we
made it work on other hosts, it should be OK. */
#ifndef __MINGW32__
char PC __attribute__((weak));
char *BC __attribute__((weak));
char *UP __attribute__((weak));
#endif
/* Each of the files below is a minimal implementation of the standard
termcap function with the same name, suitable for use in a Windows
console window. */
console window, or when a real termcap/curses library isn't
available. */
int
tgetent (char *buffer, char *termtype)