1# Top level -*- makefile -*- fragment for GNU C++. 2# Copyright (C) 1994-2022 Free Software Foundation, Inc. 3 4#This file is part of GCC. 5 6#GCC is free software; you can redistribute it and/or modify 7#it under the terms of the GNU General Public License as published by 8#the Free Software Foundation; either version 3, or (at your option) 9#any later version. 10 11#GCC is distributed in the hope that it will be useful, 12#but WITHOUT ANY WARRANTY; without even the implied warranty of 13#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14#GNU General Public License for more details. 15 16# You should have received a copy of the GNU General Public License 17# along with GCC; see the file COPYING3. If not see 18# <http://www.gnu.org/licenses/>. 19 20# This file provides the language dependent support in the main Makefile. 21# Each language makefile fragment must provide the following targets: 22# 23# foo.all.cross, foo.start.encap, foo.rest.encap, 24# foo.install-common, foo.install-man, foo.install-info, foo.install-pdf, 25# foo.install-html, foo.info, foo.dvi, foo.pdf, foo.html, foo.uninstall, 26# foo.mostlyclean, foo.clean, foo.distclean, 27# foo.maintainer-clean, foo.stage1, foo.stage2, foo.stage3, foo.stage4 28# 29# where `foo' is the name of the language. 30# 31# It should also provide rules for: 32# 33# - making any compiler driver (eg: g++) 34# - the compiler proper (eg: cc1plus) 35# - define the names for selecting the language in LANGUAGES. 36 37# Actual names to use when installing a native compiler. 38CXX_INSTALL_NAME := $(shell echo c++|sed '$(program_transform_name)') 39GXX_INSTALL_NAME := $(shell echo g++|sed '$(program_transform_name)') 40CXX_TARGET_INSTALL_NAME := $(target_noncanonical)-$(shell echo c++|sed '$(program_transform_name)') 41GXX_TARGET_INSTALL_NAME := $(target_noncanonical)-$(shell echo g++|sed '$(program_transform_name)') 42CP_PLUGIN_HEADERS := cp-tree.h cxx-pretty-print.h name-lookup.h type-utils.h operators.def 43 44# 45# Define the names for selecting c++ in LANGUAGES. 46# Note that it would be nice to move the dependency on g++ 47# into the C++ rule, but that needs a little bit of work 48# to do the right thing within all.cross. 49c++: cc1plus$(exeext) 50c++.serial = cc1plus$(exeext) 51 52# Tell GNU make to ignore these if they exist. 53.PHONY: c++ 54 55CFLAGS-cp/g++spec.o += $(DRIVER_DEFINES) 56 57CFLAGS-cp/module.o += -DHOST_MACHINE=\"$(host)\" \ 58 -DTARGET_MACHINE=\"$(target)\" 59 60# In non-release builds, use a date-related module version. 61ifneq ($(DEVPHASE_c),) 62# Some date's don't grok 'r', if so, simply use today's date, 63# but use date from previous stage if bootstrapping to avoid breaking 64# bootstraps across midnight. 65s-cp-module-version: $(srcdir)/cp/module.cc 66 MODULE_VERSION=`if date -r $(srcdir)/cp/module.cc '+%y%m%d%H%MU' \ 67 2>/dev/null; then :; \ 68 elif test ../prev-gcc/s-cp-module-version -nt \ 69 $(srcdir)/cp/module.cc; then \ 70 cat ../prev-gcc/s-cp-module-version; \ 71 else \ 72 date '+%y%m%d0000U' 2>/dev/null; \ 73 fi`; \ 74 echo $${MODULE_VERSION} > s-cp-module-version 75cp/module.o: s-cp-module-version 76CFLAGS-cp/module.o += -DMODULE_VERSION='$(shell cat s-cp-module-version)' 77endif 78 79# Create the compiler driver for g++. 80GXX_OBJS = $(GCC_OBJS) cp/g++spec.o 81xg++$(exeext): $(GXX_OBJS) $(EXTRA_GCC_OBJS) libcommon-target.a $(LIBDEPS) 82 +$(LINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ 83 $(GXX_OBJS) $(EXTRA_GCC_OBJS) libcommon-target.a \ 84 $(EXTRA_GCC_LIBS) $(LIBS) 85 86# Create a version of the g++ driver which calls the cross-compiler. 87g++-cross$(exeext): xg++$(exeext) 88 -rm -f g++-cross$(exeext) 89 cp xg++$(exeext) g++-cross$(exeext) 90 91# The compiler itself. 92# Shared with C front end: 93CXX_C_OBJS = attribs.o incpath.o \ 94 $(C_COMMON_OBJS) $(CXX_TARGET_OBJS) 95 96# Language-specific object files for C++ and Objective C++. 97CXX_AND_OBJCXX_OBJS = \ 98 cp/call.o cp/class.o cp/constexpr.o cp/constraint.o \ 99 cp/coroutines.o cp/cp-gimplify.o \ 100 cp/cp-objcp-common.o cp/cp-ubsan.o \ 101 cp/cvt.o cp/cxx-pretty-print.o \ 102 cp/decl.o cp/decl2.o cp/dump.o \ 103 cp/error.o cp/except.o cp/expr.o \ 104 cp/friend.o cp/init.o \ 105 cp/lambda.o cp/lex.o cp/logic.o \ 106 cp/mangle.o cp/mapper-client.o cp/mapper-resolver.o \ 107 cp/method.o cp/module.o \ 108 cp/name-lookup.o cp/optimize.o \ 109 cp/parser.o cp/pt.o cp/ptree.o \ 110 cp/rtti.o \ 111 cp/search.o cp/semantics.o \ 112 cp/tree.o cp/typeck.o cp/typeck2.o \ 113 cp/vtable-class-hierarchy.o $(CXX_C_OBJS) 114 115ifeq ($(if $(wildcard ../stage_current),$(shell cat \ 116 ../stage_current)),stageautofeedback) 117$(CXX_AND_OBJCXX_OBJS): CFLAGS += -fauto-profile=cc1plus.fda 118$(CXX_AND_OBJCXX_OBJS): cc1plus.fda 119endif 120 121# Language-specific object files for C++. 122CXX_OBJS = cp/cp-lang.o c-family/stub-objc.o $(CXX_AND_OBJCXX_OBJS) 123 124c++_OBJS = $(CXX_OBJS) cc1plus-checksum.o cp/g++spec.o 125 126# Use strict warnings for this front end. 127cp-warn = $(STRICT_WARN) 128 129# compute checksum over all object files and the options 130# re-use the checksum from the prev-final stage so it passes 131# the bootstrap comparison and allows comparing of the cc1 binary 132cc1plus-checksum.cc : build/genchecksum$(build_exeext) checksum-options \ 133 $(CXX_OBJS) $(BACKEND) $(CODYLIB) $(LIBDEPS) 134 if [ -f ../stage_final ] \ 135 && cmp -s ../stage_current ../stage_final; then \ 136 cp ../prev-gcc/cc1plus-checksum.cc cc1plus-checksum.cc; \ 137 else \ 138 build/genchecksum$(build_exeext) $(CXX_OBJS) $(BACKEND) $(CODYLIB) $(LIBDEPS) \ 139 checksum-options > cc1plus-checksum.cc.tmp && \ 140 $(SHELL) $(srcdir)/../move-if-change cc1plus-checksum.cc.tmp cc1plus-checksum.cc; \ 141 fi 142 143cc1plus$(exeext): $(CXX_OBJS) cc1plus-checksum.o $(BACKEND) $(CODYLIB) $(LIBDEPS) $(c++.prev) 144 @$(call LINK_PROGRESS,$(INDEX.c++),start) 145 +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ 146 $(CXX_OBJS) cc1plus-checksum.o $(BACKEND) $(CODYLIB) $(NETLIBS) \ 147 $(LIBS) $(BACKENDLIBS) 148 @$(call LINK_PROGRESS,$(INDEX.c++),end) 149 150ifeq ($(ENABLE_MAINTAINER_RULES), true) 151# Special build rule. This is a maintainer rule, that is only 152# available when GCC is configured with --enable-maintainer-mode. In 153# other cases, it is not available to avoid triggering rebuilds if a 154# user has the source checked out with unusual timestamps. 155$(srcdir)/cp/cfns.h: $(srcdir)/cp/cfns.gperf 156 @echo "NOT REBUILDING $@" 157NetBSD_DISABLED_cfns.h: 158else 159# We keep the rule so that you can still force a rebuild, even if you 160# didn't configure GCC with --enable-maintainer-mode, by manually 161# deleting the $(srcdir)/cp/cfns.h file. 162$(srcdir)/cp/cfns.h: 163endif 164 gperf -o -C -E -k '1-6,$$' -j1 -D -N 'libc_name_p' -L C++ \ 165 $(srcdir)/cp/cfns.gperf --output-file $(srcdir)/cp/cfns.h 166 167cc1plus.fda: ../stage1-gcc/cc1plus$(exeext) ../prev-gcc/$(PERF_DATA) 168 $(CREATE_GCOV) -binary ../stage1-gcc/cc1plus$(exeext) -gcov cc1plus.fda -profile ../prev-gcc/$(PERF_DATA) -gcov_version 1 169 170# 171# Build hooks: 172 173c++.all.cross: g++-cross$(exeext) 174c++.start.encap: xg++$(exeext) 175c++.rest.encap: 176c++.info: 177c++.install-info: 178c++.dvi: 179c++.install-dvi: 180c++.pdf: 181c++.install-pdf: 182c++.install-html: 183c++.html: 184c++.srcinfo: 185c++.srcextra: 186 187c++.tags: force 188 cd $(srcdir)/cp; $(ETAGS) -o TAGS.sub *.c *.cc *.h --language=none \ 189 --regex='/DEFTREECODE [(]\([A-Z_]+\)/\1/' cp-tree.def; \ 190 $(ETAGS) --include TAGS.sub --include ../TAGS.sub 191 192c++.man: doc/g++.1 193 194c++.srcman: doc/g++.1 195 -cp -p $^ $(srcdir)/doc 196 197# C++ selftests 198 199# If C++ is enabled, require the selftests to be run for it 200# at each stage of the build: 201selftest-c++: s-selftest-c++ 202 203CPP_SELFTEST_DEPS = cc1plus$(exeext) $(SELFTEST_DEPS) 204CPP_SELFTEST_FLAGS = -xc++ $(SELFTEST_FLAGS) 205 206# Run the C++ selftests 207s-selftest-c++: $(CPP_SELFTEST_DEPS) 208 $(GCC_FOR_TARGET) $(CPP_SELFTEST_FLAGS) 209 $(STAMP) $@ 210 211# Convenience method for running C++ selftests under gdb: 212.PHONY: selftest-c++-gdb 213selftest-c++-gdb: $(CPP_SELFTEST_DEPS) 214 $(GCC_FOR_TARGET) $(CPP_SELFTEST_FLAGS) \ 215 -wrapper gdb,--args 216 217# Convenience method for running C++ selftests under valgrind: 218.PHONY: selftest-c++-valgrind 219selftest-c++-valgrind: $(CPP_SELFTEST_DEPS) 220 $(GCC_FOR_TARGET) $(CPP_SELFTEST_FLAGS) \ 221 -wrapper valgrind,--leak-check=full 222 223# 'make check' in gcc/ looks for check-c++, as do all toplevel C++-related 224# check targets. However, our DejaGNU framework requires 'check-g++' as its 225# entry point. We feed the former to the latter here. 226check-c++ : check-g++ 227 228# Run the testsuite in C++17 mode. 229check-c++1z: check-c++17 230check-c++17: 231 $(MAKE) RUNTESTFLAGS="$(RUNTESTFLAGS)" GXX_TESTSUITE_STDS=17 check-g++ 232 233# Run the testsuite in all standard conformance levels. 234check-c++-all: 235 $(MAKE) RUNTESTFLAGS="$(RUNTESTFLAGS) --stds=98,11,14,17,20,23,impcx" check-g++ 236 237# Run the testsuite with garbage collection at every opportunity. 238check-g++-strict-gc: 239 $(MAKE) RUNTESTFLAGS="$(RUNTESTFLAGS) --extra_opts,--param,ggc-min-heapsize=0,--param,ggc-min-expand=0,--param,hash-table-verification-limit=10000" \ 240 TESTSUITEDIR="$(TESTSUITEDIR).gc" check-g++ 241check-c++-subtargets : check-g++-subtargets 242# List of targets that can use the generic check- rule and its // variant. 243lang_checks += check-g++ 244lang_checks_parallelized += check-g++ 245# For description see the check_$lang_parallelize comment in gcc/Makefile.in. 246check_g++_parallelize = 10000 247# 248# Install hooks: 249# cc1plus is installed elsewhere as part of $(COMPILERS). 250 251# Install the driver program as $(target)-g++ and $(target)-c++, and 252# also as g++ and c++ if native. 253c++.install-common: installdirs 254 -if test "$(enable_as_accelerator)" != "yes" ; then \ 255 rm -f $(DESTDIR)$(bindir)/$(GXX_INSTALL_NAME)$(exeext); \ 256 $(INSTALL_PROGRAM) xg++$(exeext) $(DESTDIR)$(bindir)/$(GXX_INSTALL_NAME)$(exeext); \ 257 chmod a+x $(DESTDIR)$(bindir)/$(GXX_INSTALL_NAME)$(exeext); \ 258 rm -f $(DESTDIR)$(bindir)/$(CXX_INSTALL_NAME)$(exeext); \ 259 ( cd $(DESTDIR)$(bindir) && \ 260 $(LN) $(GXX_INSTALL_NAME)$(exeext) $(CXX_INSTALL_NAME)$(exeext) ); \ 261 if [ -f cc1plus$(exeext) ] ; then \ 262 if [ ! -f g++-cross$(exeext) ] ; then \ 263 rm -f $(DESTDIR)$(bindir)/$(GXX_TARGET_INSTALL_NAME)$(exeext); \ 264 ( cd $(DESTDIR)$(bindir) && \ 265 $(LN) $(GXX_INSTALL_NAME)$(exeext) $(GXX_TARGET_INSTALL_NAME)$(exeext) ); \ 266 rm -f $(DESTDIR)$(bindir)/$(CXX_TARGET_INSTALL_NAME)$(exeext); \ 267 ( cd $(DESTDIR)$(bindir) && \ 268 $(LN) $(CXX_INSTALL_NAME)$(exeext) $(CXX_TARGET_INSTALL_NAME)$(exeext) ); \ 269 fi ; \ 270 fi; \ 271 fi 272 273# We can't use links because not everyone supports them. So just copy the 274# manpage. 275doc/g++.1: doc/gcc.1 276 cp $< doc/g++.1 277 278c++.install-man: $(DESTDIR)$(man1dir)/$(GXX_INSTALL_NAME)$(man1ext) 279 280$(DESTDIR)$(man1dir)/$(GXX_INSTALL_NAME)$(man1ext): doc/g++.1 installdirs 281 -rm -f $@ 282 -$(INSTALL_DATA) $< $@ 283 -chmod a-x $@ 284 285c++.install-plugin: installdirs 286# We keep the directory structure for files in config and .def files. All 287# other files are flattened to a single directory. 288 headers="$(CP_PLUGIN_HEADERS)"; \ 289 for file in $$headers; do \ 290 path=$(srcdir)/cp/$$file; \ 291 dest=$(plugin_includedir)/cp/$$file; \ 292 echo $(INSTALL_DATA) $$path $(DESTDIR)$$dest; \ 293 dir=`dirname $$dest`; \ 294 $(mkinstalldirs) $(DESTDIR)$$dir; \ 295 $(INSTALL_DATA) $$path $(DESTDIR)$$dest; \ 296 done 297# Install import library. 298ifeq ($(plugin_implib),yes) 299 $(mkinstalldirs) $(DESTDIR)$(plugin_resourcesdir) 300 $(INSTALL_DATA) cc1plus$(exeext).a $(DESTDIR)/$(plugin_resourcesdir)/cc1plus$(exeext).a 301endif 302 303c++.uninstall: 304 -rm -rf $(DESTDIR)$(bindir)/$(CXX_INSTALL_NAME)$(exeext) 305 -rm -rf $(DESTDIR)$(bindir)/$(GXX_INSTALL_NAME)$(exeext) 306 -rm -rf $(DESTDIR)$(man1dir)/$(GXX_INSTALL_NAME)$(man1ext) 307# 308# Clean hooks: 309# A lot of the ancillary files are deleted by the main makefile. 310# We just have to delete files specific to us. 311 312c++.mostlyclean: 313 -rm -f doc/g++.1 314 -rm -f cp/*$(objext) 315 -rm -f cp/*$(coverageexts) 316 -rm -f xg++$(exeext) g++-cross$(exeext) cc1plus$(exeext) cc1plus.fda 317c++.clean: 318c++.distclean: 319 -rm -f cp/config.status cp/Makefile 320c++.maintainer-clean: 321# 322# Stage hooks: 323# The main makefile has already created stage?/cp. 324 325c++.stage1: stage1-start 326 -mv cp/*$(objext) stage1/cp 327c++.stage2: stage2-start 328 -mv cp/*$(objext) stage2/cp 329c++.stage3: stage3-start 330 -mv cp/*$(objext) stage3/cp 331c++.stage4: stage4-start 332 -mv cp/*$(objext) stage4/cp 333c++.stageprofile: stageprofile-start 334 -mv cp/*$(objext) stageprofile/cp 335c++.stagefeedback: stagefeedback-start 336 -mv cp/*$(objext) stagefeedback/cp 337c++.autostageprofile: stageprofile-start 338 -mv cp/*$(objext) autostageprofile/cp 339c++.autostagefeedback: stagefeedback-start 340 -mv cp/*$(objext) autostagefeedback/cp 341