# Top level -*- makefile -*- fragment for GNU C++.
#   Copyright (C) 1994, 1995, 1997, 1998, 1999, 2000, 2001
#   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.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.

# 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)

#
# 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 $(SYSTEM_H) $(GCC_H) $(CONFIG_H)
	(SHLIB_LINK='$(SHLIB_LINK)' \
	SHLIB_MULTILIB='$(SHLIB_MULTILIB)'; \
	$(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(DRIVER_DEFINES) \
		$(INCLUDES) $(srcdir)/cp/g++spec.c)

$(INTL_TARGETS): $(srcdir)/cp/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)

# The demangler.
cxxmain.o: $(srcdir)/../libiberty/cplus-dem.c $(DEMANGLE_H) $(CONFIG_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)

# The compiler itself.
# Shared with C front end:
CXX_C_OBJS = c-common.o c-format.o c-pragma.o c-semantics.o c-lex.o c-dump.o $(CXX_TARGET_OBJS)

# Language-specific object files.
CXX_OBJS = cp/call.o cp/decl.o cp/errfn.o cp/expr.o cp/pt.o cp/typeck2.o \
 cp/class.o cp/decl2.o cp/error.o cp/lex.o cp/parse.o cp/ptree.o cp/rtti.o \
 cp/spew.o cp/typeck.o cp/cvt.o cp/except.o cp/friend.o cp/init.o cp/method.o \
 cp/search.o cp/semantics.o cp/tree.o cp/xref.o cp/repo.o cp/dump.o \
 cp/optimize.o cp/mangle.o

# Use loose warnings for this front end.
cp-warn =

cc1plus$(exeext): $(CXX_OBJS) $(CXX_C_OBJS) $(BACKEND) \
		  libcpp.a $(LIBDEPS)
	$(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ \
	      $(CXX_OBJS) $(CXX_C_OBJS) $(BACKEND) libcpp.a $(LIBS)

# Special build rules.
$(srcdir)/cp/cfns.h: $(srcdir)/cp/cfns.gperf
	gperf -o -C -E -k '1-6,$$' -j1 -D -N 'libc_name_p' \
		$(srcdir)/cp/cfns.gperf > $(srcdir)/cp/cfns.h

$(srcdir)/cp/parse.h $(srcdir)/cp/parse.c: $(srcdir)/cp/parse.y
	@echo "Expect 33 shift/reduce conflicts and 58 reduce/reduce conflicts."
	cd $(srcdir)/cp; $(BISON) $(BISONFLAGS) -d -o p$$$$.c parse.y ; \
	grep '^#define[ 	]*YYEMPTY' p$$$$.c >> p$$$$.h ; \
	mv -f p$$$$.c parse.c ; mv -f p$$$$.h parse.h

#
# 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: $(srcdir)/cp/g++int.info
c++.dvi:

$(srcdir)/cp/g++int.info: $(srcdir)/cp/gxxint.texi
	if [ x$(BUILD_INFO) = xinfo ]; then \
	  rm -f $(srcdir)/cp/g++int.info*; \
	  cd $(srcdir)/cp && $(MAKEINFO) -o g++int.info gxxint.texi; \
	else true; 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: installdirs
	-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); \
	    if [ -d $(gcc_tooldir)/bin/. ] ; then \
	      rm -f $(gcc_tooldir)/bin/g++$(exeext); \
	      $(INSTALL_PROGRAM) g++-cross$(exeext) $(gcc_tooldir)/bin/g++$(exeext); \
	      rm -f $(gcc_tooldir)/bin/c++$(exeext); \
	      $(LN) $(gcc_tooldir)/bin/g++$(exeext) $(gcc_tooldir)/bin/c++$(exeext); \
	    else true; fi; \
	  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); \
	    rm -f $(bindir)/$(target_alias)-g++$(exeext); \
	    $(LN) $(bindir)/$(GXX_INSTALL_NAME)$(exeext) $(bindir)/$(target_alias)-g++$(exeext); \
	    rm -f $(bindir)/$(target_alias)-c++$(exeext); \
	    $(LN) $(bindir)/$(CXX_INSTALL_NAME)$(exeext) $(bindir)/$(target_alias)-c++$(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++.info installdirs
	if [ -f cc1plus$(exeext) ] ; then \
	  if [ -f $(srcdir)/cp/g++int.info ]; then \
	    rm -f $(infodir)/g++int.info*; \
	    for f in $(srcdir)/cp/g++int.info*; do \
	      realfile=`echo $$f | sed -e 's|.*/\([^/]*\)$$|\1|'`; \
	      $(INSTALL_DATA) $$f $(infodir)/$$realfile; \
	    done; \
	    chmod a-x $(infodir)/g++int.info*; \
	  else true; fi; \
	else true; fi
	-if [ -f cc1plus$(exeext) ] && [ -f $(infodir)/g++int.info ]; then \
	  if $(SHELL) -c 'install-info --version' >/dev/null 2>&1; then \
	    install-info --dir-file=$(infodir)/dir $(infodir)/g++int.info; \
	  else true; fi; \
	else true; fi

c++.install-man: installdirs $(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)
	-rm -rf $(infodir)/g++int.info*
#
# 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:
c++.distclean:
	-rm -f cp/config.status cp/Makefile
	-rm -f $(srcdir)/cp/parse.output
c++.extraclean:
c++.maintainer-clean:
	-rm -f $(srcdir)/cp/parse.c $(srcdir)/cp/parse.h
	-rm -f $(srcdir)/cp/g++int.info*
#
# 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

#
# .o: .h dependencies.
CXX_TREE_H = $(TREE_H) cp/cp-tree.h c-common.h cp/cp-tree.def c-common.def \
	function.h varray.h $(SYSTEM_H) $(CONFIG_H) \
	$(srcdir)/../include/hashtab.h $(srcdir)/../include/splay-tree.h

cp/spew.o: cp/spew.c $(CXX_TREE_H) cp/parse.h flags.h cp/lex.h toplev.h
cp/lex.o: cp/lex.c $(CXX_TREE_H) cp/parse.h flags.h cp/lex.h c-pragma.h \
  toplev.h output.h mbchar.h $(GGC_H) input.h diagnostic.h cp/operators.def \
  $(TM_P_H)
cp/decl.o: cp/decl.c $(CXX_TREE_H) flags.h cp/lex.h cp/decl.h stack.h \
  output.h $(EXPR_H) except.h toplev.h hash.h $(GGC_H) $(RTL_H) \
  cp/operators.def $(TM_P_H)
cp/decl2.o: cp/decl2.c $(CXX_TREE_H) flags.h cp/lex.h cp/decl.h $(EXPR_H) \
  output.h except.h toplev.h dwarf2out.h dwarfout.h $(GGC_H) $(RTL_H)
cp/typeck2.o: cp/typeck2.c $(CXX_TREE_H) flags.h toplev.h output.h $(TM_P_H)
cp/typeck.o: cp/typeck.c $(CXX_TREE_H) flags.h $(RTL_H) $(EXPR_H) toplev.h 
cp/class.o: cp/class.c $(CXX_TREE_H) flags.h toplev.h $(RTL_H)
cp/call.o: cp/call.c $(CXX_TREE_H) flags.h toplev.h $(RTL_H) $(EXPR_H) $(GGC_H)
cp/friend.o: cp/friend.c $(CXX_TREE_H) flags.h $(RTL_H) toplev.h $(EXPR_H)
cp/init.o: cp/init.c $(CXX_TREE_H) flags.h $(RTL_H) $(EXPR_H) toplev.h \
  $(GGC_H) except.h
cp/method.o: cp/method.c $(CXX_TREE_H) toplev.h $(GGC_H) $(RTL_H) $(EXPR_H) \
  $(TM_P_H)
cp/cvt.o: cp/cvt.c $(CXX_TREE_H) cp/decl.h flags.h toplev.h convert.h
cp/search.o: cp/search.c $(CXX_TREE_H) stack.h flags.h toplev.h $(RTL_H)
cp/tree.o: cp/tree.c $(CXX_TREE_H) flags.h toplev.h $(GGC_H) $(RTL_H) \
  insn-config.h integrate.h
cp/ptree.o: cp/ptree.c $(CXX_TREE_H) $(SYSTEM_H)
cp/rtti.o: cp/rtti.c $(CXX_TREE_H) flags.h toplev.h
cp/except.o: cp/except.c $(CXX_TREE_H) flags.h $(RTL_H) except.h toplev.h \
  cp/cfns.h $(EXPR_H) cp/decl.h $(OBSTACK_H)
cp/expr.o: cp/expr.c $(CXX_TREE_H) $(RTL_H) flags.h $(EXPR_H) toplev.h \
  except.h $(TM_P_H)
cp/xref.o: cp/xref.c $(CXX_TREE_H) input.h toplev.h
cp/pt.o: cp/pt.c $(CXX_TREE_H) cp/decl.h cp/parse.h cp/lex.h toplev.h \
  $(GGC_H) $(RTL_H) except.h
cp/error.o: cp/error.c $(CXX_TREE_H) toplev.h diagnostic.h
cp/errfn.o: cp/errfn.c $(CXX_TREE_H) toplev.h
cp/repo.o: cp/repo.c $(CXX_TREE_H) toplev.h $(GGC_H)
cp/semantics.o: cp/semantics.c $(CXX_TREE_H) cp/lex.h except.h toplev.h \
  flags.h $(GGC_H) output.h $(RTL_H) $(TIMEVAR_H)
cp/dump.o: cp/dump.c $(CXX_TREE_H) c-dump.h
cp/optimize.o: cp/optimize.c $(CXX_TREE_H) rtl.h integrate.h insn-config.h \
  input.h params.h
cp/mangle.o: cp/mangle.c $(CXX_TREE_H) toplev.h

cp/parse.o: cp/parse.c $(CXX_TREE_H) flags.h cp/lex.h except.h output.h \
	$(SYSTEM_H) toplev.h $(GGC_H)
	$(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $(BIG_SWITCHFLAG) \
		$(srcdir)/cp/parse.c $(OUTPUT_OPTION)
#
# These exist for maintenance purposes.

# Update the tags table.
cp/TAGS: force
	cd $(srcdir)/cp ;			\
	etags --no-globals -l c `echo *.c | sed 's/parse.c//'` \
	  parse.y *.h ../*.c ../*.h;

.PHONY: cp/TAGS
