[PATCH] libstdc++: Do not overwrite module definition files during build [PR126786]

Tomasz Kaminski tkaminsk@redhat.com
Tue Aug 18 08:20:28 GMT 2026


On Mon, Aug 17, 2026 at 10:27 PM Jonathan Wakely <jwakely@redhat.com> wrote:

> As described in the bug report, when compilation of std.cc or
> std.compat.cc fails we overwrite the source file with an empty file, and
> then compile that (so that bootstrap doesn't fail). Then when the module
> definition files are installed, we install the empty file.
>
> We should install the original source, not an empty file. We can create
> an empty file and compile it, but leave the original source untouched so
> that it can still be installed.
>
> libstdc++-v3/ChangeLog:
>
>         PR libstdc++/126786
>         * src/c++23/Makefile.am (std.lo, std.compat.lo): Do not
>         overwrite original sources in error-recovery steps.
>         * src/c++23/Makefile.in: Regenerate.
> ---
>
> Tested x86_64-linux.
>
> Also checked by injecting errors into std.cc.in and std.compat.cc.in to
> ensure that the build completes as expected.
>
>  libstdc++-v3/src/c++23/Makefile.am | 12 ++++--------
>  libstdc++-v3/src/c++23/Makefile.in | 12 ++++--------
>  2 files changed, 8 insertions(+), 16 deletions(-)
>
> diff --git a/libstdc++-v3/src/c++23/Makefile.am
> b/libstdc++-v3/src/c++23/Makefile.am
> index 92691c502a94..87c0108b52d0 100644
> --- a/libstdc++-v3/src/c++23/Makefile.am
> +++ b/libstdc++-v3/src/c++23/Makefile.am
> @@ -104,29 +104,25 @@ std.lo: std.cc
>         if ! $(LTCXXCOMPILE) $(MODULES_FLAGS) -c $< ; then \
>           echo "Cannot compile std module" >&2; \
>           echo "Module initialization function will be missing" >&2; \
> -         echo > $<.tmp && mv $<.tmp $< && \
> -         $(LTCXXCOMPILE) $(MODULES_FLAGS) -c $< ; \
> +         echo > x$< && $(LTCXXCOMPILE) $(MODULES_FLAGS) -c x$< -o $@; \
>
Any reason for switching the name of the helper file from std.cc.tmp to
xstd.cc?
I think the later is more likely to conflict with something, so would
preffer to use $<.tmp
here. Or is this common practice for these makefiles?

>         fi
>  std.o: std.cc
>         if ! $(CXXCOMPILE) $(MODULES_FLAGS) -c $< ; then \
>           echo "Cannot compile std module" >&2; \
>           echo "Module initialization function will be missing" >&2; \
> -         echo > $<.tmp && mv $<.tmp $< && \
> -         $(CXXCOMPILE) $(MODULES_FLAGS) -c $< ; \
> +         echo > x$< && $(CXXCOMPILE) $(MODULES_FLAGS) -c x$< -o $@; \
>         fi
>  std.compat.lo: std.compat.cc std.lo
>         if ! $(LTCXXCOMPILE) $(MODULES_FLAGS) -c $< ; then \
>           echo "Cannot compile std.compat module" >&2; \
>           echo "Module initialization function will be missing" >&2; \
> -         echo > $<.tmp && mv $<.tmp $< && \
> -         $(LTCXXCOMPILE) $(MODULES_FLAGS) -c $< ; \
> +         echo > x$< && $(LTCXXCOMPILE) $(MODULES_FLAGS) -c x$< -o $@; \
>         fi
>  std.compat.o: std.compat.cc std.o
>         if ! $(CXXCOMPILE) $(MODULES_FLAGS) -c $< ; then \
>           echo "Cannot compile std.compat module" >&2; \
>           echo "Module initialization function will be missing" >&2; \
> -         echo > $<.tmp && mv $<.tmp $< && \
> -         $(CXXCOMPILE) $(MODULES_FLAGS) -c $< ; \
> +         echo > x$< && $(CXXCOMPILE) $(MODULES_FLAGS) -c x$< -o $@; \
>         fi
>
>  # AM_CXXFLAGS needs to be in each subdirectory so that it can be
> diff --git a/libstdc++-v3/src/c++23/Makefile.in
> b/libstdc++-v3/src/c++23/Makefile.in
> index 0ce93f812d25..63e5cb4e2a1c 100644
> --- a/libstdc++-v3/src/c++23/Makefile.in
> +++ b/libstdc++-v3/src/c++23/Makefile.in
> @@ -888,29 +888,25 @@ std.lo: std.cc
>         if ! $(LTCXXCOMPILE) $(MODULES_FLAGS) -c $< ; then \
>           echo "Cannot compile std module" >&2; \
>           echo "Module initialization function will be missing" >&2; \
> -         echo > $<.tmp && mv $<.tmp $< && \
> -         $(LTCXXCOMPILE) $(MODULES_FLAGS) -c $< ; \
> +         echo > x$< && $(LTCXXCOMPILE) $(MODULES_FLAGS) -c x$< -o $@; \
>         fi
>  std.o: std.cc
>         if ! $(CXXCOMPILE) $(MODULES_FLAGS) -c $< ; then \
>           echo "Cannot compile std module" >&2; \
>           echo "Module initialization function will be missing" >&2; \
> -         echo > $<.tmp && mv $<.tmp $< && \
> -         $(CXXCOMPILE) $(MODULES_FLAGS) -c $< ; \
> +         echo > x$< && $(CXXCOMPILE) $(MODULES_FLAGS) -c x$< -o $@; \
>         fi
>  std.compat.lo: std.compat.cc std.lo
>         if ! $(LTCXXCOMPILE) $(MODULES_FLAGS) -c $< ; then \
>           echo "Cannot compile std.compat module" >&2; \
>           echo "Module initialization function will be missing" >&2; \
> -         echo > $<.tmp && mv $<.tmp $< && \
> -         $(LTCXXCOMPILE) $(MODULES_FLAGS) -c $< ; \
> +         echo > x$< && $(LTCXXCOMPILE) $(MODULES_FLAGS) -c x$< -o $@; \
>         fi
>  std.compat.o: std.compat.cc std.o
>         if ! $(CXXCOMPILE) $(MODULES_FLAGS) -c $< ; then \
>           echo "Cannot compile std.compat module" >&2; \
>           echo "Module initialization function will be missing" >&2; \
> -         echo > $<.tmp && mv $<.tmp $< && \
> -         $(CXXCOMPILE) $(MODULES_FLAGS) -c $< ; \
> +         echo > x$< && $(CXXCOMPILE) $(MODULES_FLAGS) -c x$< -o $@; \
>         fi
>
>  # Tell versions [3.59,3.63) of GNU make to not export all variables.
> --
> 2.55.0
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://gcc.gnu.org/pipermail/libstdc++/attachments/20260818/88a50d63/attachment.htm>


More information about the Libstdc++ mailing list