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
> 

Reply via email to