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

Tomasz Kaminski <[email protected]>
Newsgroups gmane.comp.gcc.patches,gmane.comp.gcc.libstdc++.devel
Message-ID <CAKvuMXCVKFC8B+M2GEDgfOyrp-pSgYk+pFyarFbN+cTmWf6RFQ@mail.gmail.com>
On Mon, Aug 17, 2026 at 10:27 PM Jonathan Wakely <[email protected]> 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
>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.