diff mbox series

package/git: fix wchar-less uclibc build

Message ID 20241020092527.734923-3-bagasdotme@gmail.com
State Changes Requested
Headers show
Series package/git: fix wchar-less uclibc build | expand

Commit Message

Bagas Sanjaya Oct. 20, 2024, 9:25 a.m. UTC
The package fails to build on wchar-less uClibc-ng configuration
(i.e. without BR2_TOOLCHAIN_BUILDROOT_WCHAR selected):

```
    CC t/unit-tests/unit-test.o
t/unit-tests/clar/clar.c: In function 'clar__assert_equal':
t/unit-tests/clar/clar.c:767:23: error: unknown type name 'wchar_t'
  767 |                 const wchar_t *wcs1 = va_arg(args, const wchar_t *);
      |                       ^~~~~~~
In file included from t/unit-tests/clar/clar.c:13:
t/unit-tests/clar/clar.c:767:58: error: unknown type name 'wchar_t'
  767 |                 const wchar_t *wcs1 = va_arg(args, const wchar_t *);
      |                                                          ^~~~~~~
t/unit-tests/clar/clar.c:768:23: error: unknown type name 'wchar_t'
  768 |                 const wchar_t *wcs2 = va_arg(args, const wchar_t *);
      |                       ^~~~~~~
t/unit-tests/clar/clar.c:768:58: error: unknown type name 'wchar_t'
  768 |                 const wchar_t *wcs2 = va_arg(args, const wchar_t *);
      |                                                          ^~~~~~~
t/unit-tests/clar/clar.c:769:65: warning: implicit declaration of function 'wcscmp' [-Wimplicit-function-declaration]
  769 |                 is_equal = (!wcs1 || !wcs2) ? (wcs1 == wcs2) : !wcscmp(wcs1, wcs2);
      |                                                                 ^~~~~~
t/unit-tests/clar/clar.c:784:23: error: unknown type name 'wchar_t'
  784 |                 const wchar_t *wcs1 = va_arg(args, const wchar_t *);
      |                       ^~~~~~~
t/unit-tests/clar/clar.c:784:58: error: unknown type name 'wchar_t'
  784 |                 const wchar_t *wcs1 = va_arg(args, const wchar_t *);
      |                                                          ^~~~~~~
t/unit-tests/clar/clar.c:785:23: error: unknown type name 'wchar_t'
  785 |                 const wchar_t *wcs2 = va_arg(args, const wchar_t *);
      |                       ^~~~~~~
t/unit-tests/clar/clar.c:785:58: error: unknown type name 'wchar_t'
  785 |                 const wchar_t *wcs2 = va_arg(args, const wchar_t *);
      |                                                          ^~~~~~~
t/unit-tests/clar/clar.c:787:65: warning: implicit declaration of function 'wcsncmp' [-Wimplicit-function-declaration]
  787 |                 is_equal = (!wcs1 || !wcs2) ? (wcs1 == wcs2) : !wcsncmp(wcs1, wcs2, len);
      |                                                                 ^~~~~~~
make[1]: *** [Makefile:2795: t/unit-tests/clar/clar.o] Error 1
```

This is because since version 2.47.0, Git imports clar unit testing
framework, which uses wchar_t. On wchar-less uClibc-ng configuration,
however, the installed <wchar.h> header is a stub (that is, wchar_t
is undefined).

Fix the build failure by only using wchar_t when __UCLIBC_HAS_WCHAR__
is actually defined.

Fixes: https://autobuild.buildroot.org/results/45a1bd9a34c4b0945a07c22338b201908cf45d8c/
Signed-off-by: Bagas Sanjaya <bagasdotme@gmail.com>
---

From upstream discussion [1], it seems like wchar-less uclibc config is broken
and needs to be fixed in uclibc-ng proper. Cc'ing Waldemar.

[1]: https://lore.kernel.org/git/ZxHrIBCdnwdRdXAv@pks.im/

 ...fix-clar-build-for-wchar-less-uclibc.patch | 97 +++++++++++++++++++
 1 file changed, 97 insertions(+)
 create mode 100644 package/git/0001-t-unit-tests-fix-clar-build-for-wchar-less-uclibc.patch


base-commit: 0ad7035fce67cbe91db9dea7d81e6a4bc0691ad1

Comments

Thomas Petazzoni Oct. 28, 2024, 10:13 p.m. UTC | #1
Hello,

On Sun, 20 Oct 2024 16:25:29 +0700
Bagas Sanjaya <bagasdotme@gmail.com> wrote:

> diff --git a/package/git/0001-t-unit-tests-fix-clar-build-for-wchar-less-uclibc.patch b/package/git/0001-t-unit-tests-fix-clar-build-for-wchar-less-uclibc.patch
> new file mode 100644
> index 0000000000..50e844f5d4
> --- /dev/null
> +++ b/package/git/0001-t-unit-tests-fix-clar-build-for-wchar-less-uclibc.patch
> @@ -0,0 +1,97 @@
> +From 3d24a1610bf5a84486c84526ded567a53e10b96f Mon Sep 17 00:00:00 2001
> +From: Edgar Bonet <bonet@grenoble.cnrs.fr>
> +Date: Fri, 18 Oct 2024 14:59:48 +0200
> +Subject: [PATCH] t/unit-tests: fix clar build for wchar-less uclibc
> +
> +Git fails to build on uclibc systems without wchar support:
> +
> +```
> +    CC t/unit-tests/unit-test.o
> +t/unit-tests/clar/clar.c: In function 'clar__assert_equal':
> +t/unit-tests/clar/clar.c:767:23: error: unknown type name 'wchar_t'
> +  767 |                 const wchar_t *wcs1 = va_arg(args, const wchar_t *);
> +      |                       ^~~~~~~
> +In file included from t/unit-tests/clar/clar.c:13:
> +t/unit-tests/clar/clar.c:767:58: error: unknown type name 'wchar_t'
> +  767 |                 const wchar_t *wcs1 = va_arg(args, const wchar_t *);
> +      |                                                          ^~~~~~~
> +t/unit-tests/clar/clar.c:768:23: error: unknown type name 'wchar_t'
> +  768 |                 const wchar_t *wcs2 = va_arg(args, const wchar_t *);
> +      |                       ^~~~~~~
> +t/unit-tests/clar/clar.c:768:58: error: unknown type name 'wchar_t'
> +  768 |                 const wchar_t *wcs2 = va_arg(args, const wchar_t *);
> +      |                                                          ^~~~~~~
> +t/unit-tests/clar/clar.c:769:65: warning: implicit declaration of function 'wcscmp' [-Wimplicit-function-declaration]
> +  769 |                 is_equal = (!wcs1 || !wcs2) ? (wcs1 == wcs2) : !wcscmp(wcs1, wcs2);
> +      |                                                                 ^~~~~~
> +t/unit-tests/clar/clar.c:784:23: error: unknown type name 'wchar_t'
> +  784 |                 const wchar_t *wcs1 = va_arg(args, const wchar_t *);
> +      |                       ^~~~~~~
> +t/unit-tests/clar/clar.c:784:58: error: unknown type name 'wchar_t'
> +  784 |                 const wchar_t *wcs1 = va_arg(args, const wchar_t *);
> +      |                                                          ^~~~~~~
> +t/unit-tests/clar/clar.c:785:23: error: unknown type name 'wchar_t'
> +  785 |                 const wchar_t *wcs2 = va_arg(args, const wchar_t *);
> +      |                       ^~~~~~~
> +t/unit-tests/clar/clar.c:785:58: error: unknown type name 'wchar_t'
> +  785 |                 const wchar_t *wcs2 = va_arg(args, const wchar_t *);
> +      |                                                          ^~~~~~~
> +t/unit-tests/clar/clar.c:787:65: warning: implicit declaration of function 'wcsncmp' [-Wimplicit-function-declaration]
> +  787 |                 is_equal = (!wcs1 || !wcs2) ? (wcs1 == wcs2) : !wcsncmp(wcs1, wcs2, len);
> +      |                                                                 ^~~~~~~
> +make[1]: *** [Makefile:2795: t/unit-tests/clar/clar.o] Error 1
> +```
> +
> +This is because on these systems, although there is #error macro
> +in uclibc source when __UCLIBC_HAS_WCHAR__ is not defined, somehow
> +the #error doesn't get triggered when wchar_t is used in clar.

When wchar support is disabled in uClibc, the wchar.h file that gets
installed is ./include/wchar-stub.h, and it doesn't have any #error.
See in the uClibc Makefile:

ifeq ($(UCLIBC_HAS_WCHAR),)
        $(Q)cd $(PREFIX)$(DEVEL_PREFIX)include && mv -f wchar-stub.h wchar.h
else
        $(Q)cd $(PREFIX)$(DEVEL_PREFIX)include && $(RM) -f wchar-stub.h
endif

> +
> +Fix the build failure by only using wchar_t when __UCLIBC_HAS_WCHAR__
> +is actually defined.

The solution isn't really nice, because it adds some uClibc specific
logic. Isn't there some configure.ac logic that runs to properly detect
the availability of wchar?

Otherwise, we could also make git depend on wchar, and be done with it.

Thomas
Edgar Bonet Oct. 28, 2024, 10:39 p.m. UTC | #2
Hello!

Bagas Sanjaya wrote:
> +Fix the build failure by only using wchar_t when __UCLIBC_HAS_WCHAR__
> +is actually defined.

Thomas Petazzoni replied:
> The solution isn't really nice, because it adds some uClibc specific
> logic.

Indeed. Note, however, that the patch is making its way upstream:

    https://lore.kernel.org/git/cover.1729506329.git.ps@pks.im/T/#u

(long thread, search for “uClibc” to see the relevant bits).

Regards,

Edgar Bonet.
Bagas Sanjaya Oct. 30, 2024, 9:55 a.m. UTC | #3
On Mon, Oct 28, 2024 at 11:39:49PM +0100, Edgar Bonet wrote:
> Hello!
> 
> Bagas Sanjaya wrote:
> > +Fix the build failure by only using wchar_t when __UCLIBC_HAS_WCHAR__
> > +is actually defined.
> 
> Thomas Petazzoni replied:
> > The solution isn't really nice, because it adds some uClibc specific
> > logic.
> 
> Indeed. Note, however, that the patch is making its way upstream:
> 
>     https://lore.kernel.org/git/cover.1729506329.git.ps@pks.im/T/#u
> 
> (long thread, search for “uClibc” to see the relevant bits).

OK, I will pull from upstream instead.

Thanks.
diff mbox series

Patch

diff --git a/package/git/0001-t-unit-tests-fix-clar-build-for-wchar-less-uclibc.patch b/package/git/0001-t-unit-tests-fix-clar-build-for-wchar-less-uclibc.patch
new file mode 100644
index 0000000000..50e844f5d4
--- /dev/null
+++ b/package/git/0001-t-unit-tests-fix-clar-build-for-wchar-less-uclibc.patch
@@ -0,0 +1,97 @@ 
+From 3d24a1610bf5a84486c84526ded567a53e10b96f Mon Sep 17 00:00:00 2001
+From: Edgar Bonet <bonet@grenoble.cnrs.fr>
+Date: Fri, 18 Oct 2024 14:59:48 +0200
+Subject: [PATCH] t/unit-tests: fix clar build for wchar-less uclibc
+
+Git fails to build on uclibc systems without wchar support:
+
+```
+    CC t/unit-tests/unit-test.o
+t/unit-tests/clar/clar.c: In function 'clar__assert_equal':
+t/unit-tests/clar/clar.c:767:23: error: unknown type name 'wchar_t'
+  767 |                 const wchar_t *wcs1 = va_arg(args, const wchar_t *);
+      |                       ^~~~~~~
+In file included from t/unit-tests/clar/clar.c:13:
+t/unit-tests/clar/clar.c:767:58: error: unknown type name 'wchar_t'
+  767 |                 const wchar_t *wcs1 = va_arg(args, const wchar_t *);
+      |                                                          ^~~~~~~
+t/unit-tests/clar/clar.c:768:23: error: unknown type name 'wchar_t'
+  768 |                 const wchar_t *wcs2 = va_arg(args, const wchar_t *);
+      |                       ^~~~~~~
+t/unit-tests/clar/clar.c:768:58: error: unknown type name 'wchar_t'
+  768 |                 const wchar_t *wcs2 = va_arg(args, const wchar_t *);
+      |                                                          ^~~~~~~
+t/unit-tests/clar/clar.c:769:65: warning: implicit declaration of function 'wcscmp' [-Wimplicit-function-declaration]
+  769 |                 is_equal = (!wcs1 || !wcs2) ? (wcs1 == wcs2) : !wcscmp(wcs1, wcs2);
+      |                                                                 ^~~~~~
+t/unit-tests/clar/clar.c:784:23: error: unknown type name 'wchar_t'
+  784 |                 const wchar_t *wcs1 = va_arg(args, const wchar_t *);
+      |                       ^~~~~~~
+t/unit-tests/clar/clar.c:784:58: error: unknown type name 'wchar_t'
+  784 |                 const wchar_t *wcs1 = va_arg(args, const wchar_t *);
+      |                                                          ^~~~~~~
+t/unit-tests/clar/clar.c:785:23: error: unknown type name 'wchar_t'
+  785 |                 const wchar_t *wcs2 = va_arg(args, const wchar_t *);
+      |                       ^~~~~~~
+t/unit-tests/clar/clar.c:785:58: error: unknown type name 'wchar_t'
+  785 |                 const wchar_t *wcs2 = va_arg(args, const wchar_t *);
+      |                                                          ^~~~~~~
+t/unit-tests/clar/clar.c:787:65: warning: implicit declaration of function 'wcsncmp' [-Wimplicit-function-declaration]
+  787 |                 is_equal = (!wcs1 || !wcs2) ? (wcs1 == wcs2) : !wcsncmp(wcs1, wcs2, len);
+      |                                                                 ^~~~~~~
+make[1]: *** [Makefile:2795: t/unit-tests/clar/clar.o] Error 1
+```
+
+This is because on these systems, although there is #error macro
+in uclibc source when __UCLIBC_HAS_WCHAR__ is not defined, somehow
+the #error doesn't get triggered when wchar_t is used in clar.
+
+Fix the build failure by only using wchar_t when __UCLIBC_HAS_WCHAR__
+is actually defined.
+
+Upstream: https://lore.kernel.org/git/ZxJnfYtuxnAEBc1E@archie.me/
+Signed-off-by: Edgar Bonet <bonet@grenoble.cnrs.fr>
+Signed-off-by: Bagas Sanjaya <bagasdotme@gmail.com>
+---
+ t/unit-tests/clar/clar.c | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+diff --git a/t/unit-tests/clar/clar.c b/t/unit-tests/clar/clar.c
+index cef0f023c2..6de0b415b1 100644
+--- a/t/unit-tests/clar/clar.c
++++ b/t/unit-tests/clar/clar.c
+@@ -18,6 +18,13 @@
+ #include <sys/types.h>
+ #include <sys/stat.h>
+ 
++#if defined(__UCLIBC__) && ! defined(__UCLIBC_HAS_WCHAR__)
++   /* uClibc can be built without wchar support, in which case the
++      installed <wchar.h> is a stub that does not define wchar_t. */
++#else
++#  define HAVE_WCHAR
++#endif
++
+ #ifdef _WIN32
+ #	define WIN32_LEAN_AND_MEAN
+ #	include <windows.h>
+@@ -763,6 +770,7 @@ void clar__assert_equal(
+ 			}
+ 		}
+ 	}
++#ifdef HAVE_WCHAR
+ 	else if (!strcmp("%ls", fmt)) {
+ 		const wchar_t *wcs1 = va_arg(args, const wchar_t *);
+ 		const wchar_t *wcs2 = va_arg(args, const wchar_t *);
+@@ -798,6 +806,7 @@ void clar__assert_equal(
+ 			}
+ 		}
+ 	}
++#endif // HAVE_WCHAR
+ 	else if (!strcmp("%"PRIuZ, fmt) || !strcmp("%"PRIxZ, fmt)) {
+ 		size_t sz1 = va_arg(args, size_t), sz2 = va_arg(args, size_t);
+ 		is_equal = (sz1 == sz2);
+
+base-commit: 777489f9e09c8d0dd6b12f9d90de6376330577a2
+-- 
+An old man doll... just what I always wanted! - Clara
+