Hi Rasmus, We have had to use for stdbool a similar trick as we had for stdint (need to preinclude yyvals.h), which we will need to propagate somehow. I'm not yet sure how to reconcile that with your observations.
Olivier > On 12 Nov 2021, at 11:15, Rasmus Villemoes <r...@rasmusvillemoes.dk> wrote: > > Commit bbbc05957e (Arrange to preinclude yvals.h ahead of stdint on > VxWorks 7) breaks the build of libstdc++ for our VxWorks 5 platform. > > In file included from > .../gcc-build/powerpc-wrs-vxworks/libstdc++-v3/include/memory:72, > from .../gcc-src/libstdc++-v3/include/precompiled/stdc++.h:82: > .../gcc-build/powerpc-wrs-vxworks/libstdc++-v3/include/bits/align.h:36:10: > fatal error: stdint.h: No such file or directory > 36 | #include <stdint.h> // uintptr_t > | ^~~~~~~~~~ > compilation terminated. > Makefile:1861: recipe for target > 'powerpc-wrs-vxworks/bits/stdc++.h.gch/O2ggnu++0x.gch' failed > make[5]: *** [powerpc-wrs-vxworks/bits/stdc++.h.gch/O2ggnu++0x.gch] Error 1 > > The problem is that the stdint.h header does not exist (in the > gcc/include/ directory) during the build, but is only added at "make > install" time. > > For the approach with an extra makefile fragment to work, that rule > would have to fire after stmp-int-hdrs as it does now (i.e., after the > common logic has removed stdint.h), but it must also run before we > actually start building target libraries that depend on having a > stdint.h - and I can't find something reasonable to make the rule a > dependency of. > > I agree with the intent of avoiding "altering the common stdint-gcc.h > with unpleasant vxworks specific bits". The best approach I could come > up with is adding another variant of "use_gcc_stdint", "preserve", > meaning "leave whatever the target's extra_headers settings put inside > gcc/include/ alone". There's no change in behaviour for any of the > existing values "none", "wrap" or "provide". > > gcc/ChangeLog: > > * Makefile.in (stmp-int-hdrs): Only remove include/stdint.h when > $(USE_GCC_STDINT) != "preserve". > * config.gcc: Document new possible value of use_gcc_stdint: > "preserve". > * config.gcc (vxworks): Add ../vxworks/stdint.h to > extra_headers and set use_gcc_stdint=preserve. > * config/t-vxworks: Remove install-stdint.h rule. > --- > > I have previously sent something similar to Olivier privately, hoping > I could come up with a better/cleaner fix. But I have failed, so now > I've taken what I had and added the necesary documentation and > changelog bits. > > Better ideas are of course welcome. I thought of using "custom" > instead of "preserve", but chose the latter since "wrap" and "provide" > are verbs. > > gcc/Makefile.in | 4 +++- > gcc/config.gcc | 11 ++++++----- > gcc/config/t-vxworks | 12 ------------ > 3 files changed, 9 insertions(+), 18 deletions(-) > > diff --git a/gcc/Makefile.in b/gcc/Makefile.in > index 571e9c28e29..759982f1d7d 100644 > --- a/gcc/Makefile.in > +++ b/gcc/Makefile.in > @@ -3132,7 +3132,9 @@ stmp-int-hdrs: $(STMP_FIXINC) $(T_GLIMITS_H) $(USER_H) > fixinc_list > chmod a+r include/$$file; \ > fi; \ > done > - rm -f include/stdint.h > + if [ $(USE_GCC_STDINT) != preserve ]; then \ > + rm -f include/stdint.h; \ > + fi > if [ $(USE_GCC_STDINT) = wrap ]; then \ > rm -f include/stdint-gcc.h; \ > cp $(srcdir)/ginclude/stdint-gcc.h include/stdint-gcc.h; \ > diff --git a/gcc/config.gcc b/gcc/config.gcc > index edd12655c4a..7a236e1a967 100644 > --- a/gcc/config.gcc > +++ b/gcc/config.gcc > @@ -129,8 +129,9 @@ > # use_gcc_stdint If "wrap", install a version of stdint.h that > # wraps the system's copy for hosted compilations; > # if "provide", provide a version of systems without > -# such a system header; otherwise "none", do not > -# provide such a header at all. > +# such a system header; if "preserve", keep the copy > +# installed via the target's extra_headers; otherwise > +# "none", do not provide such a header at all. > # > # extra_programs List of extra executables compiled for this target > # machine, used when linking. > @@ -1024,11 +1025,11 @@ case ${target} in > tm_file="${tm_file} vxworks-stdint.h" > > # .. only through the yvals conditional wrapping mentioned above > - # to abide by the VxWorks 7 expectations. The final copy is performed > - # explicitly by a t-vxworks Makefile rule. > + # to abide by the VxWorks 7 expectations. > > - use_gcc_stdint=none > + use_gcc_stdint=preserve > extra_headers="${extra_headers} ../../ginclude/stdint-gcc.h" > + extra_headers="${extra_headers} ../vxworks/stdint.h" > > case ${enable_threads} in > no) ;; > diff --git a/gcc/config/t-vxworks b/gcc/config/t-vxworks > index 5a06ebe1b87..a544bedf634 100644 > --- a/gcc/config/t-vxworks > +++ b/gcc/config/t-vxworks > @@ -24,18 +24,6 @@ vxworks-c.o: $(srcdir)/config/vxworks-c.c > $(COMPILE) $< > $(POSTCOMPILE) > > -# Arrange to install our stdint.h wrapper, by copying it in the > -# build-time include dir before this include dir is installed and after > -# stmp-int-hdrs removes it (because it was told we don't provide it). > - > -INSTALL_HEADERS += install-stdint.h > - > -install-stdint.h: stmp-int-hdrs > - cp -p $(srcdir)/config/vxworks/stdint.h include/stdint.h > - chmod a+r include/stdint.h > - > -$(INSTALL_HEADERS_DIR): install-stdint.h > - > # Both the kernel and RTP headers provide limits.h. They embed VxWorks > # specificities and are dated on some configurations so we both need to > # provide our own version and make sure the system one gets exposed. > -- > 2.31.1 >