| # Top level makefile fragment for GNU C++. |
| # Copyright (C) 1994, 1995, 1997, 1998, 1999 Free Software Foundation, Inc. |
| |
| #This file is part of GNU CC. |
| |
| #GNU CC is free software; you can redistribute it and/or modify |
| #it under the terms of the GNU General Public License as published by |
| #the Free Software Foundation; either version 2, or (at your option) |
| #any later version. |
| |
| #GNU CC is distributed in the hope that it will be useful, |
| #but WITHOUT ANY WARRANTY; without even the implied warranty of |
| #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| #GNU General Public License for more details. |
| |
| #You should have received a copy of the GNU General Public License |
| #along with GNU CC; see the file COPYING. If not, write to |
| #the Free Software Foundation, 59 Temple Place - Suite 330, |
| #Boston, MA 02111-1307, USA. |
| |
| # This file provides the language dependent support in the main Makefile. |
| # Each language makefile fragment must provide the following targets: |
| # |
| # foo.all.build, foo.all.cross, foo.start.encap, foo.rest.encap, |
| # foo.info, foo.dvi, |
| # foo.install-normal, foo.install-common, foo.install-info, foo.install-man, |
| # foo.uninstall, foo.distdir, |
| # foo.mostlyclean, foo.clean, foo.distclean, foo.extraclean, |
| # foo.maintainer-clean, foo.stage1, foo.stage2, foo.stage3, foo.stage4 |
| # |
| # where `foo' is the name of the language. |
| # |
| # It should also provide rules for: |
| # |
| # - making any compiler driver (eg: g++) |
| # - the compiler proper (eg: cc1plus) |
| # - define the names for selecting the language in LANGUAGES. |
| # |
| # Extra flags to pass to recursive makes. |
| CXX_FLAGS_TO_PASS = \ |
| "CXX_FOR_BUILD=$(CXX_FOR_BUILD)" \ |
| "CXXFLAGS=$(CXXFLAGS)" \ |
| "CXX_FOR_TARGET=$(CXX_FOR_TARGET)" |
| |
| # Actual names to use when installing a native compiler. |
| CXX_INSTALL_NAME = `t='$(program_transform_name)'; echo c++ | sed $$t` |
| GXX_INSTALL_NAME = `t='$(program_transform_name)'; echo g++ | sed $$t` |
| DEMANGLER_INSTALL_NAME = `t='$(program_transform_name)'; echo c++filt | sed $$t` |
| |
| # Actual names to use when installing a cross-compiler. |
| CXX_CROSS_NAME = `t='$(program_transform_cross_name)'; echo c++ | sed $$t` |
| GXX_CROSS_NAME = `t='$(program_transform_cross_name)'; echo g++ | sed $$t` |
| DEMANGLER_CROSS_NAME = `t='$(program_transform_cross_name)'; echo c++filt | sed $$t` |
| |
| # The name to use for the demangler program. |
| DEMANGLER_PROG = c++filt$(exeext) |
| |
| # Extra headers to install. |
| CXX_EXTRA_HEADERS = $(srcdir)/cp/inc/typeinfo $(srcdir)/cp/inc/exception \ |
| $(srcdir)/cp/inc/new $(srcdir)/cp/inc/new.h |
| |
| # Extra code to include in libgcc2. |
| CXX_LIB2FUNCS = tinfo.o tinfo2.o new.o opnew.o opnewnt.o opvnew.o opvnewnt.o \ |
| opdel.o opdelnt.o opvdel.o opvdelnt.o exception.o |
| CXX_LIB2SRCS = $(srcdir)/cp/new.cc $(srcdir)/cp/new1.cc $(srcdir)/cp/new2.cc \ |
| $(srcdir)/cp/exception.cc $(srcdir)/cp/tinfo.cc \ |
| $(srcdir)/cp/tinfo2.cc $(srcdir)/cp/tinfo.h |
| # |
| # Define the names for selecting c++ in LANGUAGES. |
| # Note that it would be nice to move the dependency on g++ |
| # into the C++ rule, but that needs a little bit of work |
| # to do the right thing within all.cross. |
| C++ c++: cc1plus$(exeext) |
| |
| # Tell GNU make to ignore these if they exist. |
| .PHONY: C++ c++ |
| |
| g++spec.o: $(srcdir)/cp/g++spec.c |
| $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $(srcdir)/cp/g++spec.c |
| |
| $(INTL_TARGETS): $(srcdir)/cp/parse.c |
| $(srcdir)/cp/parse.c: $(srcdir)/cp/parse.y |
| @cp_srcdir=`sed -n 's/^srcdir[ ]*=[ ]*//p' cp/Makefile` && \ |
| echo "cd cp && $(MAKE) $$cp_srcdir/parse.c" && \ |
| cd cp && \ |
| $(MAKE) $(SUBDIR_FLAGS_TO_PASS) $(CXX_FLAGS_TO_PASS) \ |
| $$cp_srcdir/parse.c |
| |
| # Create the compiler driver for g++. |
| GXX_OBJS = gcc.o g++spec.o intl.o prefix.o version.o |
| g++$(exeext): $(GXX_OBJS) $(EXTRA_GCC_OBJS) $(LIBDEPS) |
| $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ \ |
| $(GXX_OBJS) $(EXTRA_GCC_OBJS) $(LIBS) |
| |
| # Create a version of the g++ driver which calls the cross-compiler. |
| g++-cross$(exeext): g++$(exeext) |
| -rm -f g++-cross$(exeext) |
| cp g++$(exeext) g++-cross$(exeext) |
| |
| cxxmain.o: $(srcdir)/../libiberty/cplus-dem.c $(DEMANGLE_H) |
| rm -f cxxmain.c |
| $(LN_S) $(srcdir)/../libiberty/cplus-dem.c cxxmain.c |
| $(CC) -c -DMAIN $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \ |
| -DVERSION=\"$(version)\" cxxmain.c |
| |
| # Apparently OpenVM needs the -o to be at the beginning of the link line. |
| $(DEMANGLER_PROG): cxxmain.o underscore.o $(LIBDEPS) |
| $(CC) -o $@ $(ALL_CFLAGS) $(LDFLAGS) \ |
| cxxmain.o underscore.o $(LIBS) |
| |
| CXX_SRCS = $(srcdir)/cp/call.c $(srcdir)/cp/decl2.c \ |
| $(srcdir)/cp/except.c $(srcdir)/cp/input.c $(srcdir)/cp/pt.c \ |
| $(srcdir)/cp/spew.c $(srcdir)/cp/xref.c $(srcdir)/cp/class.c \ |
| $(srcdir)/cp/expr.c $(srcdir)/cp/lex.c \ |
| $(srcdir)/cp/ptree.c $(srcdir)/cp/tree.c $(srcdir)/cp/cvt.c \ |
| $(srcdir)/cp/errfn.c $(srcdir)/cp/rtti.c $(srcdir)/cp/method.c \ |
| $(srcdir)/cp/search.c $(srcdir)/cp/typeck.c $(srcdir)/cp/decl.c \ |
| $(srcdir)/cp/error.c $(srcdir)/cp/friend.c $(srcdir)/cp/init.c \ |
| $(srcdir)/cp/parse.y $(srcdir)/cp/sig.c $(srcdir)/cp/typeck2.c \ |
| $(srcdir)/cp/repo.c $(srcdir)/cp/semantics.c |
| |
| cc1plus$(exeext): $(P) $(CXX_SRCS) $(LIBDEPS) stamp-objlist c-common.o c-pragma.o \ |
| $(srcdir)/cp/cp-tree.h $(srcdir)/cp/cp-tree.def hash.o |
| cd cp; $(MAKE) $(FLAGS_TO_PASS) $(CXX_FLAGS_TO_PASS) ../cc1plus$(exeext) |
| # |
| # Build hooks: |
| |
| c++.all.build: g++$(exeext) |
| c++.all.cross: g++-cross$(exeext) $(DEMANGLER_PROG) |
| c++.start.encap: g++$(exeext) |
| c++.rest.encap: $(DEMANGLER_PROG) |
| |
| c++.info: |
| c++.dvi: |
| |
| # C++ language-support library pieces for libgcc. |
| tinfo.o: cc1plus$(exeext) $(srcdir)/cp/tinfo.cc |
| $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(CXXFLAGS) $(INCLUDES) \ |
| -c $(srcdir)/cp/tinfo.cc |
| tinfo2.o: cc1plus$(exeext) $(srcdir)/cp/tinfo2.cc |
| $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(CXXFLAGS) $(INCLUDES) \ |
| -c $(srcdir)/cp/tinfo2.cc |
| exception.o: cc1plus$(exeext) $(srcdir)/cp/exception.cc |
| $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(CXXFLAGS) $(INCLUDES) \ |
| -c -fexceptions $(srcdir)/cp/exception.cc |
| new.o: cc1plus$(exeext) $(srcdir)/cp/new.cc |
| $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(CXXFLAGS) $(INCLUDES) \ |
| -c $(srcdir)/cp/new.cc |
| opnew.o: cc1plus$(exeext) $(srcdir)/cp/new1.cc |
| $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(CXXFLAGS) $(INCLUDES) \ |
| -c $(srcdir)/cp/new1.cc -DL_op_new -o opnew.o |
| opnewnt.o: cc1plus$(exeext) $(srcdir)/cp/new1.cc |
| $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(CXXFLAGS) $(INCLUDES) \ |
| -c $(srcdir)/cp/new1.cc -DL_op_newnt -o opnewnt.o |
| opvnew.o: cc1plus$(exeext) $(srcdir)/cp/new2.cc |
| $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(CXXFLAGS) $(INCLUDES) \ |
| -c $(srcdir)/cp/new2.cc -DL_op_vnew -o opvnew.o |
| opvnewnt.o: cc1plus$(exeext) $(srcdir)/cp/new2.cc |
| $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(CXXFLAGS) $(INCLUDES) \ |
| -c $(srcdir)/cp/new2.cc -DL_op_vnewnt -o opvnewnt.o |
| opdel.o: cc1plus$(exeext) $(srcdir)/cp/new2.cc |
| $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(CXXFLAGS) $(INCLUDES) \ |
| -c $(srcdir)/cp/new2.cc -DL_op_delete -o opdel.o |
| opdelnt.o: cc1plus$(exeext) $(srcdir)/cp/new2.cc |
| $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(CXXFLAGS) $(INCLUDES) \ |
| -c $(srcdir)/cp/new2.cc -DL_op_delnt -o opdelnt.o |
| opvdel.o: cc1plus$(exeext) $(srcdir)/cp/new2.cc |
| $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(CXXFLAGS) $(INCLUDES) \ |
| -c $(srcdir)/cp/new2.cc -DL_op_vdel -o opvdel.o |
| opvdelnt.o: cc1plus$(exeext) $(srcdir)/cp/new2.cc |
| $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) $(CXXFLAGS) $(INCLUDES) \ |
| -c $(srcdir)/cp/new2.cc -DL_op_vdelnt -o opvdelnt.o |
| |
| # We want to update cplib2.txt if any of the source files change... |
| cplib2.txt: $(CXX_LIB2SRCS) $(CXX_EXTRA_HEADERS) cplib2.ready |
| case " $(LANGUAGES) " in \ |
| *" "[cC]"++ "*) \ |
| echo $(CXX_LIB2FUNCS) > cplib2.new;; \ |
| *) \ |
| echo "" > cplib2.new;; \ |
| esac |
| mv -f cplib2.new cplib2.txt |
| |
| # Or if it would be different. |
| # Don't try to do write if `.' is not writable; |
| # in that case, we're installing from someone else's directory. |
| # But go ahead and fail if that directory hasn't been properly built. |
| cplib2.ready: $(GCC_PASSES) $(LANGUAGES) $(LIBGCC2_DEPS) stmp-int-hdrs |
| @if [ -r cplib2.txt -a -w . ]; then \ |
| case " $(LANGUAGES) " in \ |
| *" "[cC]"++ "*) \ |
| echo $(CXX_LIB2FUNCS) > cplib2.new;; \ |
| *) \ |
| echo "" > cplib2.new;; \ |
| esac; \ |
| if cmp -s cplib2.new cplib2.txt; then true; else \ |
| touch cplib2.ready; \ |
| fi; \ |
| rm -f cplib2.new; \ |
| else true ; \ |
| fi |
| @if [ -f cplib2.ready ]; then true; else \ |
| touch cplib2.ready; \ |
| fi |
| # |
| # Install hooks: |
| # cc1plus is installed elsewhere as part of $(COMPILERS). |
| |
| # Nothing to do here. |
| c++.install-normal: |
| |
| # Install the driver program as $(target)-g++ |
| # and also as either g++ (if native) or $(tooldir)/bin/g++. |
| c++.install-common: |
| -if [ -f cc1plus$(exeext) ] ; then \ |
| if [ -f g++-cross$(exeext) ] ; then \ |
| rm -f $(bindir)/$(GXX_CROSS_NAME)$(exeext); \ |
| $(INSTALL_PROGRAM) g++-cross$(exeext) $(bindir)/$(GXX_CROSS_NAME)$(exeext); \ |
| chmod a+x $(bindir)/$(GXX_CROSS_NAME)$(exeext); \ |
| rm -f $(bindir)/$(CXX_CROSS_NAME)$(exeext); \ |
| $(LN) $(bindir)/$(GXX_CROSS_NAME)$(exeext) $(bindir)/$(CXX_CROSS_NAME)$(exeext); \ |
| else \ |
| rm -f $(bindir)/$(GXX_INSTALL_NAME)$(exeext); \ |
| $(INSTALL_PROGRAM) g++$(exeext) $(bindir)/$(GXX_INSTALL_NAME)$(exeext); \ |
| chmod a+x $(bindir)/$(GXX_INSTALL_NAME)$(exeext); \ |
| rm -f $(bindir)/$(CXX_INSTALL_NAME)$(exeext); \ |
| $(LN) $(bindir)/$(GXX_INSTALL_NAME)$(exeext) $(bindir)/$(CXX_INSTALL_NAME)$(exeext); \ |
| fi ; \ |
| if [ x$(DEMANGLER_PROG) != x ] && [ -x "$(DEMANGLER_PROG)" ]; then \ |
| if [ -f g++-cross$(exeext) ] ; then \ |
| rm -f $(bindir)/$(DEMANGLER_CROSS_NAME)$(exeext); \ |
| $(INSTALL_PROGRAM) $(DEMANGLER_PROG) $(bindir)/$(DEMANGLER_CROSS_NAME)$(exeext); \ |
| chmod a+x $(bindir)/$(DEMANGLER_CROSS_NAME)$(exeext); \ |
| else \ |
| rm -f $(bindir)/$(DEMANGLER_INSTALL_NAME)$(exeext); \ |
| $(INSTALL_PROGRAM) $(DEMANGLER_PROG) $(bindir)/$(DEMANGLER_INSTALL_NAME)$(exeext); \ |
| chmod a+x $(bindir)/$(DEMANGLER_INSTALL_NAME)$(exeext); \ |
| fi ; \ |
| fi ; \ |
| fi |
| |
| c++.install-info: |
| |
| c++.install-man: $(srcdir)/cp/g++.1 |
| -if [ -f cc1plus$(exeext) ] ; then \ |
| if [ -f g++-cross$(exeext) ] ; then \ |
| rm -f $(man1dir)/$(GXX_CROSS_NAME)$(manext); \ |
| $(INSTALL_DATA) $(srcdir)/cp/g++.1 $(man1dir)/$(GXX_CROSS_NAME)$(manext); \ |
| chmod a-x $(man1dir)/$(GXX_CROSS_NAME)$(manext); \ |
| else \ |
| rm -f $(man1dir)/$(GXX_INSTALL_NAME)$(manext); \ |
| $(INSTALL_DATA) $(srcdir)/cp/g++.1 $(man1dir)/$(GXX_INSTALL_NAME)$(manext); \ |
| chmod a-x $(man1dir)/$(GXX_INSTALL_NAME)$(manext); \ |
| fi; \ |
| else true; fi |
| |
| c++.uninstall: |
| -rm -rf $(bindir)/$(CXX_INSTALL_NAME)$(exeext) |
| -rm -rf $(bindir)/$(CXX_CROSS_NAME)$(exeext) |
| -rm -rf $(bindir)/$(GXX_INSTALL_NAME)$(exeext) |
| -rm -rf $(bindir)/$(GXX_CROSS_NAME)$(exeext) |
| -rm -rf $(bindir)/$(DEMANGLER_INSTALL_NAME)$(exeext) |
| -rm -rf $(bindir)/$(DEMANGLER_CROSS_NAME)$(exeext) |
| -rm -rf $(man1dir)/$(GXX_INSTALL_NAME)$(manext) |
| -rm -rf $(man1dir)/$(GXX_CROSS_NAME)$(manext) |
| # |
| # Clean hooks: |
| # A lot of the ancillary files are deleted by the main makefile. |
| # We just have to delete files specific to us. |
| |
| c++.mostlyclean: |
| -rm -f cp/*$(objext) $(DEMANGLER_PROG) |
| c++.clean: |
| -rm -f cplib2.txt cplib2.ready |
| c++.distclean: |
| -rm -f cp/config.status cp/Makefile |
| -rm -f cp/parse.output |
| c++.extraclean: |
| c++.maintainer-clean: |
| -rm -f cp/parse.c cp/parse.h |
| # |
| # Stage hooks: |
| # The main makefile has already created stage?/cp. |
| |
| c++.stage1: stage1-start |
| -mv cp/*$(objext) stage1/cp |
| c++.stage2: stage2-start |
| -mv cp/*$(objext) stage2/cp |
| c++.stage3: stage3-start |
| -mv cp/*$(objext) stage3/cp |
| c++.stage4: stage4-start |
| -mv cp/*$(objext) stage4/cp |
| # |
| # Maintenance hooks: |
| |
| # This target creates the files that can be rebuilt, but go in the |
| # distribution anyway. It then copies the files to the distdir directory. |
| c++.distdir: |
| mkdir tmp/cp |
| mkdir tmp/cp/inc |
| cd cp ; $(MAKE) $(FLAGS_TO_PASS) $(CXX_FLAGS_TO_PASS) parse.c hash.h |
| cd cp; \ |
| for file in *[0-9a-zA-Z+]; do \ |
| $(LN) $$file ../tmp/cp; \ |
| done |
| cd cp/inc; \ |
| for file in *[0-9a-zA-Z+]; do \ |
| ln $$file ../../tmp/cp/inc >/dev/null 2>&1 \ |
| || cp $$file ../../tmp/cp/inc; \ |
| done |