While compiling XFree86-4.3.0.1 recently, I got the following error message: In file included from text-mode.c:47: loader.h:78: warning: ISO C doesn't support unnamed structs/unions loader.h:78: unnamed fields of type other than struct or union are not allowed text-mode.c: In function `TextMode': text-mode.c:208: warning: string length `535' is greater than the length `509' ISO C89 compilers are required to support make[5]: *** [text-mode.o] Error 1 make[5]: Leaving directory `/usr/src/incept/BUILD/xc/programs/Xserver/hw/xfree86/xf86cfg' make[4]: *** [all] Error 2 make[4]: Leaving directory `/usr/src/incept/BUILD/xc/programs/Xserver/hw/xfree86' make[3]: *** [hw/xfree86] Error 2 make[3]: Leaving directory `/usr/src/incept/BUILD/xc/programs/Xserver' make[2]: *** [install] Error 2 make[2]: Leaving directory `/usr/src/incept/BUILD/xc/programs' make[1]: *** [install] Error 2 make[1]: Leaving directory `/usr/src/incept/BUILD/xc' make: *** [install] Error 2 I looked into it, and it's occurring because of the following line in the ValueUnion type: Bool bool; ^^^^ "bool" is a loaded name. It's a defined type in all C++ compilers, and it's also defined in plain old non-C++ gcc whenever something includes <stdbool.h>. In my case, I hit it for the first time yesterday because <curses.h> from ncurses 5.4 now includes the <stdbool.h> header. So far I see three possible solutions: 1) force ncurses to not include <stdbool.h>. This definitely isn't ideal, primarily because it won't stop the next package from including <stdbool.h>, and then we'll be dealing with this garbage all over again. 2) undefine the bool type before defining the ValueUnion type (see attached patch). This is hardly ideal, as several other source files in XFree86 depend on that type, and this could give us headaches down the road. Plus, I don't know how portable this hack is--it might not work on other toolchains besides linux+gcc+libc6. 3) rename the ValueUnion.bool field to something else, like xbool or boolval. This would be the perfect solution, except that ValueUnion.bool is part of a documented API for XFree86 driver modules, and it wouldn't be particularly nice to break the API. I would assume there would be ABI breakage as well, since I'm not sure exactly how unions get handled at link-time across different platforms. What I'd probably do is go with (2) for the current 4.3.0 branch, and implement (3) for 4.4.0 or some later release where a driver API break is marginally acceptable. Anything besides (3) should just be treated as a temporary stopgap measure, as otherwise we'd just be digging ourselves deeper into the same hole. -- Kelledin "If a server crashes in a server farm and no one pings it, does it still cost four figures to fix?"
Submitted By: Kelledin (kelledin at users dot sourceforge dot net) Date: 2004-02-18 Initial Package Version: 4.3.0 Upstream Status: Reported to maintainers Origin: Kelledin Description: XFree86 4.3.x uses a loaded name ("bool") for a union type field. This causes nasty compile problems when other stuff (like ncurses-5.4) includes the <stdbool.h> header. This patch is a workaround for this issue. diff -Naur xc/programs/Xserver/hw/xfree86/common/xf86Opt.h xc-bool/programs/Xserver/hw/xfree86/common/xf86Opt.h --- xc/programs/Xserver/hw/xfree86/common/xf86Opt.h 2001-05-04 14:05:30.000000000 -0500 +++ xc-bool/programs/Xserver/hw/xfree86/common/xf86Opt.h 2004-02-18 14:27:07.000000000 -0600 @@ -5,6 +5,10 @@ #ifndef _XF86_OPT_H_ #define _XF86_OPT_H_ +#ifdef bool +# undef bool +#endif + typedef struct { double freq; int units; diff -Naur xc/programs/Xserver/hw/xfree86/xf86cfg/loader.h xc-bool/programs/Xserver/hw/xfree86/xf86cfg/loader.h --- xc/programs/Xserver/hw/xfree86/xf86cfg/loader.h 2001-07-09 18:45:24.000000000 -0500 +++ xc-bool/programs/Xserver/hw/xfree86/xf86cfg/loader.h 2004-02-18 14:26:51.000000000 -0600 @@ -66,6 +66,10 @@ #ifndef LOADER_PRIVATE /* common/xf86Opt.h */ +#ifdef bool +# undef bool +#endif + typedef struct { double freq; int units;