From ca63c4409b3c811e8c4ee19c2860c53af35c4ce1 Mon Sep 17 00:00:00 2001 From: Dario Binacchi Date: Fri, 27 Dec 2024 18:42:46 +0100 Subject: [PATCH] package/libxml2: fix compilation with GCC 14.x and uClibc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The patch fixes the following errors and warnings raised by the compilation of libxml2 with the combination of GCC 14.x and uClibc. encoding.c: In function ‘xmlEncInputChunk’: encoding.c:2209:32: warning: comparison between pointer and integer 2209 | else if (handler->iconv_in != NULL) { | ^~ encoding.c: In function ‘xmlEncOutputChunk’: encoding.c:2269:33: warning: comparison between pointer and integer 2269 | else if (handler->iconv_out != NULL) { | ^~ encoding.c: In function ‘xmlCharEncCloseFunc’: encoding.c:2681:29: warning: comparison between pointer and integer 2681 | if ((handler->iconv_out != NULL) || (handler->iconv_in != NULL)) { | ^~ encoding.c:2681:60: warning: comparison between pointer and integer 2681 | if ((handler->iconv_out != NULL) || (handler->iconv_in != NULL)) { | ^~ encoding.c:2683:32: warning: comparison between pointer and integer 2683 | if (handler->iconv_out != NULL) { | ^~ encoding.c:2686:32: error: assignment to ‘iconv_t’ {aka ‘long int’} from ‘void *’ makes integer from pointer without a cast [-Wint-conversion] 2686 | handler->iconv_out = NULL; | ^ encoding.c:2688:31: warning: comparison between pointer and integer 2688 | if (handler->iconv_in != NULL) { | ^~ encoding.c:2691:31: error: assignment to ‘iconv_t’ {aka ‘long int’} from ‘void *’ makes integer from pointer without a cast [-Wint-conversion] 2691 | handler->iconv_in = NULL; | ^ make[4]: *** [Makefile:1147: libxml2_la-encoding.lo] Error 1 This code has been in libxml2 pretty much forever: it was partially introduced in version 2.1.0: 496a1cf59284 ("496a1cf59284 revamped the encoding support, added iconv support, so now libxml if") and partially in version 2.2.3: 87b953957305 ("Large sync between my W3C base and Gnome's one:"). And the first time Buildroot packaged libxml2, it was version 2.6.29. However, both glibc and musl define iconv_t as "void *", which meant the libxml2 code was not problematic. uClibc defines iconv_t as "long", which generated only a warning... until GCC got updated to GCC 14.x, which turned this warning into an error, causing the build failure. Fixes: http://autobuild.buildroot.net/results/fd4f8d2e8d8ee68d9e18f761ceff350188e55a87/ Signed-off-by: Dario Binacchi Signed-off-by: Thomas Petazzoni --- .../0001-Fix-compilation-with-uclibc.patch | 114 ++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 package/libxml2/0001-Fix-compilation-with-uclibc.patch diff --git a/package/libxml2/0001-Fix-compilation-with-uclibc.patch b/package/libxml2/0001-Fix-compilation-with-uclibc.patch new file mode 100644 index 0000000000..aedad27e05 --- /dev/null +++ b/package/libxml2/0001-Fix-compilation-with-uclibc.patch @@ -0,0 +1,114 @@ +From fc72e0833a4e5724aef604e2fd9adb1014cb4844 Mon Sep 17 00:00:00 2001 +From: Dario Binacchi +Date: Mon, 16 Dec 2024 17:23:23 +0100 +Subject: [PATCH] Fix compilation with uclibc +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The patch fixes the following errors and warnings raised by the +compilation of the library with uClibc: + +encoding.c: In function ‘xmlEncInputChunk’: +encoding.c:2209:32: warning: comparison between pointer and integer + 2209 | else if (handler->iconv_in != NULL) { + | ^~ +encoding.c: In function ‘xmlEncOutputChunk’: +encoding.c:2269:33: warning: comparison between pointer and integer + 2269 | else if (handler->iconv_out != NULL) { + | ^~ +encoding.c: In function ‘xmlCharEncCloseFunc’: +encoding.c:2681:29: warning: comparison between pointer and integer + 2681 | if ((handler->iconv_out != NULL) || (handler->iconv_in != NULL)) { + | ^~ +encoding.c:2681:60: warning: comparison between pointer and integer + 2681 | if ((handler->iconv_out != NULL) || (handler->iconv_in != NULL)) { + | ^~ +encoding.c:2683:32: warning: comparison between pointer and integer + 2683 | if (handler->iconv_out != NULL) { + | ^~ +encoding.c:2686:32: error: assignment to ‘iconv_t’ {aka ‘long int’} from ‘void *’ makes integer from pointer without a cast [-Wint-conversion] + 2686 | handler->iconv_out = NULL; + | ^ +encoding.c:2688:31: warning: comparison between pointer and integer + 2688 | if (handler->iconv_in != NULL) { + | ^~ +encoding.c:2691:31: error: assignment to ‘iconv_t’ {aka ‘long int’} from ‘void *’ makes integer from pointer without a cast [-Wint-conversion] + 2691 | handler->iconv_in = NULL; + | ^ +make[4]: *** [Makefile:1147: libxml2_la-encoding.lo] Error 1 + +Signed-off-by: Dario Binacchi +Upstream: https://gitlab.gnome.org/GNOME/libxml2/-/commit/fc72e0833a4e5724aef604e2fd9adb1014cb4844 +--- + encoding.c | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +diff --git a/encoding.c b/encoding.c +index 14ffafddbc02..41ecde1885e4 100644 +--- a/encoding.c ++++ b/encoding.c +@@ -1264,7 +1264,7 @@ DECLARE_ISO_FUNCS(16) + #endif /* LIBXML_ISO8859X_ENABLED */ + + #ifdef LIBXML_ICONV_ENABLED +- #define EMPTY_ICONV , (iconv_t) 0, (iconv_t) 0 ++ #define EMPTY_ICONV , (iconv_t) -1, (iconv_t) -1 + #else + #define EMPTY_ICONV + #endif +@@ -1389,8 +1389,8 @@ xmlNewCharEncodingHandler(const char *name, + handler->name = up; + + #ifdef LIBXML_ICONV_ENABLED +- handler->iconv_in = NULL; +- handler->iconv_out = NULL; ++ handler->iconv_in = (iconv_t) -1; ++ handler->iconv_out = (iconv_t) -1; + #endif + #ifdef LIBXML_ICU_ENABLED + handler->uconv_in = NULL; +@@ -2200,7 +2200,7 @@ xmlEncInputChunk(xmlCharEncodingHandler *handler, unsigned char *out, + } + } + #ifdef LIBXML_ICONV_ENABLED +- else if (handler->iconv_in != NULL) { ++ else if (handler->iconv_in != (iconv_t) -1) { + ret = xmlIconvWrapper(handler->iconv_in, out, outlen, in, inlen); + } + #endif /* LIBXML_ICONV_ENABLED */ +@@ -2260,7 +2260,7 @@ xmlEncOutputChunk(xmlCharEncodingHandler *handler, unsigned char *out, + } + } + #ifdef LIBXML_ICONV_ENABLED +- else if (handler->iconv_out != NULL) { ++ else if (handler->iconv_out != (iconv_t) -1) { + ret = xmlIconvWrapper(handler->iconv_out, out, outlen, in, inlen); + } + #endif /* LIBXML_ICONV_ENABLED */ +@@ -2672,17 +2672,17 @@ xmlCharEncCloseFunc(xmlCharEncodingHandler *handler) { + * Iconv handlers can be used only once, free the whole block. + * and the associated icon resources. + */ +- if ((handler->iconv_out != NULL) || (handler->iconv_in != NULL)) { ++ if ((handler->iconv_out != (iconv_t) -1) || (handler->iconv_in != (iconv_t) -1)) { + tofree = 1; +- if (handler->iconv_out != NULL) { ++ if (handler->iconv_out != (iconv_t) -1) { + if (iconv_close(handler->iconv_out)) + ret = -1; +- handler->iconv_out = NULL; ++ handler->iconv_out = (iconv_t) -1; + } +- if (handler->iconv_in != NULL) { ++ if (handler->iconv_in != (iconv_t) -1) { + if (iconv_close(handler->iconv_in)) + ret = -1; +- handler->iconv_in = NULL; ++ handler->iconv_in = (iconv_t) -1; + } + } + #endif /* LIBXML_ICONV_ENABLED */ +-- +2.43.0 +