Comment 0 for bug 1916705

Revision history for this message
Christian Ehrhardt  (paelzer) wrote :

qemu now breaks in Hirsute (it didn't 23h ago)
Broken:
https://launchpadlibrarian.net/524654684/buildlog_ubuntu-hirsute-amd64.qemu_1%3A5.2+dfsg-6ubuntu1_BUILDING.txt.gz

Good before:
https://launchpad.net/~ci-train-ppa-service/+archive/ubuntu/4471/+packages

Error:

../../disas/arm-a64.cc
In file included from /usr/include/glib-2.0/glib/gmacros.h:241,
                 from /usr/lib/x86_64-linux-gnu/glib-2.0/include/glibconfig.h:9,
                 from /usr/include/glib-2.0/glib/gtypes.h:32,
                 from /usr/include/glib-2.0/glib/galloca.h:32,
                 from /usr/include/glib-2.0/glib.h:30,
                 from /<<BUILDDIR>>/qemu-5.2+dfsg/include/glib-compat.h:32,
                 from /<<BUILDDIR>>/qemu-5.2+dfsg/include/qemu/osdep.h:126,
                 from ../../disas/arm-a64.cc:21:
/usr/include/c++/10/type_traits:56:3: error: template with C linkage
   56 | template<typename _Tp, _Tp __v>
      | ^~~~~~~~
../../disas/arm-a64.cc:20:1: note: ‘extern "C"’ linkage started here
   20 | extern "C" {
      | ^~~~~~~~~~

Also in disas/nanomips.cpp, ...

And indeed disas/arm-a64.cc has:
 20 extern "C" {
 21 #include "qemu/osdep.h"
 22 #include "disas/dis-asm.h"
 23 }

Through the chain of headers as reported above this gets to the templates
in /usr/include/c++/10/type_traits which fails due to that.

So C++ constructs within a C scope which is this bug.

Upstream qemu has not recently changed yet for this.
The code is the same since 2016 via commit e78490c44: "disas/arm-a64.cc:
Include osdep.h first" by Peter Maydell.

But what was different before to break it now?
To find that I was comparing Hirsute vs Hirsute-proposed ...

It is indeed failing in -proposed but working in hirsute-release.

10.2.1-20ubuntu1 : bad

repro in broken build:
$ cd /root/qemu-5.2+dfsg/b/qemu
$ c++ -Ilibcommon.fa.p -I. -I../.. -Iqapi -Itrace -Iui -Iui/shader -I/usr/include/pixman-1 -I/usr/include/virgl -I/usr/include/libpng16 -I/usr/include/spice-server -I/usr/include/spice-1 -I/usr/include/libusb-1.0 -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/gio-unix-2.0 -I/usr/include/cacard -I/usr/include/nss -I/usr/include/nspr -I/usr/include/PCSC -I/usr/include/slirp -fdiagnostics-color=auto -pipe -Wall -Winvalid-pch -Wnon-virtual-dtor -std=gnu++11 -O2 -g -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -U_FORTIFY_SOURCE -m64 -mcx16 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wundef -Wwrite-strings -fno-strict-aliasing -fno-common -fwrapv -g -O2 -ffile-prefix-map=/root/qemu-5.2+dfsg=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -Wtype-limits -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers -Wempty-body -Wendif-labels -Wexpansion-to-defined -Wno-missing-include-dirs -Wno-shift-negative-value -Wno-psabi -fstack-protector-strong -isystem /root/qemu-5.2+dfsg/linux-headers -isystem linux-headers -iquote /root/qemu-5.2+dfsg/tcg/i386 -iquote . -iquote /root/qemu-5.2+dfsg -iquote /root/qemu-5.2+dfsg/accel/tcg -iquote /root/qemu-5.2+dfsg/include -iquote /root/qemu-5.2+dfsg/disas/libvixl -pthread -fPIE -DSTRUCT_IOVEC_DEFINED -D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -DNCURSES_WIDECHAR -MD -MQ libcommon.fa.p/disas_nanomips.cpp.o -MF libcommon.fa.p/disas_nanomips.cpp.o.d -o libcommon.fa.p/disas_nanomips.cpp.o -c ../../disas/nanomips.cpp

With that I have a test env...

Doko asked me to test
https://launchpad.net/ubuntu/+source/gcc-10/10.2.1-19ubuntu1/+build/20995220/+files/g++-10_10.2.1-19ubuntu1_amd64.deb
That fails as well, but also good as well as bad case have 10.10.2.1-20ubuntu1
It must be something else.

The difference were ~340 packages I was upgrading them to spot what broke it.
I eventually found glib 2.66 -> 2.67 to break it.

libglib2.0-0/hirsute-proposed 2.67.4-1 amd64 [upgradable from: 2.66.4-1]
libglib2.0-bin/hirsute-proposed 2.67.4-1 amd64 [upgradable from: 2.66.4-1]
libglib2.0-data/hirsute-proposed 2.67.4-1 all [upgradable from: 2.66.4-1]
libglib2.0-dev-bin/hirsute-proposed 2.67.4-1 amd64 [upgradable from: 2.66.4-1]
libglib2.0-dev/hirsute-proposed 2.67.4-1 amd64 [upgradable from: 2.66.4-1]

Old:
/*
 * We can only use __typeof__ on GCC >= 4.8, and not when compiling C++. Since
 * __typeof__ is used in a few places in GLib, provide a pre-processor symbol
 * to factor the check out from callers.
 *
 * This symbol is private.
 */
#undef g_has_typeof
#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)) && !defined(__cplusplus)
#define g_has_typeof
#endif

New:
/*
 * We can only use __typeof__ on GCC >= 4.8, and not when compiling C++. Since
 * __typeof__ is used in a few places in GLib, provide a pre-processor symbol
 * to factor the check out from callers.
 *
 * This symbol is private.
 */
#undef glib_typeof
#if !defined(__cplusplus) && \
     ((defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))) || \
      defined(__clang__))
#define glib_typeof(t) __typeof__ (t)
#elif defined(__cplusplus) && __cplusplus >= 201103L
/* C++11 decltype() is close enough for our usage */
#include <type_traits> <--- THIS IS WHAT BREAKS US
#define glib_typeof(t) typename std::remove_reference<decltype (t)>::type
#define glib_typeof_2_68
#endif

On the glib side this is due to:
https://gitlab.gnome.org/GNOME/glib/-/issues/2331
Also related:
https://gitlab.gnome.org/GNOME/glib/-/merge_requests/1935
https://<email address hidden>/thread/J3P4TRHLWNDIKXF76OLYZNAPTABCZ3U5/#7LXFUDBBBIT23FE44QJYWX3I7U4EHW6M

Qemu try to fix/discussion at:
https://lists.gnu.org/archive/html/qemu-devel/2021-02/msg07294.html
This won't be the final solution, but it gets things going for the time being.