[PATCH v2] libstdc++: Do not overwrite module definition files during build [PR126786]
Jonathan Wakely
jwakely@redhat.com
Tue Aug 18 08:56:26 GMT 2026
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 (empty.cc): New target.
(std.lo, std.o, std.compat.lo, std.compat.o): Use empty.cc as
fallback instead of overwriting original sources.
* src/c++23/Makefile.in: Regenerate.
---
v2: Use a makefile target to create empty.cc
We could even consider separate empty-std.cc and empty-std.compat.cc
files, with 'export module std;' in the former and 'export module
std.compat;' in the latter. That would mean we would actually define
module init functions in the library, they'd just be no-op functions.
libstdc++-v3/src/c++23/Makefile.am | 24 ++++++++++++------------
libstdc++-v3/src/c++23/Makefile.in | 24 ++++++++++++------------
2 files changed, 24 insertions(+), 24 deletions(-)
diff --git a/libstdc++-v3/src/c++23/Makefile.am b/libstdc++-v3/src/c++23/Makefile.am
index 92691c502a94..e09c4bd54da2 100644
--- a/libstdc++-v3/src/c++23/Makefile.am
+++ b/libstdc++-v3/src/c++23/Makefile.am
@@ -54,6 +54,10 @@ std.cc: std.cc.in std-clib.cc.in
std.compat.cc: std.compat.cc.in std-clib.cc.in
cat $^ > $@
+# Empty file used in case std.cc or std.compat.cc fails to compile.
+empty.cc:
+ echo > $@
+
# Also put the interface units in the build-includes bits directory.
stamp-modules-bits: $(includebits_DATA)
@-mkdir -p $(top_builddir)/include/bits
@@ -100,33 +104,29 @@ MODULES_FLAGS = -isystem ${glibcxx_srcdir}/include/backward -fmodules \
-Wno-unknown-pragmas
# These go into libmodulesconvenience.la and are linked into libstdc++
-std.lo: std.cc
+std.lo: std.cc empty.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 $< ; \
+ $(LTCXXCOMPILE) $(MODULES_FLAGS) -c empty.cc -o $@; \
fi
-std.o: std.cc
+std.o: std.cc empty.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 $< ; \
+ $(CXXCOMPILE) $(MODULES_FLAGS) -c empty.cc -o $@; \
fi
-std.compat.lo: std.compat.cc std.lo
+std.compat.lo: std.compat.cc std.lo empty.cc
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 $< ; \
+ $(LTCXXCOMPILE) $(MODULES_FLAGS) -c empty.cc -o $@; \
fi
-std.compat.o: std.compat.cc std.o
+std.compat.o: std.compat.cc std.o empty.cc
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 $< ; \
+ $(CXXCOMPILE) $(MODULES_FLAGS) -c empty.cc -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..f3ea90ce2478 100644
--- a/libstdc++-v3/src/c++23/Makefile.in
+++ b/libstdc++-v3/src/c++23/Makefile.in
@@ -862,6 +862,10 @@ std.cc: std.cc.in std-clib.cc.in
std.compat.cc: std.compat.cc.in std-clib.cc.in
cat $^ > $@
+# Empty file used in case std.cc or std.compat.cc fails to compile.
+empty.cc:
+ echo > $@
+
# Also put the interface units in the build-includes bits directory.
stamp-modules-bits: $(includebits_DATA)
@-mkdir -p $(top_builddir)/include/bits
@@ -884,33 +888,29 @@ print.o: print.cc
$(CXXCOMPILE) -std=gnu++26 -c $<
# These go into libmodulesconvenience.la and are linked into libstdc++
-std.lo: std.cc
+std.lo: std.cc empty.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 $< ; \
+ $(LTCXXCOMPILE) $(MODULES_FLAGS) -c empty.cc -o $@; \
fi
-std.o: std.cc
+std.o: std.cc empty.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 $< ; \
+ $(CXXCOMPILE) $(MODULES_FLAGS) -c empty.cc -o $@; \
fi
-std.compat.lo: std.compat.cc std.lo
+std.compat.lo: std.compat.cc std.lo empty.cc
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 $< ; \
+ $(LTCXXCOMPILE) $(MODULES_FLAGS) -c empty.cc -o $@; \
fi
-std.compat.o: std.compat.cc std.o
+std.compat.o: std.compat.cc std.o empty.cc
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 $< ; \
+ $(CXXCOMPILE) $(MODULES_FLAGS) -c empty.cc -o $@; \
fi
# Tell versions [3.59,3.63) of GNU make to not export all variables.
--
2.55.0
More information about the Libstdc++
mailing list