From c362a260ca203207309cf77a3928854cabf2ac01 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Wed, 11 Mar 2026 21:05:13 +0000 Subject: [PATCH] libstdc++: Add module initialization functions to the library [PR124268] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This ensures that the module init functions are present in libstdc++.so and libstdc++.a, so that users of the std and std.compat modules don't need to manually link to std.o and/or std.compat.o in addition to compiling the CMIs. This also adds a clean-local target to remove the generated interface units and manifest, and the gcm.cache directory for the CMIs. libstdc++-v3/ChangeLog: PR libstdc++/124268 * config/abi/pre/gnu.ver: Export symbols. * src/Makefile.am: Add libmodulesconvenience.la to libstdc++ link. * src/Makefile.in: Regenerate. * src/c++23/Makefile.am: Create libmodulesconvenience.la and populate it with std.o and std.compat.o interface units. Add clean-local target. * src/c++23/Makefile.in: Regenerate. Reviewed-by: Tomasz KamiƄski --- libstdc++-v3/config/abi/pre/gnu.ver | 4 +++ libstdc++-v3/src/Makefile.am | 6 ++-- libstdc++-v3/src/Makefile.in | 6 ++-- libstdc++-v3/src/c++23/Makefile.am | 25 +++++++++++-- libstdc++-v3/src/c++23/Makefile.in | 56 +++++++++++++++++++++-------- 5 files changed, 77 insertions(+), 20 deletions(-) diff --git a/libstdc++-v3/config/abi/pre/gnu.ver b/libstdc++-v3/config/abi/pre/gnu.ver index fb968e122d8..323fff28c25 100644 --- a/libstdc++-v3/config/abi/pre/gnu.ver +++ b/libstdc++-v3/config/abi/pre/gnu.ver @@ -2592,6 +2592,10 @@ GLIBCXX_3.4.35 { _ZSt15__get_once_callv; #endif + # Module inititialization symbols for std and std.compat modules. + _ZGIW3std; + _ZGIW3stdW6compat; + } GLIBCXX_3.4.34; # Symbols in the support library (libsupc++) have their own tag. diff --git a/libstdc++-v3/src/Makefile.am b/libstdc++-v3/src/Makefile.am index 55a8c88a0e1..35a497a1588 100644 --- a/libstdc++-v3/src/Makefile.am +++ b/libstdc++-v3/src/Makefile.am @@ -145,7 +145,8 @@ libstdc___la_LIBADD = \ $(top_builddir)/src/c++98/libc++98convenience.la \ $(top_builddir)/src/c++11/libc++11convenience.la \ $(top_builddir)/src/c++17/libc++17convenience.la \ - $(top_builddir)/src/c++20/libc++20convenience.la + $(top_builddir)/src/c++20/libc++20convenience.la \ + $(top_builddir)/src/c++23/libmodulesconvenience.la libstdc___la_DEPENDENCIES = \ ${version_dep} \ @@ -153,7 +154,8 @@ libstdc___la_DEPENDENCIES = \ $(top_builddir)/src/c++98/libc++98convenience.la \ $(top_builddir)/src/c++11/libc++11convenience.la \ $(top_builddir)/src/c++17/libc++17convenience.la \ - $(top_builddir)/src/c++20/libc++20convenience.la + $(top_builddir)/src/c++20/libc++20convenience.la \ + $(top_builddir)/src/c++23/libmodulesconvenience.la if ENABLE_DARWIN_AT_RPATH libstdc___darwin_rpath = -Wc,-nodefaultrpaths diff --git a/libstdc++-v3/src/Makefile.in b/libstdc++-v3/src/Makefile.in index f0ad019a71f..811d0a5ce4a 100644 --- a/libstdc++-v3/src/Makefile.in +++ b/libstdc++-v3/src/Makefile.in @@ -555,7 +555,8 @@ libstdc___la_LIBADD = \ $(top_builddir)/src/c++98/libc++98convenience.la \ $(top_builddir)/src/c++11/libc++11convenience.la \ $(top_builddir)/src/c++17/libc++17convenience.la \ - $(top_builddir)/src/c++20/libc++20convenience.la + $(top_builddir)/src/c++20/libc++20convenience.la \ + $(top_builddir)/src/c++23/libmodulesconvenience.la libstdc___la_DEPENDENCIES = \ ${version_dep} \ @@ -563,7 +564,8 @@ libstdc___la_DEPENDENCIES = \ $(top_builddir)/src/c++98/libc++98convenience.la \ $(top_builddir)/src/c++11/libc++11convenience.la \ $(top_builddir)/src/c++17/libc++17convenience.la \ - $(top_builddir)/src/c++20/libc++20convenience.la + $(top_builddir)/src/c++20/libc++20convenience.la \ + $(top_builddir)/src/c++23/libmodulesconvenience.la @ENABLE_DARWIN_AT_RPATH_TRUE@libstdc___darwin_rpath = \ @ENABLE_DARWIN_AT_RPATH_TRUE@ -Wc,-nodefaultrpaths \ diff --git a/libstdc++-v3/src/c++23/Makefile.am b/libstdc++-v3/src/c++23/Makefile.am index b031ec69576..019241b884d 100644 --- a/libstdc++-v3/src/c++23/Makefile.am +++ b/libstdc++-v3/src/c++23/Makefile.am @@ -23,10 +23,13 @@ include $(top_srcdir)/fragment.am # Convenience library for C++23 runtime. -noinst_LTLIBRARIES = libc++23convenience.la +# This libc++23convenience.la one isn't linked into libstdc++.la yet, +# so build an additional libmodulesconvenience.la which is linked in. +noinst_LTLIBRARIES = libc++23convenience.la libmodulesconvenience.la -# Module std support. Not compiled for now, only installed. +# Module std support. # Let's install the interface units in the bits subdirectory. +# We also compile them and include them in libmodulesconvenience.la toolexeclib_DATA = libstdc++.modules.json includebitsdir = $(gxx_include_dir)/bits includebits_DATA = std.cc std.compat.cc @@ -59,6 +62,9 @@ stamp-modules-bits: $(includebits_DATA) all-local: stamp-module-manifest stamp-modules-bits +clean-local: + rm -rf stamp* libstdc++.modules.json std.cc std.compat.cc gcm.cache + headers = if ENABLE_EXTERN_TEMPLATE @@ -80,12 +86,27 @@ else libc__23convenience_la_SOURCES = endif +libmodulesconvenience_la_SOURCES = std.cc std.compat.cc + # Use C++26 so that std::filebuf::native_handle() is available. print.lo: print.cc $(LTCXXCOMPILE) -std=gnu++26 -c $< print.o: print.cc $(CXXCOMPILE) -std=gnu++26 -c $< +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 + $(LTCXXCOMPILE) $(MODULES_FLAGS) -c $< +std.o: std.cc + $(CXXCOMPILE) $(MODULES_FLAGS) -c $< +std.compat.lo: std.compat.cc std.lo + $(LTCXXCOMPILE) $(MODULES_FLAGS) -c $< +std.compat.o: std.compat.cc std.o + $(CXXCOMPILE) $(MODULES_FLAGS) -c $< + # AM_CXXFLAGS needs to be in each subdirectory so that it can be # modified in a per-library or per-sub-library way. Need to manually # set this option because CONFIG_CXXFLAGS has to be after diff --git a/libstdc++-v3/src/c++23/Makefile.in b/libstdc++-v3/src/c++23/Makefile.in index fd9110ab8ad..ac3830f569f 100644 --- a/libstdc++-v3/src/c++23/Makefile.in +++ b/libstdc++-v3/src/c++23/Makefile.in @@ -133,6 +133,10 @@ AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = +libmodulesconvenience_la_LIBADD = +am_libmodulesconvenience_la_OBJECTS = std.lo std.compat.lo +libmodulesconvenience_la_OBJECTS = \ + $(am_libmodulesconvenience_la_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false @@ -159,7 +163,8 @@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = -SOURCES = $(libc__23convenience_la_SOURCES) +SOURCES = $(libc__23convenience_la_SOURCES) \ + $(libmodulesconvenience_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ @@ -457,10 +462,13 @@ WARN_CXXFLAGS = \ AM_CPPFLAGS = $(GLIBCXX_INCLUDES) $(CPPFLAGS) # Convenience library for C++23 runtime. -noinst_LTLIBRARIES = libc++23convenience.la +# This libc++23convenience.la one isn't linked into libstdc++.la yet, +# so build an additional libmodulesconvenience.la which is linked in. +noinst_LTLIBRARIES = libc++23convenience.la libmodulesconvenience.la -# Module std support. Not compiled for now, only installed. +# Module std support. # Let's install the interface units in the bits subdirectory. +# We also compile them and include them in libmodulesconvenience.la toolexeclib_DATA = libstdc++.modules.json includebitsdir = $(gxx_include_dir)/bits includebits_DATA = std.cc std.compat.cc @@ -473,6 +481,10 @@ headers = sources = stacktrace.cc print.cc @GLIBCXX_HOSTED_FALSE@libc__23convenience_la_SOURCES = @GLIBCXX_HOSTED_TRUE@libc__23convenience_la_SOURCES = $(sources) $(inst_sources) +libmodulesconvenience_la_SOURCES = std.cc std.compat.cc +MODULES_FLAGS = -isystem ${glibcxx_srcdir}/include/backward -fmodules \ + -Wno-unknown-pragmas + # AM_CXXFLAGS needs to be in each subdirectory so that it can be # modified in a per-library or per-sub-library way. Need to manually @@ -586,6 +598,9 @@ clean-noinstLTLIBRARIES: libc++23convenience.la: $(libc__23convenience_la_OBJECTS) $(libc__23convenience_la_DEPENDENCIES) $(EXTRA_libc__23convenience_la_DEPENDENCIES) $(AM_V_CXXLD)$(CXXLINK) $(libc__23convenience_la_OBJECTS) $(libc__23convenience_la_LIBADD) $(LIBS) +libmodulesconvenience.la: $(libmodulesconvenience_la_OBJECTS) $(libmodulesconvenience_la_DEPENDENCIES) $(EXTRA_libmodulesconvenience_la_DEPENDENCIES) + $(AM_V_CXXLD)$(CXXLINK) $(libmodulesconvenience_la_OBJECTS) $(libmodulesconvenience_la_LIBADD) $(LIBS) + mostlyclean-compile: -rm -f *.$(OBJEXT) @@ -739,8 +754,8 @@ maintainer-clean-generic: @echo "it deletes files that may require special tools to rebuild." clean: clean-am -clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ - mostlyclean-am +clean-am: clean-generic clean-libtool clean-local \ + clean-noinstLTLIBRARIES mostlyclean-am distclean: distclean-am -rm -f Makefile @@ -809,15 +824,15 @@ uninstall-am: uninstall-includebitsDATA uninstall-toolexeclibDATA .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am all-local check check-am clean \ - clean-generic clean-libtool clean-noinstLTLIBRARIES \ - cscopelist-am ctags ctags-am distclean distclean-compile \ - distclean-generic distclean-libtool distclean-tags dvi dvi-am \ - html html-am info info-am install install-am install-data \ - install-data-am install-dvi install-dvi-am install-exec \ - install-exec-am install-html install-html-am \ - install-includebitsDATA install-info install-info-am \ - install-man install-pdf install-pdf-am install-ps \ - install-ps-am install-strip install-toolexeclibDATA \ + clean-generic clean-libtool clean-local \ + clean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags dvi dvi-am html html-am info info-am install \ + install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-includebitsDATA install-info \ + install-info-am install-man install-pdf install-pdf-am \ + install-ps install-ps-am install-strip install-toolexeclibDATA \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ @@ -855,6 +870,9 @@ stamp-modules-bits: $(includebits_DATA) all-local: stamp-module-manifest stamp-modules-bits +clean-local: + rm -rf stamp* libstdc++.modules.json std.cc std.compat.cc gcm.cache + vpath % $(top_srcdir)/src/c++23 # Use C++26 so that std::filebuf::native_handle() is available. @@ -863,6 +881,16 @@ print.lo: print.cc print.o: print.cc $(CXXCOMPILE) -std=gnu++26 -c $< +# These go into libmodulesconvenience.la and are linked into libstdc++ +std.lo: std.cc + $(LTCXXCOMPILE) $(MODULES_FLAGS) -c $< +std.o: std.cc + $(CXXCOMPILE) $(MODULES_FLAGS) -c $< +std.compat.lo: std.compat.cc std.lo + $(LTCXXCOMPILE) $(MODULES_FLAGS) -c $< +std.compat.o: std.compat.cc std.o + $(CXXCOMPILE) $(MODULES_FLAGS) -c $< + # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: