Control: forwarded -1 https://github.com/telmich/gpm/pull/49
Control: tags -1 + patch
Hi Samuel,
On Mon, Feb 17, 2025 at 05:17:27PM +0000, Matthias Klose wrote:
> lib/libcurses.c:52:5: error: conflicting types for ‘Gpm_Wgetch’; have
> ‘int(WINDOW *)’ {aka ‘int(struct _WINDOW *)’}
> 52 | int Gpm_Wgetch(WINDOW *win)
> | ^~~~~~~~~~
> In file included from
> /build/reproducible-path/gpm-1.20.7/src/headers/gpmInt.h:28,
> from lib/libcurses.c:30:
> /build/reproducible-path/gpm-1.20.7/src/headers/gpm.h:271:12: note: previous
> declaration of ‘Gpm_Wgetch’ with type ‘int(void)’
> 271 | extern int Gpm_Wgetch();
> | ^~~~~~~~~~
This is a really tricky one. src/headers/gpm.h wants to declare
int Gpm_Wgetch(WINDOW*);
without #including <curses.h>. Until C23, its workaround is declaring
int Gpm_Wgetch();
but that is now treated as a function taking no arguments and it does
not work. There is work upstream trying to fix this, but the proposed MR
makes gpm depend on ncurses and that means we'll get into a
bootstrapping loop. Do you build gpm before curses or curses before gpm?
The MR also fixes a problem with shadowing and another unspecified
argument list. In the latter case a forward declaration can be used.
So in this case, I don't see many options but to turn it into
int Gpm_Wgetch(void*);
which should keep existing code compiling (except when it passes
multiple arguments or non-pointer arguments).
The attached patch makes it build. It's not great.
Helmut
diff --minimal -Nru gpm-1.20.7/debian/changelog gpm-1.20.7/debian/changelog
--- gpm-1.20.7/debian/changelog 2024-03-13 12:46:09.000000000 +0100
+++ gpm-1.20.7/debian/changelog 2025-02-20 14:01:07.000000000 +0100
@@ -1,3 +1,10 @@
+gpm (1.20.7-11.1) UNRELEASED; urgency=medium
+
+ * Non-maintainer upload.
+ * Fix FTBFS with gcc-15. (Closes: #1096759)
+
+ -- Helmut Grohne <[email protected]> Thu, 20 Feb 2025 14:01:07 +0100
+
gpm (1.20.7-11) unstable; urgency=medium
* control: Drop dependency on now-obsolete lsb-base.
diff --minimal -Nru gpm-1.20.7/debian/patches/050_dont_link_libcurses
gpm-1.20.7/debian/patches/050_dont_link_libcurses
--- gpm-1.20.7/debian/patches/050_dont_link_libcurses 2018-04-28
16:56:18.000000000 +0200
+++ gpm-1.20.7/debian/patches/050_dont_link_libcurses 2025-02-20
14:01:07.000000000 +0100
@@ -55,7 +55,7 @@
#ifdef HAVE_NCURSES_H
#include <ncurses.h>
#else
-@@ -40,8 +41,13 @@
+@@ -40,10 +41,16 @@
#endif /* HAVE_CURSES_H */
#endif /* HAVE_NCURSES_CURSES_H */
#endif /* HAVE_NCURSES_H */
@@ -68,5 +68,21 @@
#define GET(win) ((win) ? wgetch(win) : getch())
+#endif
- int Gpm_Wgetch(WINDOW *win)
+-int Gpm_Wgetch(WINDOW *win)
++/* We would like to declare it Gpm_Wgetch(WINDOW *), but gpm.h cannot include
curses.h */
++int Gpm_Wgetch(void *win)
{
+ fd_set selSet;
+ int max, flag, result;
+--- a/src/headers/gpm.h
++++ b/src/headers/gpm.h
+@@ -268,7 +268,8 @@
+ /* libcurses.c */
+ /* #include <curses.h> Hmm... seems risky */
+
+-extern int Gpm_Wgetch();
++/* We would like to declare it Gpm_Wgetch(WINDOW*), but we cannot include
curses.h. */
++extern int Gpm_Wgetch(void*);
+ #define Gpm_Getch() (Gpm_Wgetch(NULL))
+
+ /* libxtra.c */
diff --minimal -Nru gpm-1.20.7/debian/patches/098_fix_gcc_15_shadowing
gpm-1.20.7/debian/patches/098_fix_gcc_15_shadowing
--- gpm-1.20.7/debian/patches/098_fix_gcc_15_shadowing 1970-01-01
01:00:00.000000000 +0100
+++ gpm-1.20.7/debian/patches/098_fix_gcc_15_shadowing 2025-02-20
14:01:07.000000000 +0100
@@ -0,0 +1,231 @@
+From d58e927716ede7a195d85997c1fb9e9e2b8411b8 Mon Sep 17 00:00:00 2001
+From: NHOrus <[email protected]>
+Date: Tue, 11 Feb 2025 18:42:47 +0400
+Subject: [PATCH] Avoid shadowing ncurses functions. This fails with GCC-15 and
+ other compilers implementing C23 Added prefix gpm_ to raw() and noraw() used
+ in two files because they are implemented in same two files, and are static.
+ Same with scr_dump() and src_restore() in yacc source file
+
+---
+ src/prog/gpm-root.y | 10 +++++-----
+ src/prog/hltest.c | 11 +++++------
+ src/prog/mouse-test.c | 24 ++++++++++++------------
+ 3 files changed, 22 insertions(+), 23 deletions(-)
+
+diff --git a/src/prog/gpm-root.y b/src/prog/gpm-root.y
+index 76c896c..800e51b 100644
+--- a/src/prog/gpm-root.y
++++ b/src/prog/gpm-root.y
+@@ -941,7 +941,7 @@ static unsigned short clear_sel_args[6]={0, 0,0, 0,0, 4};
+ static unsigned char *clear_sel_arg= (unsigned char *)clear_sel_args+1;
+
+ /*------------*/
+-static inline void scr_dump(int fd, FILE *f, unsigned char *buffer, int vc)
++static inline void gpm_scr_dump(int fd, FILE *f, unsigned char *buffer, int
vc)
+ {
+ int dumpfd;
+ char dumpname[20];
+@@ -960,7 +960,7 @@ static inline void scr_dump(int fd, FILE *f, unsigned char
*buffer, int vc)
+ }
+
+ /*------------*/
+-static inline void scr_restore(int fd, FILE *f, unsigned char *buffer, int vc)
++static inline void gpm_scr_restore(int fd, FILE *f, unsigned char *buffer,
int vc)
+ {
+ int dumpfd;
+ char dumpname[20];
+@@ -1002,7 +1002,7 @@ Posted *postmenu(int fd, FILE *f, Draw *draw, int x, int
y, int console)
+ if (!new) return NULL;
+ new->draw=draw;
+ new->dump=dump=malloc(opt_buf);
+- scr_dump(fd,f,dump,console);
++ gpm_scr_dump(fd,f,dump,console);
+ lines=dump[0]; columns=dump[1];
+ i=(columns*dump[3]+dump[2])*2+1; /* where to get it */
+ if (i<0) i=1;
+@@ -1060,7 +1060,7 @@ Posted *postmenu(int fd, FILE *f, Draw *draw, int x, int
y, int console)
+ for (i=0; i<draw->width; i++) PUTC(HORLINE,draw->bord,draw->back);
+ PUTC(LRCORNER,draw->bord,draw->back);
+
+- scr_restore(fd,f,dump,console);
++ gpm_scr_restore(fd,f,dump,console);
+ free(dump);
+
+ #undef PUTC
+@@ -1077,7 +1077,7 @@ Posted *unpostmenu(int fd, FILE *f, Posted *which, int
vc)
+ {
+ Posted *prev=which->prev;
+
+- scr_restore(fd,f,which->dump, vc);
++ gpm_scr_restore(fd,f,which->dump, vc);
+ ioctl(fd,TCXONC,TCOON); /* activate the console */
+ free(which->dump);
+ free(which);
+diff --git a/src/prog/hltest.c b/src/prog/hltest.c
+index cce0abc..a916873 100644
+--- a/src/prog/hltest.c
++++ b/src/prog/hltest.c
+@@ -80,7 +80,6 @@ int wid,hei,vcsize;
+ unsigned short clear_sel_args[6]={0, 0,0, 0,0, 4};
+ unsigned char *clear_sel_arg= (unsigned char *)clear_sel_args+1;
+
+-
+ static inline int scrdump(char *buf)
+ {
+ clear_sel_arg[0]=2; /* clear_selection */
+@@ -99,7 +98,7 @@ static inline int scrrestore(char *buf)
+
+
+ /* I don't like curses, so I'm doing low level stuff here */
+-static void raw(void)
++static void gpm_raw(void)
+ {
+ struct termios it;
+
+@@ -115,7 +114,7 @@ tcsetattr(fileno(stdin),TCSANOW,&it);
+
+ }
+
+-static void noraw(void)
++static void gpm_noraw(void)
+ {
+ struct termios it;
+
+@@ -136,7 +135,7 @@ void killed(int signo)
+ {
+ CLEAR;
+ fprintf(stderr,"hltest: killed by signal %i\r\n",signo);
+- noraw();
++ gpm_noraw();
+ exit(0);
+ }
+
+@@ -525,7 +524,7 @@ int main(int argc, char **argv)
+ gpm_roi_handler=xhandler;
+ gpm_roi_data=NULL;
+
+- raw();
++ gpm_raw();
+ newmsg(0,NULL); /* init data structures */
+ while((c=Gpm_Getchar())!=EOF) {
+ char s[32];
+@@ -538,6 +537,6 @@ int main(int argc, char **argv)
+ newmsg(roi ? ((WinInfo *)roi->clientdata)->number : 0,s);
+ }
+
+- noraw();
++ gpm_noraw();
+ exit(0);
+ }
+diff --git a/src/prog/mouse-test.c b/src/prog/mouse-test.c
+index d7d1027..0db3560 100644
+--- a/src/prog/mouse-test.c
++++ b/src/prog/mouse-test.c
+@@ -106,7 +106,7 @@ return 0;
+
/*-----------------------------------------------------------------------------
+ Place the description here.
+
-----------------------------------------------------------------------------*/
+-static void raw(void)
++static void gpm_raw(void)
+ {
+ struct termios it;
+
+@@ -125,7 +125,7 @@ static void raw(void)
+
/*-----------------------------------------------------------------------------
+ Place the description here.
+
-----------------------------------------------------------------------------*/
+-static void noraw(void)
++static void gpm_noraw(void)
+ {
+ struct termios it;
+
+@@ -144,7 +144,7 @@ static void noraw(void)
+ void killed(int signo)
+ {
+ fprintf(stderr,"mouse-test: killed by signal %i\r\n",signo);
+- noraw();
++ gpm_noraw();
+ exit(0);
+ }
+
+@@ -196,7 +196,7 @@ int mousereopen(int oldfd, const char *name, Gpm_Type
*type)
+
+ int noneofthem(void)
+ {
+- noraw();
++ gpm_noraw();
+ printf("\n\nSomething went wrong, I didn't manage to detect your"
+ "protocol\n\nFeel free to report your problems to the author\n");
+ exit(1);
+@@ -336,7 +336,7 @@ int main(int argc, char **argv)
+ I_serial=mice->init; /* the first one has I_serial */
+
+ signal(SIGINT,killed); /* control-C kills us */
+- raw();
++ gpm_raw();
+
+ /*====================================== First of all, detect the device */
+
+@@ -568,7 +568,7 @@ int main(int argc, char **argv)
+ /* why checking and not using return value ??? */
+ CHECKFAIL(typecount);
+ if (typecount==1) {
+- noraw();
++ gpm_noraw();
+ printf("\n\n\nWell, it seems like your mouse is already detected:\n"
+ "it is on the device \"%s\", and speaks the protocol \"%s\"\n",
+ mousename,list->this->name);
+@@ -587,7 +587,7 @@ int main(int argc, char **argv)
+ } while(i!='y' && i!='n');
+
+ if (i=='n') {
+- noraw();
++ gpm_noraw();
+ printf("\nThen, you should use the \"bare\" protocol on \"%s\"\n",
+ mousename);
+ exit(0);
+@@ -634,7 +634,7 @@ int main(int argc, char **argv)
+ for (pending=0,i=0;i<got-16;i++)
+ if(!memcmp(buf+i,buf+i+8,8)) pending++;
+ if (pending > 3) {
+- noraw();
++ gpm_noraw();
+ printf("\nYour mouse seems to be a 'mman' one on \"%s\" (%i
matches)\n",
+ mousename,pending);
+ exit(0);
+@@ -660,7 +660,7 @@ int main(int argc, char **argv)
+ continue;
+ }
+ if (pending>3) {
+- noraw();
++ gpm_noraw();
+ printf("\nYour mouse seems to be a '%s' one on \"%s\" (%i
matches)\n",
+ cur->this->name,mousename,pending);
+ exit(0);
+@@ -695,7 +695,7 @@ int main(int argc, char **argv)
+ for (pending=0,i=0;i<got-20;i++)
+ if(!memcmp(buf+i,buf+i+10,10)) pending++;
+ if (pending>3) {
+- noraw();
++ gpm_noraw();
+ printf("\nYour mouse becomes a 3-buttons ('-t msc') one when\n"
+ "gpm gets '-o %s' on it command line, and X gets\n"
+ "%s in XF86Config\nThe device is \"%s\"",
+@@ -726,7 +726,7 @@ int main(int argc, char **argv)
+ for (pending=0,i=0;i<got-20;i++)
+ if(!memcmp(buf+i,buf+i+10,10)) pending++;
+ if (pending>3) {
+- noraw();
++ gpm_noraw();
+ printf("\nWorked. You should keep the button pressed every time the\n"
+ "computer boots, and run gpm in '-R' mode in order to ignore\n"
+ "such hassle when starting X\n\nStill better, but a better mouse\n"
+@@ -734,7 +734,7 @@ int main(int argc, char **argv)
+
+ exit(0);
+ }
+- noraw();
++ gpm_noraw();
+ printf("\nI'm lost. Can't tell you how to use your middle button\n");
+ return 0;
+ }
diff --minimal -Nru
gpm-1.20.7/debian/patches/099_fix_gcc_15_empty_argument_list
gpm-1.20.7/debian/patches/099_fix_gcc_15_empty_argument_list
--- gpm-1.20.7/debian/patches/099_fix_gcc_15_empty_argument_list
1970-01-01 01:00:00.000000000 +0100
+++ gpm-1.20.7/debian/patches/099_fix_gcc_15_empty_argument_list
2025-02-20 14:01:07.000000000 +0100
@@ -0,0 +1,78 @@
+From a2bb610109a7a1804d76db62977fc1dd6ebb0705 Mon Sep 17 00:00:00 2001
+From: NHOrus <[email protected]>
+Date: Tue, 11 Feb 2025 19:01:48 +0400
+Subject: [PATCH] Fix function definition in yacc source file until valid C23.
+ Fill empty argument lists with values. Add 0 as third argument for
+ two-argument function, it will be ignored at call site.
+
+---
+ src/prog/gpm-root.y | 14 +++++++-------
+ 1 file changed, 7 insertions(+), 7 deletions(-)
+
+diff --git a/src/prog/gpm-root.y b/src/prog/gpm-root.y
+index 800e51b..f06872c 100644
+--- a/src/prog/gpm-root.y
++++ b/src/prog/gpm-root.y
+@@ -128,7 +128,7 @@ typedef struct DrawItem {
+ char *name;
+ char *arg; /* a cmd string */
+ void *clientdata; /* a (Draw *) for menus or whatever */
+- int (*fun)();
++ int (*fun)(int, struct DrawItem *, int);
+ struct DrawItem *next;
+ } DrawItem;
+
+@@ -159,7 +159,7 @@ int yyerror(char *s);
+ int yylex(void);
+
+ DrawItem *cfg_cat(DrawItem *, DrawItem *);
+-DrawItem *cfg_makeitem(int mode, char *msg, int(*fun)(), void *detail);
++DrawItem *cfg_makeitem(int mode, char *msg, int(*fun)(int, DrawItem *, int),
void *detail);
+
+
+ /*===================================================================*
+@@ -195,7 +195,7 @@ int f_pipe(int mode, DrawItem *self, int uid);
+ char *string;
+ Draw *draw;
+ DrawItem *item;
+- int (*fun)();
++ int (*fun)(int, DrawItem *, int);
+ }
+
+ %token <string> T_STRING
+@@ -284,7 +284,7 @@ struct tokenName tokenList[] = {
+ struct funcName {
+ char *name;
+ int token;
+- int (*fun)();
++ int (*fun)(int, DrawItem *, int);
+ };
+ struct funcName funcList[] = {
+ {"f.debug",T_FUNC,f_debug},
+@@ -390,7 +390,7 @@ Draw *cfg_alloc(void)
+
+ /*---------------------------------------------------------------------*/
+ /* malloc an empty DrawItem and fill it */
+-DrawItem *cfg_makeitem(int mode, char *msg, int(*fun)(), void *detail)
++DrawItem *cfg_makeitem(int mode, char *msg, int(*fun)(int, DrawItem *, int),
void *detail)
+ {
+ DrawItem *new=calloc(1,sizeof(DrawItem));
+
+@@ -405,7 +405,7 @@ DrawItem *cfg_makeitem(int mode, char *msg, int(*fun)(),
void *detail)
+
+ case 'F': /* a function without args */
+ new->fun=fun;
+- if (fun) fun(F_CREATE,new);
++ if (fun) fun(F_CREATE,new,0);
+ break;
+
+ case 'M':
+@@ -1047,7 +1047,7 @@ Posted *postmenu(int fd, FILE *f, Draw *draw, int x, int
y, int console)
+ }
+ /* sides and items */
+ for (item=draw->menu; y++, item; item=item->next) {
+- if (item->fun) (*(item->fun))(F_POST,item);
++ if (item->fun) (*(item->fun))(F_POST,item,0);
+ GOTO(x,y); PUTC(VERLINE,draw->bord,draw->back);
+ for (i=0;i<item->pad;i++) PUTC(' ',draw->fore,draw->back);
+ PUTS(item->name,draw->fore,draw->back); i+=strlen(item->name);
diff --minimal -Nru gpm-1.20.7/debian/patches/series
gpm-1.20.7/debian/patches/series
--- gpm-1.20.7/debian/patches/series 2024-03-13 12:44:36.000000000 +0100
+++ gpm-1.20.7/debian/patches/series 2025-02-20 14:01:07.000000000 +0100
@@ -20,3 +20,5 @@
095_fix-compilation-with-gcc-10.patch
096_fix-compilation-against-musl-libc.patch
097-implicit
+098_fix_gcc_15_shadowing
+099_fix_gcc_15_empty_argument_list