[PATCH] libstdc++: Do not overwrite module definition files during build [PR126786]
Jonathan Wakely <[email protected]>
| Newsgroups | gmane.comp.gcc.patches,gmane.comp.gcc.libstdc++.devel |
|---|---|
| Message-ID | <[email protected]> |
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 $@; \ 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