| Message ID | 20260407133521.840916-2-zboszor@gmail.com |
|---|---|
| State | New |
| Headers | show |
| Series | [whinlatter,v2,1/2] binutils: Fix build with GLIBC 2.43 on the host | expand |
I think this isn't caused by glibc-2.43, but gcc-16 on host, you should backport https://git.openembedded.org/openembedded-core/commit/?id=9eabea38f0c17d41d97284d63a25e45da3c9bbcc from master (so it's clear it's the same commit). ubuntu-26.04 has glibc-2.43 but uses gcc-15 by default, that's why I haven't seen this one in whinlatter nor scarthgap builds with it yet. Not sure why I cannot reproduce the binutils one in whinlatter, I've just rebuilt both binutils-native as well as target binutils without an issue, probably because of: meta/recipes-devtools/binutils/binutils_2.45.bb:EXTRA_OECONF:append:toolchain-clang = " --disable-gprofng" but that is also in scarthgap (and bitbake-getvar confirmed it in both builds). Was it with target binutils or binutils-native? On Tue, Apr 7, 2026 at 3:35 PM Zoltán Böszörményi <zboszor@gmail.com> wrote: > > Added a patch to fix gcc-cross-<arch> built against GLIBC 2.43 > on Fedora 44. > > Signed-off-by: Zoltán Böszörményi <zboszor@gmail.com> > --- > meta/recipes-devtools/gcc/gcc-15.2.inc | 1 + > ...dy-Make-it-buildable-by-C-11-to-C-26.patch | 262 ++++++++++++++++++ > 2 files changed, 263 insertions(+) > create mode 100644 meta/recipes-devtools/gcc/gcc/0001-libcody-Make-it-buildable-by-C-11-to-C-26.patch > > diff --git a/meta/recipes-devtools/gcc/gcc-15.2.inc b/meta/recipes-devtools/gcc/gcc-15.2.inc > index d178b25487..aef22f8347 100644 > --- a/meta/recipes-devtools/gcc/gcc-15.2.inc > +++ b/meta/recipes-devtools/gcc/gcc-15.2.inc > @@ -73,6 +73,7 @@ SRC_URI = "${BASEURI} \ > file://0024-Avoid-hardcoded-build-paths-into-ppc-libgcc.patch \ > file://0025-gcc-testsuite-tweaks-for-mips-OE.patch \ > file://0026-fix-pr90579-testcases.patch \ > + file://0001-libcody-Make-it-buildable-by-C-11-to-C-26.patch \ > " > > UNPACKDIR = "${TMPDIR}/work-shared/gcc-${PV}-${PR}/sources" > diff --git a/meta/recipes-devtools/gcc/gcc/0001-libcody-Make-it-buildable-by-C-11-to-C-26.patch b/meta/recipes-devtools/gcc/gcc/0001-libcody-Make-it-buildable-by-C-11-to-C-26.patch > new file mode 100644 > index 0000000000..676f1500e7 > --- /dev/null > +++ b/meta/recipes-devtools/gcc/gcc/0001-libcody-Make-it-buildable-by-C-11-to-C-26.patch > @@ -0,0 +1,262 @@ > +From 1f0224e8ddb3d3d0bf4c7a11769b193a4df5cc37 Mon Sep 17 00:00:00 2001 > +From: Jakub Jelinek <jakub@redhat.com> > +Date: Fri, 21 Nov 2025 16:25:58 +0100 > +Subject: [PATCH] libcody: Make it buildable by C++11 to C++26 > + > +The following builds with -std=c++11 and c++14 and c++17 and c++20 and c++23 > +and c++26. > + > +I see the u8 string literals are mixed e.g. with strerror, so in > +-fexec-charset=IBM1047 there will still be garbage, so am not 100% sure if > +the u8 literals everywhere are worth it either. > + > +2025-11-21 Jakub Jelinek <jakub@redhat.com> > + > + * cody.hh (S2C): For __cpp_char8_t >= 201811 use char8_t instead of > + char in argument type. > + (MessageBuffer::Space): Revert 2025-11-15 change. > + (MessageBuffer::Append): For __cpp_char8_t >= 201811 add overload > + with char8_t const * type of first argument. > + (Packet::Packet): Similarly for first argument. > + * client.cc (CommunicationError, Client::ProcessResponse, > + Client::Connect, ConnectResponse, PathnameResponse, OKResponse, > + IncludeTranslateResponse): Cast u8 string literals to (const char *) > + where needed. > + * server.cc (Server::ProcessRequests, ConnectRequest): Likewise. > + > +(cherry picked from commit 07a767c7a50d1daae8ef7d4aba73fe53ad40c0b7) > + > +Signed-off-by: Jakub Jelinek <jakub@redhat.com> > +Upstream-Status: Backport > +--- > + libcody/client.cc | 36 +++++++++++++++++++----------------- > + libcody/cody.hh | 22 ++++++++++++++++++++++ > + libcody/server.cc | 28 ++++++++++++++-------------- > + 3 files changed, 55 insertions(+), 31 deletions(-) > + > +diff --git a/libcody/client.cc b/libcody/client.cc > +index ae69d190cb7..147fecdbe50 100644 > +--- a/libcody/client.cc > ++++ b/libcody/client.cc > +@@ -97,7 +97,7 @@ int Client::CommunicateWithServer () > + > + static Packet CommunicationError (int err) > + { > +- std::string e {u8"communication error:"}; > ++ std::string e {(const char *) u8"communication error:"}; > + e.append (strerror (err)); > + > + return Packet (Client::PC_ERROR, std::move (e)); > +@@ -110,33 +110,34 @@ Packet Client::ProcessResponse (std::vector<std::string> &words, > + { > + if (e == EINVAL) > + { > +- std::string msg (u8"malformed string '"); > ++ std::string msg ((const char *) u8"malformed string '"); > + msg.append (words[0]); > +- msg.append (u8"'"); > ++ msg.append ((const char *) u8"'"); > + return Packet (Client::PC_ERROR, std::move (msg)); > + } > + else > +- return Packet (Client::PC_ERROR, u8"missing response"); > ++ return Packet (Client::PC_ERROR, (const char *) u8"missing response"); > + } > + > + Assert (!words.empty ()); > +- if (words[0] == u8"ERROR") > ++ if (words[0] == (const char *) u8"ERROR") > + return Packet (Client::PC_ERROR, > +- words.size () == 2 ? words[1]: u8"malformed error response"); > ++ words.size () == 2 ? words[1] > ++ : (const char *) u8"malformed error response"); > + > + if (isLast && !read.IsAtEnd ()) > + return Packet (Client::PC_ERROR, > +- std::string (u8"unexpected extra response")); > ++ std::string ((const char *) u8"unexpected extra response")); > + > + Assert (code < Detail::RC_HWM); > + Packet result (responseTable[code] (words)); > + result.SetRequest (code); > + if (result.GetCode () == Client::PC_ERROR && result.GetString ().empty ()) > + { > +- std::string msg {u8"malformed response '"}; > ++ std::string msg {(const char *) u8"malformed response '"}; > + > + read.LexedLine (msg); > +- msg.append (u8"'"); > ++ msg.append ((const char *) u8"'"); > + result.GetString () = std::move (msg); > + } > + else if (result.GetCode () == Client::PC_CONNECT) > +@@ -199,7 +200,7 @@ Packet Client::Connect (char const *agent, char const *ident, > + size_t alen, size_t ilen) > + { > + write.BeginLine (); > +- write.AppendWord (u8"HELLO"); > ++ write.AppendWord ((const char *) u8"HELLO"); > + write.AppendInteger (Version); > + write.AppendWord (agent, true, alen); > + write.AppendWord (ident, true, ilen); > +@@ -211,7 +212,8 @@ Packet Client::Connect (char const *agent, char const *ident, > + // HELLO $version $agent [$flags] > + Packet ConnectResponse (std::vector<std::string> &words) > + { > +- if (words[0] == u8"HELLO" && (words.size () == 3 || words.size () == 4)) > ++ if (words[0] == (const char *) u8"HELLO" > ++ && (words.size () == 3 || words.size () == 4)) > + { > + char *eptr; > + unsigned long val = strtoul (words[1].c_str (), &eptr, 10); > +@@ -247,7 +249,7 @@ Packet Client::ModuleRepo () > + // PATHNAME $dir | ERROR > + Packet PathnameResponse (std::vector<std::string> &words) > + { > +- if (words[0] == u8"PATHNAME" && words.size () == 2) > ++ if (words[0] == (const char *) u8"PATHNAME" && words.size () == 2) > + return Packet (Client::PC_PATHNAME, std::move (words[1])); > + > + return Packet (Client::PC_ERROR, u8""); > +@@ -256,7 +258,7 @@ Packet PathnameResponse (std::vector<std::string> &words) > + // OK or ERROR > + Packet OKResponse (std::vector<std::string> &words) > + { > +- if (words[0] == u8"OK") > ++ if (words[0] == (const char *) u8"OK") > + return Packet (Client::PC_OK); > + else > + return Packet (Client::PC_ERROR, > +@@ -319,11 +321,11 @@ Packet Client::IncludeTranslate (char const *include, Flags flags, size_t ilen) > + // PATHNAME $cmifile > + Packet IncludeTranslateResponse (std::vector<std::string> &words) > + { > +- if (words[0] == u8"BOOL" && words.size () == 2) > ++ if (words[0] == (const char *) u8"BOOL" && words.size () == 2) > + { > +- if (words[1] == u8"FALSE") > +- return Packet (Client::PC_BOOL, 0); > +- else if (words[1] == u8"TRUE") > ++ if (words[1] == (const char *) u8"FALSE") > ++ return Packet (Client::PC_BOOL); > ++ else if (words[1] == (const char *) u8"TRUE") > + return Packet (Client::PC_BOOL, 1); > + else > + return Packet (Client::PC_ERROR, u8""); > +diff --git a/libcody/cody.hh b/libcody/cody.hh > +index 789ce9e70b7..93bce93aa94 100644 > +--- a/libcody/cody.hh > ++++ b/libcody/cody.hh > +@@ -47,12 +47,21 @@ namespace Detail { > + > + // C++11 doesn't have utf8 character literals :( > + > ++#if __cpp_char8_t >= 201811 > ++template<unsigned I> > ++constexpr char S2C (char8_t const (&s)[I]) > ++{ > ++ static_assert (I == 2, "only single octet strings may be converted"); > ++ return s[0]; > ++} > ++#else > + template<unsigned I> > + constexpr char S2C (char const (&s)[I]) > + { > + static_assert (I == 2, "only single octet strings may be converted"); > + return s[0]; > + } > ++#endif > + > + /// Internal buffering class. Used to concatenate outgoing messages > + /// and Lex incoming ones. > +@@ -123,6 +132,13 @@ public: > + Space (); > + Append (str, maybe_quote, len); > + } > ++#if __cpp_char8_t >= 201811 > ++ void AppendWord (char8_t const *str, bool maybe_quote = false, > ++ size_t len = ~size_t (0)) > ++ { > ++ AppendWord ((const char *) str, maybe_quote, len); > ++ } > ++#endif > + /// Add a word as with AppendWord > + /// @param str the string to append > + /// @param maybe_quote string might need quoting, as for Append > +@@ -264,6 +280,12 @@ public: > + : string (s), cat (STRING), code (c) > + { > + } > ++#if __cpp_char8_t >= 201811 > ++ Packet (unsigned c, const char8_t *s) > ++ : string ((const char *) s), cat (STRING), code (c) > ++ { > ++ } > ++#endif > + Packet (unsigned c, std::vector<std::string> &&v) > + : vector (std::move (v)), cat (VECTOR), code (c) > + { > +diff --git a/libcody/server.cc b/libcody/server.cc > +index e2fa069bb93..c18469fae84 100644 > +--- a/libcody/server.cc > ++++ b/libcody/server.cc > +@@ -36,12 +36,12 @@ static RequestPair > + const requestTable[Detail::RC_HWM] = > + { > + // Same order as enum RequestCode > +- RequestPair {u8"HELLO", nullptr}, > +- RequestPair {u8"MODULE-REPO", ModuleRepoRequest}, > +- RequestPair {u8"MODULE-EXPORT", ModuleExportRequest}, > +- RequestPair {u8"MODULE-IMPORT", ModuleImportRequest}, > +- RequestPair {u8"MODULE-COMPILED", ModuleCompiledRequest}, > +- RequestPair {u8"INCLUDE-TRANSLATE", IncludeTranslateRequest}, > ++ RequestPair {(const char *) u8"HELLO", nullptr}, > ++ RequestPair {(const char *) u8"MODULE-REPO", ModuleRepoRequest}, > ++ RequestPair {(const char *) u8"MODULE-EXPORT", ModuleExportRequest}, > ++ RequestPair {(const char *) u8"MODULE-IMPORT", ModuleImportRequest}, > ++ RequestPair {(const char *) u8"MODULE-COMPILED", ModuleCompiledRequest}, > ++ RequestPair {(const char *) u8"INCLUDE-TRANSLATE", IncludeTranslateRequest}, > + }; > + } > + > +@@ -135,21 +135,21 @@ void Server::ProcessRequests (void) > + std::string msg; > + > + if (err > 0) > +- msg = u8"error processing '"; > ++ msg = (const char *) u8"error processing '"; > + else if (ix >= Detail::RC_HWM) > +- msg = u8"unrecognized '"; > ++ msg = (const char *) u8"unrecognized '"; > + else if (IsConnected () && ix == Detail::RC_CONNECT) > +- msg = u8"already connected '"; > ++ msg = (const char *) u8"already connected '"; > + else if (!IsConnected () && ix != Detail::RC_CONNECT) > +- msg = u8"not connected '"; > ++ msg = (const char *) u8"not connected '"; > + else > +- msg = u8"malformed '"; > ++ msg = (const char *) u8"malformed '"; > + > + read.LexedLine (msg); > +- msg.append (u8"'"); > ++ msg.append ((const char *) u8"'"); > + if (err > 0) > + { > +- msg.append (u8" "); > ++ msg.append ((const char *) u8" "); > + msg.append (strerror (err)); > + } > + resolver->ErrorResponse (this, std::move (msg)); > +@@ -176,7 +176,7 @@ Resolver *ConnectRequest (Server *s, Resolver *r, > + return nullptr; > + > + if (words.size () == 3) > +- words.emplace_back (u8""); > ++ words.emplace_back ((const char *) u8""); > + unsigned version = ParseUnsigned (words[1]); > + if (version == ~0u) > + return nullptr; > +-- > +2.53.0 > + > -- > 2.53.0 >
On Wed, Apr 8, 2026 at 12:02 PM Martin Jansa via lists.openembedded.org <martin.jansa=gmail.com@lists.openembedded.org> wrote: > > I think this isn't caused by glibc-2.43, but gcc-16 on host, you should backport > https://git.openembedded.org/openembedded-core/commit/?id=9eabea38f0c17d41d97284d63a25e45da3c9bbcc > from master (so it's clear it's the same commit). > > ubuntu-26.04 has glibc-2.43 but uses gcc-15 by default, that's why I > haven't seen this one in whinlatter nor scarthgap builds with it yet. > > Not sure why I cannot reproduce the binutils one in whinlatter, I've > just rebuilt both binutils-native as well as target binutils without > an issue, probably because of: > meta/recipes-devtools/binutils/binutils_2.45.bb:EXTRA_OECONF:append:toolchain-clang > = " --disable-gprofng" > but that is also in scarthgap (and bitbake-getvar confirmed it in both > builds). Was it with target binutils or binutils-native? I take it back, I've checked --disable-gprofng in target build, but then reverted my oe-core/scarthgap change to see it failing in binutils-native and after checking binutils-native I see --disable-gprofng only in scarthgap and that's indeed from :append:toolchain-clang which in scarthgap affects both target and native build while in whinlatter and newer I'm using toolchain-gcc for native and toolchain-clang only for target. Removing meta/recipes-devtools/binutils/binutils_2.45.bb:EXTRA_OECONF:append:toolchain-clang = " --disable-gprofng" reproduces the issue in whinlatter. And cherry-picking the fix I've sent for scarthgap fixes it for me as well (your commit backports the same upstream change, so I believe would work as well). I have added both into: https://git.openembedded.org/openembedded-core-contrib/log/?h=jansa/whinlatter Thanks > > On Tue, Apr 7, 2026 at 3:35 PM Zoltán Böszörményi <zboszor@gmail.com> wrote: > > > > Added a patch to fix gcc-cross-<arch> built against GLIBC 2.43 > > on Fedora 44. > > > > Signed-off-by: Zoltán Böszörményi <zboszor@gmail.com> > > --- > > meta/recipes-devtools/gcc/gcc-15.2.inc | 1 + > > ...dy-Make-it-buildable-by-C-11-to-C-26.patch | 262 ++++++++++++++++++ > > 2 files changed, 263 insertions(+) > > create mode 100644 meta/recipes-devtools/gcc/gcc/0001-libcody-Make-it-buildable-by-C-11-to-C-26.patch > > > > diff --git a/meta/recipes-devtools/gcc/gcc-15.2.inc b/meta/recipes-devtools/gcc/gcc-15.2.inc > > index d178b25487..aef22f8347 100644 > > --- a/meta/recipes-devtools/gcc/gcc-15.2.inc > > +++ b/meta/recipes-devtools/gcc/gcc-15.2.inc > > @@ -73,6 +73,7 @@ SRC_URI = "${BASEURI} \ > > file://0024-Avoid-hardcoded-build-paths-into-ppc-libgcc.patch \ > > file://0025-gcc-testsuite-tweaks-for-mips-OE.patch \ > > file://0026-fix-pr90579-testcases.patch \ > > + file://0001-libcody-Make-it-buildable-by-C-11-to-C-26.patch \ > > " > > > > UNPACKDIR = "${TMPDIR}/work-shared/gcc-${PV}-${PR}/sources" > > diff --git a/meta/recipes-devtools/gcc/gcc/0001-libcody-Make-it-buildable-by-C-11-to-C-26.patch b/meta/recipes-devtools/gcc/gcc/0001-libcody-Make-it-buildable-by-C-11-to-C-26.patch > > new file mode 100644 > > index 0000000000..676f1500e7 > > --- /dev/null > > +++ b/meta/recipes-devtools/gcc/gcc/0001-libcody-Make-it-buildable-by-C-11-to-C-26.patch > > @@ -0,0 +1,262 @@ > > +From 1f0224e8ddb3d3d0bf4c7a11769b193a4df5cc37 Mon Sep 17 00:00:00 2001 > > +From: Jakub Jelinek <jakub@redhat.com> > > +Date: Fri, 21 Nov 2025 16:25:58 +0100 > > +Subject: [PATCH] libcody: Make it buildable by C++11 to C++26 > > + > > +The following builds with -std=c++11 and c++14 and c++17 and c++20 and c++23 > > +and c++26. > > + > > +I see the u8 string literals are mixed e.g. with strerror, so in > > +-fexec-charset=IBM1047 there will still be garbage, so am not 100% sure if > > +the u8 literals everywhere are worth it either. > > + > > +2025-11-21 Jakub Jelinek <jakub@redhat.com> > > + > > + * cody.hh (S2C): For __cpp_char8_t >= 201811 use char8_t instead of > > + char in argument type. > > + (MessageBuffer::Space): Revert 2025-11-15 change. > > + (MessageBuffer::Append): For __cpp_char8_t >= 201811 add overload > > + with char8_t const * type of first argument. > > + (Packet::Packet): Similarly for first argument. > > + * client.cc (CommunicationError, Client::ProcessResponse, > > + Client::Connect, ConnectResponse, PathnameResponse, OKResponse, > > + IncludeTranslateResponse): Cast u8 string literals to (const char *) > > + where needed. > > + * server.cc (Server::ProcessRequests, ConnectRequest): Likewise. > > + > > +(cherry picked from commit 07a767c7a50d1daae8ef7d4aba73fe53ad40c0b7) > > + > > +Signed-off-by: Jakub Jelinek <jakub@redhat.com> > > +Upstream-Status: Backport > > +--- > > + libcody/client.cc | 36 +++++++++++++++++++----------------- > > + libcody/cody.hh | 22 ++++++++++++++++++++++ > > + libcody/server.cc | 28 ++++++++++++++-------------- > > + 3 files changed, 55 insertions(+), 31 deletions(-) > > + > > +diff --git a/libcody/client.cc b/libcody/client.cc > > +index ae69d190cb7..147fecdbe50 100644 > > +--- a/libcody/client.cc > > ++++ b/libcody/client.cc > > +@@ -97,7 +97,7 @@ int Client::CommunicateWithServer () > > + > > + static Packet CommunicationError (int err) > > + { > > +- std::string e {u8"communication error:"}; > > ++ std::string e {(const char *) u8"communication error:"}; > > + e.append (strerror (err)); > > + > > + return Packet (Client::PC_ERROR, std::move (e)); > > +@@ -110,33 +110,34 @@ Packet Client::ProcessResponse (std::vector<std::string> &words, > > + { > > + if (e == EINVAL) > > + { > > +- std::string msg (u8"malformed string '"); > > ++ std::string msg ((const char *) u8"malformed string '"); > > + msg.append (words[0]); > > +- msg.append (u8"'"); > > ++ msg.append ((const char *) u8"'"); > > + return Packet (Client::PC_ERROR, std::move (msg)); > > + } > > + else > > +- return Packet (Client::PC_ERROR, u8"missing response"); > > ++ return Packet (Client::PC_ERROR, (const char *) u8"missing response"); > > + } > > + > > + Assert (!words.empty ()); > > +- if (words[0] == u8"ERROR") > > ++ if (words[0] == (const char *) u8"ERROR") > > + return Packet (Client::PC_ERROR, > > +- words.size () == 2 ? words[1]: u8"malformed error response"); > > ++ words.size () == 2 ? words[1] > > ++ : (const char *) u8"malformed error response"); > > + > > + if (isLast && !read.IsAtEnd ()) > > + return Packet (Client::PC_ERROR, > > +- std::string (u8"unexpected extra response")); > > ++ std::string ((const char *) u8"unexpected extra response")); > > + > > + Assert (code < Detail::RC_HWM); > > + Packet result (responseTable[code] (words)); > > + result.SetRequest (code); > > + if (result.GetCode () == Client::PC_ERROR && result.GetString ().empty ()) > > + { > > +- std::string msg {u8"malformed response '"}; > > ++ std::string msg {(const char *) u8"malformed response '"}; > > + > > + read.LexedLine (msg); > > +- msg.append (u8"'"); > > ++ msg.append ((const char *) u8"'"); > > + result.GetString () = std::move (msg); > > + } > > + else if (result.GetCode () == Client::PC_CONNECT) > > +@@ -199,7 +200,7 @@ Packet Client::Connect (char const *agent, char const *ident, > > + size_t alen, size_t ilen) > > + { > > + write.BeginLine (); > > +- write.AppendWord (u8"HELLO"); > > ++ write.AppendWord ((const char *) u8"HELLO"); > > + write.AppendInteger (Version); > > + write.AppendWord (agent, true, alen); > > + write.AppendWord (ident, true, ilen); > > +@@ -211,7 +212,8 @@ Packet Client::Connect (char const *agent, char const *ident, > > + // HELLO $version $agent [$flags] > > + Packet ConnectResponse (std::vector<std::string> &words) > > + { > > +- if (words[0] == u8"HELLO" && (words.size () == 3 || words.size () == 4)) > > ++ if (words[0] == (const char *) u8"HELLO" > > ++ && (words.size () == 3 || words.size () == 4)) > > + { > > + char *eptr; > > + unsigned long val = strtoul (words[1].c_str (), &eptr, 10); > > +@@ -247,7 +249,7 @@ Packet Client::ModuleRepo () > > + // PATHNAME $dir | ERROR > > + Packet PathnameResponse (std::vector<std::string> &words) > > + { > > +- if (words[0] == u8"PATHNAME" && words.size () == 2) > > ++ if (words[0] == (const char *) u8"PATHNAME" && words.size () == 2) > > + return Packet (Client::PC_PATHNAME, std::move (words[1])); > > + > > + return Packet (Client::PC_ERROR, u8""); > > +@@ -256,7 +258,7 @@ Packet PathnameResponse (std::vector<std::string> &words) > > + // OK or ERROR > > + Packet OKResponse (std::vector<std::string> &words) > > + { > > +- if (words[0] == u8"OK") > > ++ if (words[0] == (const char *) u8"OK") > > + return Packet (Client::PC_OK); > > + else > > + return Packet (Client::PC_ERROR, > > +@@ -319,11 +321,11 @@ Packet Client::IncludeTranslate (char const *include, Flags flags, size_t ilen) > > + // PATHNAME $cmifile > > + Packet IncludeTranslateResponse (std::vector<std::string> &words) > > + { > > +- if (words[0] == u8"BOOL" && words.size () == 2) > > ++ if (words[0] == (const char *) u8"BOOL" && words.size () == 2) > > + { > > +- if (words[1] == u8"FALSE") > > +- return Packet (Client::PC_BOOL, 0); > > +- else if (words[1] == u8"TRUE") > > ++ if (words[1] == (const char *) u8"FALSE") > > ++ return Packet (Client::PC_BOOL); > > ++ else if (words[1] == (const char *) u8"TRUE") > > + return Packet (Client::PC_BOOL, 1); > > + else > > + return Packet (Client::PC_ERROR, u8""); > > +diff --git a/libcody/cody.hh b/libcody/cody.hh > > +index 789ce9e70b7..93bce93aa94 100644 > > +--- a/libcody/cody.hh > > ++++ b/libcody/cody.hh > > +@@ -47,12 +47,21 @@ namespace Detail { > > + > > + // C++11 doesn't have utf8 character literals :( > > + > > ++#if __cpp_char8_t >= 201811 > > ++template<unsigned I> > > ++constexpr char S2C (char8_t const (&s)[I]) > > ++{ > > ++ static_assert (I == 2, "only single octet strings may be converted"); > > ++ return s[0]; > > ++} > > ++#else > > + template<unsigned I> > > + constexpr char S2C (char const (&s)[I]) > > + { > > + static_assert (I == 2, "only single octet strings may be converted"); > > + return s[0]; > > + } > > ++#endif > > + > > + /// Internal buffering class. Used to concatenate outgoing messages > > + /// and Lex incoming ones. > > +@@ -123,6 +132,13 @@ public: > > + Space (); > > + Append (str, maybe_quote, len); > > + } > > ++#if __cpp_char8_t >= 201811 > > ++ void AppendWord (char8_t const *str, bool maybe_quote = false, > > ++ size_t len = ~size_t (0)) > > ++ { > > ++ AppendWord ((const char *) str, maybe_quote, len); > > ++ } > > ++#endif > > + /// Add a word as with AppendWord > > + /// @param str the string to append > > + /// @param maybe_quote string might need quoting, as for Append > > +@@ -264,6 +280,12 @@ public: > > + : string (s), cat (STRING), code (c) > > + { > > + } > > ++#if __cpp_char8_t >= 201811 > > ++ Packet (unsigned c, const char8_t *s) > > ++ : string ((const char *) s), cat (STRING), code (c) > > ++ { > > ++ } > > ++#endif > > + Packet (unsigned c, std::vector<std::string> &&v) > > + : vector (std::move (v)), cat (VECTOR), code (c) > > + { > > +diff --git a/libcody/server.cc b/libcody/server.cc > > +index e2fa069bb93..c18469fae84 100644 > > +--- a/libcody/server.cc > > ++++ b/libcody/server.cc > > +@@ -36,12 +36,12 @@ static RequestPair > > + const requestTable[Detail::RC_HWM] = > > + { > > + // Same order as enum RequestCode > > +- RequestPair {u8"HELLO", nullptr}, > > +- RequestPair {u8"MODULE-REPO", ModuleRepoRequest}, > > +- RequestPair {u8"MODULE-EXPORT", ModuleExportRequest}, > > +- RequestPair {u8"MODULE-IMPORT", ModuleImportRequest}, > > +- RequestPair {u8"MODULE-COMPILED", ModuleCompiledRequest}, > > +- RequestPair {u8"INCLUDE-TRANSLATE", IncludeTranslateRequest}, > > ++ RequestPair {(const char *) u8"HELLO", nullptr}, > > ++ RequestPair {(const char *) u8"MODULE-REPO", ModuleRepoRequest}, > > ++ RequestPair {(const char *) u8"MODULE-EXPORT", ModuleExportRequest}, > > ++ RequestPair {(const char *) u8"MODULE-IMPORT", ModuleImportRequest}, > > ++ RequestPair {(const char *) u8"MODULE-COMPILED", ModuleCompiledRequest}, > > ++ RequestPair {(const char *) u8"INCLUDE-TRANSLATE", IncludeTranslateRequest}, > > + }; > > + } > > + > > +@@ -135,21 +135,21 @@ void Server::ProcessRequests (void) > > + std::string msg; > > + > > + if (err > 0) > > +- msg = u8"error processing '"; > > ++ msg = (const char *) u8"error processing '"; > > + else if (ix >= Detail::RC_HWM) > > +- msg = u8"unrecognized '"; > > ++ msg = (const char *) u8"unrecognized '"; > > + else if (IsConnected () && ix == Detail::RC_CONNECT) > > +- msg = u8"already connected '"; > > ++ msg = (const char *) u8"already connected '"; > > + else if (!IsConnected () && ix != Detail::RC_CONNECT) > > +- msg = u8"not connected '"; > > ++ msg = (const char *) u8"not connected '"; > > + else > > +- msg = u8"malformed '"; > > ++ msg = (const char *) u8"malformed '"; > > + > > + read.LexedLine (msg); > > +- msg.append (u8"'"); > > ++ msg.append ((const char *) u8"'"); > > + if (err > 0) > > + { > > +- msg.append (u8" "); > > ++ msg.append ((const char *) u8" "); > > + msg.append (strerror (err)); > > + } > > + resolver->ErrorResponse (this, std::move (msg)); > > +@@ -176,7 +176,7 @@ Resolver *ConnectRequest (Server *s, Resolver *r, > > + return nullptr; > > + > > + if (words.size () == 3) > > +- words.emplace_back (u8""); > > ++ words.emplace_back ((const char *) u8""); > > + unsigned version = ParseUnsigned (words[1]); > > + if (version == ~0u) > > + return nullptr; > > +-- > > +2.53.0 > > + > > -- > > 2.53.0 > > > > -=-=-=-=-=-=-=-=-=-=-=- > Links: You receive all messages sent to this group. > View/Reply Online (#234826): https://lists.openembedded.org/g/openembedded-core/message/234826 > Mute This Topic: https://lists.openembedded.org/mt/118707561/3617156 > Group Owner: openembedded-core+owner@lists.openembedded.org > Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [martin.jansa@gmail.com] > -=-=-=-=-=-=-=-=-=-=-=- >
diff --git a/meta/recipes-devtools/gcc/gcc-15.2.inc b/meta/recipes-devtools/gcc/gcc-15.2.inc index d178b25487..aef22f8347 100644 --- a/meta/recipes-devtools/gcc/gcc-15.2.inc +++ b/meta/recipes-devtools/gcc/gcc-15.2.inc @@ -73,6 +73,7 @@ SRC_URI = "${BASEURI} \ file://0024-Avoid-hardcoded-build-paths-into-ppc-libgcc.patch \ file://0025-gcc-testsuite-tweaks-for-mips-OE.patch \ file://0026-fix-pr90579-testcases.patch \ + file://0001-libcody-Make-it-buildable-by-C-11-to-C-26.patch \ " UNPACKDIR = "${TMPDIR}/work-shared/gcc-${PV}-${PR}/sources" diff --git a/meta/recipes-devtools/gcc/gcc/0001-libcody-Make-it-buildable-by-C-11-to-C-26.patch b/meta/recipes-devtools/gcc/gcc/0001-libcody-Make-it-buildable-by-C-11-to-C-26.patch new file mode 100644 index 0000000000..676f1500e7 --- /dev/null +++ b/meta/recipes-devtools/gcc/gcc/0001-libcody-Make-it-buildable-by-C-11-to-C-26.patch @@ -0,0 +1,262 @@ +From 1f0224e8ddb3d3d0bf4c7a11769b193a4df5cc37 Mon Sep 17 00:00:00 2001 +From: Jakub Jelinek <jakub@redhat.com> +Date: Fri, 21 Nov 2025 16:25:58 +0100 +Subject: [PATCH] libcody: Make it buildable by C++11 to C++26 + +The following builds with -std=c++11 and c++14 and c++17 and c++20 and c++23 +and c++26. + +I see the u8 string literals are mixed e.g. with strerror, so in +-fexec-charset=IBM1047 there will still be garbage, so am not 100% sure if +the u8 literals everywhere are worth it either. + +2025-11-21 Jakub Jelinek <jakub@redhat.com> + + * cody.hh (S2C): For __cpp_char8_t >= 201811 use char8_t instead of + char in argument type. + (MessageBuffer::Space): Revert 2025-11-15 change. + (MessageBuffer::Append): For __cpp_char8_t >= 201811 add overload + with char8_t const * type of first argument. + (Packet::Packet): Similarly for first argument. + * client.cc (CommunicationError, Client::ProcessResponse, + Client::Connect, ConnectResponse, PathnameResponse, OKResponse, + IncludeTranslateResponse): Cast u8 string literals to (const char *) + where needed. + * server.cc (Server::ProcessRequests, ConnectRequest): Likewise. + +(cherry picked from commit 07a767c7a50d1daae8ef7d4aba73fe53ad40c0b7) + +Signed-off-by: Jakub Jelinek <jakub@redhat.com> +Upstream-Status: Backport +--- + libcody/client.cc | 36 +++++++++++++++++++----------------- + libcody/cody.hh | 22 ++++++++++++++++++++++ + libcody/server.cc | 28 ++++++++++++++-------------- + 3 files changed, 55 insertions(+), 31 deletions(-) + +diff --git a/libcody/client.cc b/libcody/client.cc +index ae69d190cb7..147fecdbe50 100644 +--- a/libcody/client.cc ++++ b/libcody/client.cc +@@ -97,7 +97,7 @@ int Client::CommunicateWithServer () + + static Packet CommunicationError (int err) + { +- std::string e {u8"communication error:"}; ++ std::string e {(const char *) u8"communication error:"}; + e.append (strerror (err)); + + return Packet (Client::PC_ERROR, std::move (e)); +@@ -110,33 +110,34 @@ Packet Client::ProcessResponse (std::vector<std::string> &words, + { + if (e == EINVAL) + { +- std::string msg (u8"malformed string '"); ++ std::string msg ((const char *) u8"malformed string '"); + msg.append (words[0]); +- msg.append (u8"'"); ++ msg.append ((const char *) u8"'"); + return Packet (Client::PC_ERROR, std::move (msg)); + } + else +- return Packet (Client::PC_ERROR, u8"missing response"); ++ return Packet (Client::PC_ERROR, (const char *) u8"missing response"); + } + + Assert (!words.empty ()); +- if (words[0] == u8"ERROR") ++ if (words[0] == (const char *) u8"ERROR") + return Packet (Client::PC_ERROR, +- words.size () == 2 ? words[1]: u8"malformed error response"); ++ words.size () == 2 ? words[1] ++ : (const char *) u8"malformed error response"); + + if (isLast && !read.IsAtEnd ()) + return Packet (Client::PC_ERROR, +- std::string (u8"unexpected extra response")); ++ std::string ((const char *) u8"unexpected extra response")); + + Assert (code < Detail::RC_HWM); + Packet result (responseTable[code] (words)); + result.SetRequest (code); + if (result.GetCode () == Client::PC_ERROR && result.GetString ().empty ()) + { +- std::string msg {u8"malformed response '"}; ++ std::string msg {(const char *) u8"malformed response '"}; + + read.LexedLine (msg); +- msg.append (u8"'"); ++ msg.append ((const char *) u8"'"); + result.GetString () = std::move (msg); + } + else if (result.GetCode () == Client::PC_CONNECT) +@@ -199,7 +200,7 @@ Packet Client::Connect (char const *agent, char const *ident, + size_t alen, size_t ilen) + { + write.BeginLine (); +- write.AppendWord (u8"HELLO"); ++ write.AppendWord ((const char *) u8"HELLO"); + write.AppendInteger (Version); + write.AppendWord (agent, true, alen); + write.AppendWord (ident, true, ilen); +@@ -211,7 +212,8 @@ Packet Client::Connect (char const *agent, char const *ident, + // HELLO $version $agent [$flags] + Packet ConnectResponse (std::vector<std::string> &words) + { +- if (words[0] == u8"HELLO" && (words.size () == 3 || words.size () == 4)) ++ if (words[0] == (const char *) u8"HELLO" ++ && (words.size () == 3 || words.size () == 4)) + { + char *eptr; + unsigned long val = strtoul (words[1].c_str (), &eptr, 10); +@@ -247,7 +249,7 @@ Packet Client::ModuleRepo () + // PATHNAME $dir | ERROR + Packet PathnameResponse (std::vector<std::string> &words) + { +- if (words[0] == u8"PATHNAME" && words.size () == 2) ++ if (words[0] == (const char *) u8"PATHNAME" && words.size () == 2) + return Packet (Client::PC_PATHNAME, std::move (words[1])); + + return Packet (Client::PC_ERROR, u8""); +@@ -256,7 +258,7 @@ Packet PathnameResponse (std::vector<std::string> &words) + // OK or ERROR + Packet OKResponse (std::vector<std::string> &words) + { +- if (words[0] == u8"OK") ++ if (words[0] == (const char *) u8"OK") + return Packet (Client::PC_OK); + else + return Packet (Client::PC_ERROR, +@@ -319,11 +321,11 @@ Packet Client::IncludeTranslate (char const *include, Flags flags, size_t ilen) + // PATHNAME $cmifile + Packet IncludeTranslateResponse (std::vector<std::string> &words) + { +- if (words[0] == u8"BOOL" && words.size () == 2) ++ if (words[0] == (const char *) u8"BOOL" && words.size () == 2) + { +- if (words[1] == u8"FALSE") +- return Packet (Client::PC_BOOL, 0); +- else if (words[1] == u8"TRUE") ++ if (words[1] == (const char *) u8"FALSE") ++ return Packet (Client::PC_BOOL); ++ else if (words[1] == (const char *) u8"TRUE") + return Packet (Client::PC_BOOL, 1); + else + return Packet (Client::PC_ERROR, u8""); +diff --git a/libcody/cody.hh b/libcody/cody.hh +index 789ce9e70b7..93bce93aa94 100644 +--- a/libcody/cody.hh ++++ b/libcody/cody.hh +@@ -47,12 +47,21 @@ namespace Detail { + + // C++11 doesn't have utf8 character literals :( + ++#if __cpp_char8_t >= 201811 ++template<unsigned I> ++constexpr char S2C (char8_t const (&s)[I]) ++{ ++ static_assert (I == 2, "only single octet strings may be converted"); ++ return s[0]; ++} ++#else + template<unsigned I> + constexpr char S2C (char const (&s)[I]) + { + static_assert (I == 2, "only single octet strings may be converted"); + return s[0]; + } ++#endif + + /// Internal buffering class. Used to concatenate outgoing messages + /// and Lex incoming ones. +@@ -123,6 +132,13 @@ public: + Space (); + Append (str, maybe_quote, len); + } ++#if __cpp_char8_t >= 201811 ++ void AppendWord (char8_t const *str, bool maybe_quote = false, ++ size_t len = ~size_t (0)) ++ { ++ AppendWord ((const char *) str, maybe_quote, len); ++ } ++#endif + /// Add a word as with AppendWord + /// @param str the string to append + /// @param maybe_quote string might need quoting, as for Append +@@ -264,6 +280,12 @@ public: + : string (s), cat (STRING), code (c) + { + } ++#if __cpp_char8_t >= 201811 ++ Packet (unsigned c, const char8_t *s) ++ : string ((const char *) s), cat (STRING), code (c) ++ { ++ } ++#endif + Packet (unsigned c, std::vector<std::string> &&v) + : vector (std::move (v)), cat (VECTOR), code (c) + { +diff --git a/libcody/server.cc b/libcody/server.cc +index e2fa069bb93..c18469fae84 100644 +--- a/libcody/server.cc ++++ b/libcody/server.cc +@@ -36,12 +36,12 @@ static RequestPair + const requestTable[Detail::RC_HWM] = + { + // Same order as enum RequestCode +- RequestPair {u8"HELLO", nullptr}, +- RequestPair {u8"MODULE-REPO", ModuleRepoRequest}, +- RequestPair {u8"MODULE-EXPORT", ModuleExportRequest}, +- RequestPair {u8"MODULE-IMPORT", ModuleImportRequest}, +- RequestPair {u8"MODULE-COMPILED", ModuleCompiledRequest}, +- RequestPair {u8"INCLUDE-TRANSLATE", IncludeTranslateRequest}, ++ RequestPair {(const char *) u8"HELLO", nullptr}, ++ RequestPair {(const char *) u8"MODULE-REPO", ModuleRepoRequest}, ++ RequestPair {(const char *) u8"MODULE-EXPORT", ModuleExportRequest}, ++ RequestPair {(const char *) u8"MODULE-IMPORT", ModuleImportRequest}, ++ RequestPair {(const char *) u8"MODULE-COMPILED", ModuleCompiledRequest}, ++ RequestPair {(const char *) u8"INCLUDE-TRANSLATE", IncludeTranslateRequest}, + }; + } + +@@ -135,21 +135,21 @@ void Server::ProcessRequests (void) + std::string msg; + + if (err > 0) +- msg = u8"error processing '"; ++ msg = (const char *) u8"error processing '"; + else if (ix >= Detail::RC_HWM) +- msg = u8"unrecognized '"; ++ msg = (const char *) u8"unrecognized '"; + else if (IsConnected () && ix == Detail::RC_CONNECT) +- msg = u8"already connected '"; ++ msg = (const char *) u8"already connected '"; + else if (!IsConnected () && ix != Detail::RC_CONNECT) +- msg = u8"not connected '"; ++ msg = (const char *) u8"not connected '"; + else +- msg = u8"malformed '"; ++ msg = (const char *) u8"malformed '"; + + read.LexedLine (msg); +- msg.append (u8"'"); ++ msg.append ((const char *) u8"'"); + if (err > 0) + { +- msg.append (u8" "); ++ msg.append ((const char *) u8" "); + msg.append (strerror (err)); + } + resolver->ErrorResponse (this, std::move (msg)); +@@ -176,7 +176,7 @@ Resolver *ConnectRequest (Server *s, Resolver *r, + return nullptr; + + if (words.size () == 3) +- words.emplace_back (u8""); ++ words.emplace_back ((const char *) u8""); + unsigned version = ParseUnsigned (words[1]); + if (version == ~0u) + return nullptr; +-- +2.53.0 +
Added a patch to fix gcc-cross-<arch> built against GLIBC 2.43 on Fedora 44. Signed-off-by: Zoltán Böszörményi <zboszor@gmail.com> --- meta/recipes-devtools/gcc/gcc-15.2.inc | 1 + ...dy-Make-it-buildable-by-C-11-to-C-26.patch | 262 ++++++++++++++++++ 2 files changed, 263 insertions(+) create mode 100644 meta/recipes-devtools/gcc/gcc/0001-libcody-Make-it-buildable-by-C-11-to-C-26.patch