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