[PATCH v2] libstdc++: Do not overwrite module definition files during build [PR126786]
Tomasz Kaminski
tkaminsk@redhat.com
Tue Aug 18 09:04:49 GMT 2026
On Tue, Aug 18, 2026 at 11:02 AM Jonathan Wakely <jwakely@redhat.com> 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 (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
>
I really like having a separate target for empty.cc file, it looks much
clearner.
Thanks LGTM.
>
> 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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://gcc.gnu.org/pipermail/libstdc++/attachments/20260818/09203640/attachment-0001.htm>
More information about the Libstdc++
mailing list