#1096759 gpm: ftbfs with GCC-15

Package:
src:gpm
Source:
src:gpm
Submitter:
Matthias Klose
Date:
2025-09-04 22:08:20 UTC
Severity:
normal
Tags:
#1096759#5
Date:
2025-02-17 17:17:27 UTC
From:
To:
[This bug is NOT targeted to the upcoming trixie release]

Please keep this issue open in the bug tracker for the package it
was filed for.  If a fix in another package is required, please
file a bug for the other package (or clone), and add a block in this
package. Please keep the issue open until the package can be built in
a follow-up test rebuild.

The package fails to build in a test rebuild on at least amd64 with
gcc-15/g++-15, but succeeds to build with gcc-14/g++-14. The
severity of this report will be raised before the forky release.

The full build log can be found at:
http://qa-logs.debian.net/2025/02/16/amd64exp/gpm_1.20.7-11_unstable_gccexp.log.gz
The last lines of the build log are at the end of this report.

To build with GCC 15, either set CC=gcc-15 CXX=g++-15 explicitly,
or install the gcc, g++, gfortran, ... packages from experimental.

  apt-get -t=experimental install g++

GCC 15 now defaults to the C23/C++23 standards, exposing many FTBFS.
Other Common build failures are new warnings resulting in build failures
with -Werror turned on, or new/dropped symbols in Debian symbols files.
For other C/C++ related build failures see the porting guide at
http://gcc.gnu.org/gcc-15/porting_to.html

[...]
gcc -Wdate-time -D_FORTIFY_SOURCE=2 -I/build/reproducible-path/gpm-1.20.7/src -DHAVE_CONFIG_H -include headers/config.h -Wall -DSYSCONFDIR="\"/etc\"" -DSBINDIR="\"/usr/sbin\"" -D_GNU_SOURCE -Wdate-time -D_FORTIFY_SOURCE=2 -g -O2 -Werror=implicit-function-declaration -ffile-prefix-map=/build/reproducible-path/gpm-1.20.7=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -g -O2 -Werror=implicit-function-declaration -ffile-prefix-map=/build/reproducible-path/gpm-1.20.7=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -c -o report.o report.c
gcc -Wdate-time -D_FORTIFY_SOURCE=2 -I/build/reproducible-path/gpm-1.20.7/src -DHAVE_CONFIG_H -include headers/config.h -Wall -DSYSCONFDIR="\"/etc\"" -DSBINDIR="\"/usr/sbin\"" -D_GNU_SOURCE -Wdate-time -D_FORTIFY_SOURCE=2 -g -O2 -Werror=implicit-function-declaration -ffile-prefix-map=/build/reproducible-path/gpm-1.20.7=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -g -O2 -Werror=implicit-function-declaration -ffile-prefix-map=/build/reproducible-path/gpm-1.20.7=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -c -o tools.o tools.c
daemon/check_uniqueness.c: In function ‘check_uniqueness’:
daemon/check_uniqueness.c:38:7: warning: ignoring return value of ‘fscanf’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   38 |       fscanf(fp, "%d", &old_pid);
      |       ^~~~~~~~~~~~~~~~~~~~~~~~~~
gcc -Wdate-time -D_FORTIFY_SOURCE=2 -I/build/reproducible-path/gpm-1.20.7/src -DHAVE_CONFIG_H -include headers/config.h -Wall -DSYSCONFDIR="\"/etc\"" -DSBINDIR="\"/usr/sbin\"" -D_GNU_SOURCE -Wdate-time -D_FORTIFY_SOURCE=2 -DPIC -fPIC -g -O2 -Werror=implicit-function-declaration -ffile-prefix-map=/build/reproducible-path/gpm-1.20.7=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -g -O2 -Werror=implicit-function-declaration -ffile-prefix-map=/build/reproducible-path/gpm-1.20.7=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -c -o lib/liblow.lo lib/liblow.c
daemon/startup.c: In function ‘startup’:
daemon/startup.c:38:14: warning: unused variable ‘opt’ [-Wunused-variable]
   38 |    int i, j, opt;
      |              ^~~
gcc -Wdate-time -D_FORTIFY_SOURCE=2 -I/build/reproducible-path/gpm-1.20.7/src -DHAVE_CONFIG_H -include headers/config.h -Wall -DSYSCONFDIR="\"/etc\"" -DSBINDIR="\"/usr/sbin\"" -D_GNU_SOURCE -Wdate-time -D_FORTIFY_SOURCE=2 -DPIC -fPIC -g -O2 -Werror=implicit-function-declaration -ffile-prefix-map=/build/reproducible-path/gpm-1.20.7=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -g -O2 -Werror=implicit-function-declaration -ffile-prefix-map=/build/reproducible-path/gpm-1.20.7=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -c -o lib/libhigh.lo lib/libhigh.c
gcc -Wdate-time -D_FORTIFY_SOURCE=2 -I/build/reproducible-path/gpm-1.20.7/src -DHAVE_CONFIG_H -include headers/config.h -Wall -DSYSCONFDIR="\"/etc\"" -DSBINDIR="\"/usr/sbin\"" -D_GNU_SOURCE -Wdate-time -D_FORTIFY_SOURCE=2 -DPIC -fPIC -g -O2 -Werror=implicit-function-declaration -ffile-prefix-map=/build/reproducible-path/gpm-1.20.7=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -g -O2 -Werror=implicit-function-declaration -ffile-prefix-map=/build/reproducible-path/gpm-1.20.7=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -c -o lib/libxtra.lo lib/libxtra.c
lib/libxtra.c: In function ‘Gpm_GetServerVersion’:
lib/libxtra.c:64:7: warning: ignoring return value of ‘fgets’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   64 |       fgets(line, 128, f);
      |       ^~~~~~~~~~~~~~~~~~~
lib/libxtra.c: In function ‘Gpm_GetSnapshot’:
lib/libxtra.c:126:4: warning: ignoring return value of ‘write’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
  126 |    write(gpm_fd, &conn, sizeof(Gpm_Connect));
      |    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
gcc -Wdate-time -D_FORTIFY_SOURCE=2 -I/build/reproducible-path/gpm-1.20.7/src -DHAVE_CONFIG_H -include headers/config.h -Wall -DSYSCONFDIR="\"/etc\"" -DSBINDIR="\"/usr/sbin\"" -D_GNU_SOURCE -Wdate-time -D_FORTIFY_SOURCE=2 -DPIC -fPIC -g -O2 -Werror=implicit-function-declaration -ffile-prefix-map=/build/reproducible-path/gpm-1.20.7=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -g -O2 -Werror=implicit-function-declaration -ffile-prefix-map=/build/reproducible-path/gpm-1.20.7=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -c -o lib/report-lib.lo lib/report-lib.c
gcc -Wdate-time -D_FORTIFY_SOURCE=2 -I/build/reproducible-path/gpm-1.20.7/src -DHAVE_CONFIG_H -include headers/config.h -Wall -DSYSCONFDIR="\"/etc\"" -DSBINDIR="\"/usr/sbin\"" -D_GNU_SOURCE -Wdate-time -D_FORTIFY_SOURCE=2 -DPIC -fPIC -g -O2 -Werror=implicit-function-declaration -ffile-prefix-map=/build/reproducible-path/gpm-1.20.7=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -g -O2 -Werror=implicit-function-declaration -ffile-prefix-map=/build/reproducible-path/gpm-1.20.7=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -c -o tools.lo tools.c
gcc -Wdate-time -D_FORTIFY_SOURCE=2 -I/build/reproducible-path/gpm-1.20.7/src -DHAVE_CONFIG_H -include headers/config.h -Wall -DSYSCONFDIR="\"/etc\"" -DSBINDIR="\"/usr/sbin\"" -D_GNU_SOURCE -Wdate-time -D_FORTIFY_SOURCE=2 -DPIC -fPIC -g -O2 -Werror=implicit-function-declaration -ffile-prefix-map=/build/reproducible-path/gpm-1.20.7=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -g -O2 -Werror=implicit-function-declaration -ffile-prefix-map=/build/reproducible-path/gpm-1.20.7=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -c -o lib/libcurses.lo lib/libcurses.c
lib/report-lib.c: In function ‘gpm_report’:
lib/report-lib.c:50:23: warning: ‘%s’ directive argument is null [-Wformat-overflow=]
   50 |    syslog(log_level, "%s", string);
      |                       ^~
In file included from /usr/include/x86_64-linux-gnu/sys/syslog.h:207,
                 from /usr/include/syslog.h:1,
                 from /build/reproducible-path/gpm-1.20.7/src/headers/message.h:235,
                 from lib/report-lib.c:25:
In function ‘syslog’,
    inlined from ‘gpm_report’ at lib/report-lib.c:50:4:
/usr/include/x86_64-linux-gnu/bits/syslog.h:37:3: warning: ‘log_level’ may be used uninitialized [-Wmaybe-uninitialized]
   37 |   __syslog_chk (__pri, __USE_FORTIFY_LEVEL - 1, __fmt, __va_arg_pack ());
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lib/report-lib.c: In function ‘gpm_report’:
lib/report-lib.c:30:8: note: ‘log_level’ was declared here
   30 |    int log_level;
      |        ^~~~~~~~~
gcc -Wdate-time -D_FORTIFY_SOURCE=2 -I/build/reproducible-path/gpm-1.20.7/src -DHAVE_CONFIG_H -include headers/config.h -Wall -DSYSCONFDIR="\"/etc\"" -DSBINDIR="\"/usr/sbin\"" -D_GNU_SOURCE -Wdate-time -D_FORTIFY_SOURCE=2 -g -O2 -Werror=implicit-function-declaration -ffile-prefix-map=/build/reproducible-path/gpm-1.20.7=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -g -O2 -Werror=implicit-function-declaration -ffile-prefix-map=/build/reproducible-path/gpm-1.20.7=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -c -o lib/liblow.o lib/liblow.c
gcc -Wdate-time -D_FORTIFY_SOURCE=2 -I/build/reproducible-path/gpm-1.20.7/src -DHAVE_CONFIG_H -include headers/config.h -Wall -DSYSCONFDIR="\"/etc\"" -DSBINDIR="\"/usr/sbin\"" -D_GNU_SOURCE -Wdate-time -D_FORTIFY_SOURCE=2 -g -O2 -Werror=implicit-function-declaration -ffile-prefix-map=/build/reproducible-path/gpm-1.20.7=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -g -O2 -Werror=implicit-function-declaration -ffile-prefix-map=/build/reproducible-path/gpm-1.20.7=. -fstack-protector-strong -fstack-clash-protection -Wformat -Werror=format-security -fcf-protection -c -o lib/libhigh.o lib/libhigh.c
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();
      |            ^~~~~~~~~~
lib/libcurses.c: In function ‘Gpm_Wgetch’:
lib/libcurses.c:154:25: warning: pointer targets in passing argument 1 of ‘gpm_convert_event’ differ in signedness [-Wpointer-sign]
  154 |       gpm_convert_event(mdata,&ev);
      |                         ^~~~~
      |                         |
      |                         unsigned char *
lib/libcurses.c:104:40: note: expected ‘char *’ but argument is of type ‘unsigned char *’
  104 |     extern int gpm_convert_event(char *data, Gpm_Event *event);
      |                                  ~~~~~~^~~~
make[3]: *** [Makefile:71: lib/libcurses.lo] Error 1
make[3]: *** Waiting for unfinished jobs....
make[3]: Leaving directory '/build/reproducible-path/gpm-1.20.7/src'
make[2]: *** [Makefile:77: do-all] Error 1
make[2]: Leaving directory '/build/reproducible-path/gpm-1.20.7'
dh_auto_build: error: make -j8 returned exit code 2
make[1]: *** [debian/rules:20: override_dh_auto_build] Error 25
make[1]: Leaving directory '/build/reproducible-path/gpm-1.20.7'
make: *** [debian/rules:8: binary] Error 2
dpkg-buildpackage: error: debian/rules binary subprocess returned exit status 2

#1096759#10
Date:
2025-02-20 20:50:15 UTC
From:
To:
Hi Samuel,

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