Re: [PATCH 20/24] Allow TUI windows in Python

Simon Marchi
2020-03-11T04:47:53Z

On 2020-03-10 8:23 p.m., Tom Tromey wrote:
>>>>>> "Simon" == Simon Marchi <simark@simark.ca> writes:
>
> Simon> In file included from /home/smarchi/src/binutils-gdb/gdb/python/py-tui.c:24:
> Simon> /home/smarchi/src/binutils-gdb/gdb/gdb_curses.h:47:10: fatal error: ncurses.h: No such file or directory
> Simon> 47 | #include <ncurses.h>
> Simon> | ^~~~~~~~~~~
>
> Simon> So I suspect weare missing an #if/#ifdef somwhere. config.log contains:
>
> Simon> /* Define to 1 if you have the <ncursesw/ncurses.h> header file. */
> Simon> /* #undef HAVE_NCURSESW_NCURSES_H */
>
> Simon> /* Define to 1 if you have the <ncurses.h> header file. */
> Simon> /* #undef HAVE_NCURSES_H */
>
> Simon> /* Define to 1 if you have the <ncurses/ncurses.h> header file. */
> Simon> /* #undef HAVE_NCURSES_NCURSES_H */
>
> That is weird because gdb_curses.h says (I marked line 47):
>
> #if defined (HAVE_NCURSESW_NCURSES_H)
> #include <ncursesw/ncurses.h>
> #elif defined (HAVE_NCURSES_NCURSES_H)
> #include <ncurses/ncurses.h>
> #elif defined (HAVE_NCURSES_H)
> ---> #include <ncurses.h>
> #elif defined (HAVE_CURSESX_H)
> #include <cursesX.h>
> #elif defined (HAVE_CURSES_H)
> #include <curses.h>
> #endif
>
> ... which sure looks like it is guarded by HAVE_NCURSES_H.
>
> I couldn't find any other code that might define HAVE_NCURSES_H.
>
> I don't know what's going on here :(
>
> Tom
>

Sorry for being terse earlier, I didn't have much time. I took another look,
I built the file with -save-temps and inspected the .ii file. The
HAVE_NCURSES_H comes from pyconfig.h, which comes from the Python installation.

For example, on my Ubuntu here, it's at:

/usr/include/x86_64-linux-gnu/python3.8/pyconfig.h

This file tells us Python was built with ncurses, which doesn't mean the
ncurses development headers are installed and available to GDB. I find it
very odd that Python exposes these very generically-named macros in the global
namespace. Almost any of these HAVE_FOO macros from Python could clash with
our own macros.

Anyway, I was able to reproduce it starting from a scratch Ubuntu 20.04 docker
container, installing everything required to build GDB except the ncurses
development headers.

One way to fix it is to make sure "python-internal.h" is included after
"gdb_curses.h", in py-tui.c.

Simon