1## Makefile for the C++11 sources of the GNU C++ Standard library. 2## 3## Copyright (C) 1997-2020 Free Software Foundation, Inc. 4## 5## This file is part of the libstdc++ version 3 distribution. 6## Process this file with automake to produce Makefile.in. 7 8## This file is part of the GNU ISO C++ Library. This library is free 9## software; you can redistribute it and/or modify it under the 10## terms of the GNU General Public License as published by the 11## Free Software Foundation; either version 3, or (at your option) 12## any later version. 13 14## This library is distributed in the hope that it will be useful, 15## but WITHOUT ANY WARRANTY; without even the implied warranty of 16## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17## GNU General Public License for more details. 18 19## You should have received a copy of the GNU General Public License along 20## with this library; see the file COPYING3. If not see 21## <http://www.gnu.org/licenses/>. 22 23include $(top_srcdir)/fragment.am 24 25if ENABLE_FILESYSTEM_TS 26filesystem_dir = filesystem 27else 28filesystem_dir = 29endif 30 31## Keep this list sync'd with acinclude.m4:GLIBCXX_CONFIGURE. 32SUBDIRS = c++98 c++11 c++17 $(filesystem_dir) 33 34# Cross compiler support. 35if VTV_CYGMIN 36toolexeclib_LTLIBRARIES = libvtv.la libstdc++.la 37else 38toolexeclib_LTLIBRARIES = libstdc++.la 39endif 40 41if VTV_CYGMIN 42vtv_stubs.cc: 43 rm -f $@ 44 $(LN_S) $(toplevel_srcdir)/libstdc++-v3/libsupc++/vtv_stubs.cc $@ 45 46libvtv_la_SOURCES = vtv_stubs.cc 47libvtv_la_LDFLAGS = $(lt_host_flags) 48 49libvtv_la_AM_CXXFLAGS = \ 50 $(glibcxx_compiler_pic_flag) \ 51 $(XTEMPLATE_FLAGS) \ 52 -Wl,-u_vtable_map_vars_start,-u_vtable_map_vars_end \ 53 $(WARN_CXXFLAGS) $(OPTIMIZE_CXXFLAGS) $(CONFIG_CXXFLAGS) 54 55libvtv_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ 56 $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(libvtv_la_AM_CXXFLAGS) \ 57 $(CXXFLAGS) $(libvtv_la_LDFLAGS) $(LDFLAGS) -o $@ 58endif 59 60vpath % $(top_srcdir)/src/c++98 61vpath % $(top_srcdir)/src/c++11 62vpath % $(top_srcdir)/src/c++17 63if ENABLE_FILESYSTEM_TS 64vpath % $(top_srcdir)/src/filesystem 65endif 66 67if GLIBCXX_LDBL_COMPAT 68ldbl_compat_sources = compatibility-ldbl.cc 69else 70ldbl_compat_sources = 71endif 72 73 74parallel_compat_sources = \ 75 compatibility-parallel_list.cc compatibility-parallel_list-2.cc 76 77 78cxx98_sources = \ 79 compatibility.cc \ 80 compatibility-debug_list.cc \ 81 compatibility-debug_list-2.cc \ 82 ${ldbl_compat_sources} 83 84cxx11_sources = \ 85 compatibility-c++0x.cc \ 86 compatibility-atomic-c++0x.cc \ 87 compatibility-thread-c++0x.cc \ 88 compatibility-chrono.cc \ 89 compatibility-condvar.cc 90 91libstdc___la_SOURCES = $(cxx98_sources) $(cxx11_sources) 92 93libstdc___la_LIBADD = \ 94 $(GLIBCXX_LIBS) \ 95 $(top_builddir)/libsupc++/libsupc++convenience.la \ 96 $(top_builddir)/src/c++98/libc++98convenience.la \ 97 $(top_builddir)/src/c++11/libc++11convenience.la \ 98 $(top_builddir)/src/c++17/libc++17convenience.la 99 100libstdc___la_DEPENDENCIES = \ 101 ${version_dep} \ 102 $(top_builddir)/libsupc++/libsupc++convenience.la \ 103 $(top_builddir)/src/c++98/libc++98convenience.la \ 104 $(top_builddir)/src/c++11/libc++11convenience.la \ 105 $(top_builddir)/src/c++17/libc++17convenience.la 106 107libstdc___la_LDFLAGS = \ 108 -version-info $(libtool_VERSION) ${version_arg} -lm 109 110libstdc___la_LINK = $(CXXLINK) $(libstdc___la_LDFLAGS) 111 112# Use special rules for compatibility-ldbl.cc compilation, as we need to 113# pass -mlong-double-64. 114if GLIBCXX_LDBL_COMPAT 115compatibility-ldbl.lo: compatibility-ldbl.cc 116 $(LTCXXCOMPILE) $(LONG_DOUBLE_COMPAT_FLAGS) -c $< 117compatibility-ldbl.o: compatibility-ldbl.cc 118 $(CXXCOMPILE) $(LONG_DOUBLE_COMPAT_FLAGS) -c $< 119endif 120 121# Use special rules for C++11 files/objects. 122compatibility-c++0x.lo: compatibility-c++0x.cc 123 $(LTCXXCOMPILE) -std=gnu++11 -c $< 124compatibility-c++0x.o: compatibility-c++0x.cc 125 $(CXXCOMPILE) -std=gnu++11 -c $< 126 127compatibility-atomic-c++0x.lo: compatibility-atomic-c++0x.cc 128 $(LTCXXCOMPILE) -std=gnu++11 -c $< 129compatibility-atomic-c++0x.o: compatibility-atomic-c++0x.cc 130 $(CXXCOMPILE) -std=gnu++11 -c $< 131 132compatibility-thread-c++0x.lo: compatibility-thread-c++0x.cc 133 $(LTCXXCOMPILE) -std=gnu++11 -c $< 134compatibility-thread-c++0x.o: compatibility-thread-c++0x.cc 135 $(CXXCOMPILE) -std=gnu++11 -c $< 136 137compatibility-chrono.lo: compatibility-chrono.cc 138 $(LTCXXCOMPILE) -std=gnu++11 -c $< 139compatibility-chrono.o: compatibility-chrono.cc 140 $(CXXCOMPILE) -std=gnu++11 -c $< 141 142compatibility-condvar.lo: compatibility-condvar.cc 143 $(LTCXXCOMPILE) -std=gnu++11 -c $< 144compatibility-condvar.o: compatibility-condvar.cc 145 $(CXXCOMPILE) -std=gnu++11 -c $< 146 147# A note on compatibility and static libraries. 148# 149# static lib == linked against only this version, should not need compat 150# shared lib == linked against potentially all compat versions 151# 152# Thus, the shared libs have more compat symbols, which can be found 153# segregated in the sources with -D_GLIBCXX_SHARED. 154# 155# In the sub-directories of libsupc++, src/c++98, src/c++11, src/c++17, 156# only -prefer-pic objects are generated for the convenience libraries. 157# 158# In the main src directory, make shared and static objects just for 159# the compat libraries. Shared objects are compiled with -prefer-pic 160# -D_GLIBCXX_SHARED and in the .libs sub-directory, static objects are 161# compiled with -prefer-pic (ie, -fPIC but not -D_GLIBCXX_SHARED) and 162# the main src directory. 163# 164# Why are objects destined for libstdc++.a compiled with -fPIC? First, 165# because -fPIC is not harmful to use for objects destined for static 166# libraries. In addition, using -fPIC will allow the use of static 167# libstdc++.a in the creation of other C++ shared libraries. 168 169# AM_CXXFLAGS needs to be in each sub-directory so that it can be 170# modified in a per-library or per-sub-library way. Need to manually 171# set this option because CONFIG_CXXFLAGS has to be after 172# OPTIMIZE_CXXFLAGS on the compile line so that -O2 can be overridden 173# as the occasion calls for it. 174AM_CXXFLAGS = \ 175 -std=gnu++98 \ 176 $(glibcxx_compiler_pic_flag) \ 177 $(XTEMPLATE_FLAGS) $(VTV_CXXFLAGS) \ 178 $(WARN_CXXFLAGS) $(OPTIMIZE_CXXFLAGS) $(CONFIG_CXXFLAGS) 179 180# Libtool notes 181 182# 1) In general, libtool expects an argument such as `--tag=CXX' when 183# using the C++ compiler, because that will enable the settings 184# detected when C++ support was being configured. However, when no 185# such flag is given in the command line, libtool attempts to figure 186# it out by matching the compiler name in each configuration section 187# against a prefix of the command line. The problem is that, if the 188# compiler name and its initial flags stored in the libtool 189# configuration file don't match those in the command line, libtool 190# can't decide which configuration to use, and it gives up. The 191# correct solution is to add `--tag CXX' to LTCXXCOMPILE and maybe 192# CXXLINK, just after $(LIBTOOL), so that libtool doesn't have to 193# attempt to infer which configuration to use. 194# 195# The second tag argument, `--tag disable-shared` means that libtool 196# only compiles each source once, for static objects. In actuality, 197# glibcxx_lt_pic_flag and glibcxx_compiler_shared_flag are added to 198# the libtool command that is used create the object, which is 199# suitable for shared libraries. The `--tag disable-shared` must be 200# placed after --tag CXX lest things CXX undo the affect of 201# disable-shared. 202 203# 2) Need to explicitly set LTCXXCOMPILE so that EXTRA_CXX_FLAGS is 204# last. (That way, things like -O2 passed down from the toplevel can 205# be overridden by --enable-debug and --enable-cxx-flags.) 206LTCXXCOMPILE = \ 207 $(LIBTOOL) --tag CXX \ 208 $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ 209 --mode=compile $(CXX) $(INCLUDES) \ 210 $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) $(EXTRA_CXX_FLAGS) 211 212LTLDFLAGS = $(shell $(SHELL) $(top_srcdir)/../libtool-ldflags $(LDFLAGS)) 213 214# 3) We'd have a problem when building the shared libstdc++ object if 215# the rules automake generates would be used. We cannot allow g++ to 216# be used since this would add -lstdc++ to the link line which of 217# course is problematic at this point. So, we get the top-level 218# directory to configure libstdc++-v3 to use gcc as the C++ 219# compilation driver. 220CXXLINK = \ 221 $(LIBTOOL) --tag CXX \ 222 $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ 223 --mode=link $(CXX) \ 224 $(VTV_CXXLINKFLAGS) \ 225 $(OPT_LDFLAGS) $(SECTION_LDFLAGS) $(AM_CXXFLAGS) \ 226 $(LTLDFLAGS) $(LTLIBICONV) \ 227 -o $@ 228 229# Symbol versioning for shared libraries. 230if ENABLE_SYMVERS 231libstdc++-symbols.ver: ${glibcxx_srcdir}/$(SYMVER_FILE) \ 232 $(port_specific_symbol_files) 233 cp ${glibcxx_srcdir}/$(SYMVER_FILE) $@.tmp 234 chmod +w $@.tmp 235 if test "x$(port_specific_symbol_files)" != x; then \ 236 if grep '^# Appended to version file.' \ 237 $(port_specific_symbol_files) > /dev/null 2>&1; then \ 238 cat $(port_specific_symbol_files) >> $@.tmp; \ 239 else \ 240 sed -n '1,/DO NOT DELETE/p' $@.tmp > tmp.top; \ 241 sed -n '/DO NOT DELETE/,$$p' $@.tmp > tmp.bottom; \ 242 cat tmp.top $(port_specific_symbol_files) tmp.bottom > $@.tmp; \ 243 rm tmp.top tmp.bottom; \ 244 fi; \ 245 fi 246 $(EGREP) -v '^[ ]*#(#| |$$)' $@.tmp | \ 247 $(CC) -E -P -include $(CONFIG_HEADER) - > $@ || (rm -f $@ ; exit 1) 248 rm -f $@.tmp 249 250CLEANFILES = libstdc++-symbols.ver 251 252if ENABLE_SYMVERS_GNU 253version_arg = -Wl,--version-script=libstdc++-symbols.ver 254version_dep = libstdc++-symbols.ver 255endif 256if ENABLE_SYMVERS_GNU_NAMESPACE 257version_arg = -Wl,--version-script=libstdc++-symbols.ver 258version_dep = libstdc++-symbols.ver 259endif 260if ENABLE_SYMVERS_SUN 261version_arg = -Wl,-M,libstdc++-symbols.ver-sun 262version_dep = libstdc++-symbols.ver-sun 263libstdc++-symbols.ver-sun : libstdc++-symbols.ver \ 264 $(toplevel_srcdir)/contrib/make_sunver.pl \ 265 $(libstdc___la_OBJECTS) $(libstdc___la_LIBADD) 266 CXXFILT="$(CXXFILT)"; export CXXFILT; \ 267 perl $(toplevel_srcdir)/contrib/make_sunver.pl \ 268 libstdc++-symbols.ver \ 269 $(libstdc___la_OBJECTS:%.lo=.libs/%.o) \ 270 `echo $(libstdc___la_LIBADD) | \ 271 sed 's,/\([^/.]*\)\.la,/.libs/\1.a,g'` \ 272 > $@ || (rm -f $@ ; exit 1) 273endif 274if ENABLE_SYMVERS_DARWIN 275version_arg = -Wl,-exported_symbols_list,libstdc++-symbols.explist 276version_dep = libstdc++-symbols.explist 277libstdc++-symbols.explist : libstdc++-symbols.ver \ 278 ${glibcxx_srcdir}/scripts/make_exports.pl \ 279 $(libstdc___la_OBJECTS) $(libstdc___la_LIBADD) 280 perl ${glibcxx_srcdir}/scripts/make_exports.pl \ 281 libstdc++-symbols.ver \ 282 $(libstdc___la_OBJECTS:%.lo=.libs/%.o) \ 283 `echo $(libstdc___la_LIBADD) | \ 284 sed 's,/\([^/.]*\)\.la,/.libs/\1.a,g'` \ 285 > $@ || (rm -f $@ ; exit 1) 286endif 287 288CLEANFILES += $(version_dep) 289else 290version_arg = 291version_dep = 292endif 293 294 295# Control additional build primary rules. 296all-once: libstdc++convenience.la $(STAMP_DEBUG) 297install-data-once: $(STAMP_INSTALL_DEBUG) 298 299all-local: all-once 300install-data-local: install-data-once 301clean-local: 302 rm -rf libstdc++convenience.la stamp* $(CLEAN_DEBUG) 303 304# Make a non-installed convenience library, so that --disable-static 305# may work. 306libstdc++convenience.la: $(toolexeclib_LTLIBRARIES) 307 $(CXXLINK) $(libstdc___la_LIBADD) $(LIBS); \ 308 if test ! -f .libs/libstdc++.a; then \ 309 cp .libs/libstdc++convenience.a .libs/libstdc++.a; \ 310 fi; \ 311 echo `date` > stamp-libstdc++convenience; 312 313# Added rules. 314# 1 debug library 315# 2 supra-convenience library 316if GLIBCXX_BUILD_DEBUG 317STAMP_DEBUG = build-debug 318STAMP_INSTALL_DEBUG = install-debug 319CLEAN_DEBUG = debug 320else 321STAMP_DEBUG = 322STAMP_INSTALL_DEBUG = 323CLEAN_DEBUG = 324endif 325 326# Build a debug variant. 327# Take care to fix all possibly-relative paths. 328debugdir = ${glibcxx_builddir}/src/debug 329stamp-debug: 330 if test ! -d ${debugdir} || test ! -f ${debugdir}/Makefile ; then \ 331 mkdir -p ${debugdir}; \ 332 for d in $(SUBDIRS); do mkdir -p ${debugdir}/$$d; done; \ 333 (cd ${debugdir}; \ 334 sed -e 's/top_builddir = \.\./top_builddir = ..\/../' \ 335 -e 's/top_build_prefix = \.\./top_build_prefix = ..\/../' \ 336 -e 's/srcdir = \.\./srcdir = ..\/../' \ 337 -e 's/VPATH = \.\./VPATH = ..\/../' \ 338 -e 's/glibcxx_basedir = \.\./glibcxx_basedir = ..\/../' \ 339 -e 's/MKDIR_P = \.\./MKDIR_P = ..\/../' \ 340 < ../Makefile > Makefile ; \ 341 for d in . $(SUBDIRS); do \ 342 sed -e 's/top_builddir = \.\./top_builddir = ..\/../' \ 343 -e 's/top_build_prefix = \.\./top_build_prefix = ..\/../' \ 344 -e 's/srcdir = \.\./srcdir = ..\/../' \ 345 -e 's/VPATH = \.\./VPATH = ..\/../' \ 346 -e 's/glibcxx_basedir = \.\./glibcxx_basedir = ..\/../' \ 347 -e 's/MKDIR_P = \.\./MKDIR_P = ..\/../' \ 348 < ../$$d/Makefile > $$d/Makefile ; \ 349 done) ; \ 350 fi; \ 351 echo `date` > stamp-debug; 352 353build-debug: stamp-debug 354 (cd ${debugdir}; \ 355 mv Makefile Makefile.tmp; \ 356 sed -e 's,all-local: all-once,all-local:,' \ 357 -e 's,install-data-local: install-data-once,install-data-local:,' \ 358 -e '/vpath/!s,src/c,src/debug/c,' \ 359 < Makefile.tmp > Makefile ; \ 360 rm -f Makefile.tmp ; \ 361 $(MAKE) CXXFLAGS='$(DEBUG_FLAGS)' \ 362 toolexeclibdir=$(glibcxx_toolexeclibdir)/debug all) ; 363 364# Install debug library. 365install-debug: build-debug 366 (cd ${debugdir} && $(MAKE) CXXFLAGS='$(DEBUG_FLAGS)' \ 367 toolexeclibdir=$(glibcxx_toolexeclibdir)/debug install) ; 368