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 > >