#1149680 goxel: FTBFS with glibc 2.43+: strrchr() const-preserving with -Werror

Package:
src:goxel
Source:
src:goxel
Submitter:
Viktor Pashaiev
Date:
2026-10-02 09:05:04 UTC
Severity:
normal
Tags:
#1149680#5
Date:
2026-10-02 09:03:42 UTC
From:
To:
Dear Maintainer,

goxel 0.15.1-1 fails to build from source with glibc >= 2.43 because strrchr()
is a const-preserving macro under C23 and _GNU_SOURCE.

Passing a const char * argument returns const char *, triggering
-Wdiscarded-qualifiers when assigned to a non-const char *. Because SConstruct
defaults to werror=True (-Werror), this leads to a fatal build error.

Three locations in the codebase are affected:
1. src/utils.c:121 in str_replace_ext(): pos assigned from strrchr(str, '.').
2. src/utils/path.c:32, 54 in path_dirname() and path_basename(): sep assigned
   from strrchr(path, '/').
3. ext_src/quickjs/quickjs.c:27267 in js_default_module_normalize_name(): p
   assigned from strrchr(base_name, '/'). Since p is modified later
   (*p = '\0'), introducing a dedicated const char *p_base avoids modifying
   downstream mutable operations on filename.

Additionally, passing werror=0 to scons in debian/rules prevents toolchain
diagnostic updates from breaking distribution package builds.

This issue is tracked in Ubuntu at:
https://bugs.launchpad.net/ubuntu/+source/goxel/+bug/2169229

The patch below resolves the FTBFS:
--- a/src/utils.c
+++ b/src/utils.c
@@ -116,7 +116,7 @@
 bool str_replace_ext(const char *str, const char *new_ext,
                      char *out, size_t out_size)
 {
-    char *pos;
+    const char *pos;
     assert(str && new_ext && out);
     pos = strrchr(str, '.');
     if (!pos) return false;
--- a/src/utils/path.c
+++ b/src/utils/path.c
@@ -24,7 +24,7 @@

 char *path_dirname(const char *path, char *out, size_t size)
 {
-    char *sep;
+    const char *sep;
     int len;

     assert(path);
@@ -46,7 +46,7 @@

 char *path_basename(const char *path, char *out, size_t size)
 {
-    char *sep;
+    const char *sep;
     int len;

     assert(path);
--- a/ext_src/quickjs/quickjs.c
+++ b/ext_src/quickjs/quickjs.c
@@ -27256,6 +27256,7 @@
                                               const char *name)
 {
     char *filename, *p;
+    const char *p_base;
     const char *r;
     int len;

@@ -27264,9 +27265,9 @@
         return js_strdup(ctx, name);
     }

-    p = strrchr(base_name, '/');
-    if (p)
-        len = p - base_name;
+    p_base = strrchr(base_name, '/');
+    if (p_base)
+        len = p_base - base_name;
     else
         len = 0;
--- a/debian/rules
+++ b/debian/rules
@@ -19,7 +19,7 @@
 	rm -rf .sconsign.dblite

 override_dh_auto_build:
-	scons cycles=0 debug=0 clang=1 --jobs=$(NUMJOBS) --no-cache
+	scons cycles=0 debug=0 clang=1 werror=0 --jobs=$(NUMJOBS) --no-cache
 	cp -a ./osx/goxel/goxel/Assets.xcassets/AppIcon.appiconset/64.png ./goxel.png

 override_dh_installman: