This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: Fix tui compilation with Solaris libcurses (PR tui/21482)
Hi Pedro,
>> It turned out this happens because <curses.h> has
>>
>> #define clear() wclear(stdscr)
>>
>> This can be avoided by defining NOMACROS, which the patch below does
>> for solaris2.*.
>
> We already handle some curses warts in gdb_curses.h (and then
> include that header instead everywhere). I think this could go there,
> even unconditionally. (This is more about curses implementation
> than OS strictly speaking. Googling around finds hits for that
> macro in the AIX curses.h header, for example.). Looks like ncurses
probably of SysVr4 origin ultimately: at least I already found it in
those sources.
> checks NCURSES_NOMACROS instead of NOMACROS, we could define that too.
Makes sense (unless this creates problems of its own ;-).
>> * Even with this workaround, compilation fails in gdb/tui for several
>> instances of the same problem:
>>
>> /vol/src/gnu/gdb/gdb-8.0-branch/local/gdb/tui/tui-winsource.c: In function ‘void tui_erase_source_content(tui_win_info*, int)’:
>> /vol/src/gnu/gdb/gdb-8.0-branch/local/gdb/tui/tui-winsource.c:257:18: error: invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive]
>> no_src_str);
>> ^
>> In file included from /vol/src/gnu/gdb/gdb-8.0-branch/local/gdb/gdb_curses.h:42:0,
>> from /vol/src/gnu/gdb/gdb-8.0-branch/local/gdb/tui/tui-data.h:26,
>> from /vol/src/gnu/gdb/gdb-8.0-branch/local/gdb/tui/tui-winsource.c:33:
>> /vol/gcc-7/lib/gcc/sparc-sun-solaris2.10/7.1.0/include-fixed/curses.h:699:12: note: initializing argument 4 of ‘int mvwaddstr(WINDOW*, int, int, char*)’
>> extern int mvwaddstr(WINDOW *, int, int, char *);
>> ^~~~~~~~~
>> make[2]: *** [Makefile:1927: tui-winsource.o] Error 1
>>
>> Unlike ncurses, <curses.h> declares
>>
>> extern int mvwaddstr(WINDOW *, int, int, char *);
>>
>> i.e. the last arg is char *, not const char *.
>>
>> The patch fixes this by casting the last arg to mvwaddstr to char *,
>> as was recently done on mainline in a newterm() call (the only
>> difference between 8.0 and mainline gdb/tui).
>
> That's fine with me.
>
> Looking at:
>
> https://docs.oracle.com/cd/E19455-01/806-0629/6j9vjco9i/index.html
>
> I see that this affects several APIs, so nicer would be to
> fix this centrally in gdb_curses.h like we fix e.g.,
> PyObject_GetAttrString in python/python-internal.h. But that can
> be for another day.
This way you centralize the knowledge why you are doing this in once
header rather than several calls/casts. I guess we'll cross that bridge
once another function causes similar trouble.
>> With those changes, gdb on the 8.0 branch compiles cleanly on
>> sparcv9-sun-solaris2.10 with native curses and amd64-pc-solaris2.12
>> with bundled ncurses (well, almost: on Solaris 12 ncurses in
>> /usr/include is used, but gdb linked against -lcurses which fails:
>>
>> Undefined first referenced
>> symbol in file
>> wattr_on tui-wingeneral.o
>> wattr_off tui-wingeneral.o
>>
>> but that's a different and preexisting problem).
>
> These two problems would be better pushed as two separate patches
> (with the rationales given above as separate commit logs).
Fine with me. I'll look at the ncurses header vs. libcurses issue
later: so far I've just been lazy and manually linked gdb if I hit it.
>> Ok for mainline and 8.0 branch?
>
> The cast bits are OK. I'd like to hear your opinion on
> moving the NOMACROS define to gdb_curses.h, before including
> <curses.h>.
The move makes sense to me: I just wasn't aware of that file. I'll
prepare a separate patch.
Thanks.
Rainer
--
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University