# Top level -*- makefile -*- fragment for GNU Objective-C
#   Copyright (C) 1997, 1998, 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.

#
# Define the names for selecting Objective-C in LANGUAGES.
OBJC objc: cc1obj$(exeext)
OBJECTIVE-C objective-c: cc1obj$(exeext)

# Tell GNU make to ignore these if they exist.
.PHONY: objective-c objc ObjC

# Use maximal warnings for this front end.
objc-warn = $(STRICT_WARN)

# Language-specific object files for Objective C.
OBJC_OBJS = objc-lang.o objc-parse.o objc-act.o $(C_AND_OBJC_OBJS)

cc1obj$(exeext): $(OBJC_OBJS) $(BACKEND) $(LIBDEPS)
	$(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ $(OBJC_OBJS) $(BACKEND) $(LIBS)

# Objective C language specific files.

objc-lang.o : $(srcdir)/objc/objc-lang.c \
   $(CONFIG_H) $(SYSTEM_H) $(TREE_H) $(srcdir)/c-tree.h \
   $(srcdir)/c-common.h $(srcdir)/toplev.h $(srcdir)/objc/objc-act.h \
   $(srcdir)/langhooks.h $(srcdir)/langhooks-def.h
	$(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -I$(srcdir)/objc \
	-c $(srcdir)/objc/objc-lang.c $(OUTPUT_OPTION)

objc-parse.o : $(srcdir)/objc/objc-parse.c \
   $(CONFIG_H) $(TREE_H) $(srcdir)/toplev.h $(srcdir)/ggc.h \
   $(srcdir)/c-lex.h $(srcdir)/c-tree.h $(srcdir)/c-common.h \
   $(srcdir)/input.h $(srcdir)/flags.h $(srcdir)/output.h \
   $(srcdir)/objc/objc-act.h $(SYSTEM_H) $(CPPLIB_H)
	$(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -I$(srcdir)/objc \
	-c $(srcdir)/objc/objc-parse.c $(OUTPUT_OPTION)

po-generated: $(srcdir)/objc/objc-parse.c
$(srcdir)/objc/objc-parse.c : $(srcdir)/objc/objc-parse.y
	cd $(srcdir)/objc; \
	if $(BISON) $(BISONFLAGS) -o op$$$$.c objc-parse.y ; then \
	  test -f op$$$$.output && mv -f op$$$$.output objc-parse.output ; \
	  mv -f op$$$$.c objc-parse.c ; \
	else \
	  rm -f op$$$$.* ; \
	  false ; \
	fi

$(srcdir)/objc/objc-parse.y: $(srcdir)/c-parse.in
	echo '/*WARNING: This file is automatically generated!*/' >tmp-objc-prs.y
	sed -e "/^ifc$$/,/^end ifc$$/d" \
	  -e "/^ifobjc$$/d" -e "/^end ifobjc$$/d" \
	  $(srcdir)/c-parse.in >>tmp-objc-prs.y
	$(SHELL) $(srcdir)/move-if-change tmp-objc-prs.y $(srcdir)/objc/objc-parse.y

objc-act.o : $(srcdir)/objc/objc-act.c \
   $(CONFIG_H) $(TREE_H) $(RTL_H) $(SYSTEM_H) $(EXPR_H) $(TARGET_H) \
   $(srcdir)/c-tree.h $(srcdir)/c-common.h $(srcdir)/c-lex.h \
   $(srcdir)/toplev.h $(srcdir)/flags.h $(srcdir)/objc/objc-act.h \
   $(srcdir)/input.h $(srcdir)/function.h $(srcdir)/output.h $(srcdir)/debug.h \
   $(srcdir)/langhooks.h $(srcdir)/langhooks-def.h
	$(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) -I$(srcdir)/objc \
	-c $(srcdir)/objc/objc-act.c

#
# Build hooks:

objc.all.build:
objc.all.cross:
objc.start.encap:
objc.rest.encap:

objc.info:
objc.dvi:
objc.generated-manpages:

#
# Install hooks:
# cc1obj is installed elsewhere as part of $(COMPILERS).

objc.install-normal:

objc.install-common:

objc.install-info:

objc.install-man:

objc.uninstall:
#
# Clean hooks:
# A lot of the ancillary files are deleted by the main makefile.
# We just have to delete files specific to us.
objc.mostlyclean:
	-rm -f tmp-objc-prs.y
	-rm -f objc/*$(objext) objc/xforward objc/fflags
objc.clean: objc.mostlyclean
	-rm -rf objc-headers
objc.distclean:
	-rm -f objc/Makefile objc/Make-host objc/Make-target
	-rm -f objc/config.status objc/config.cache
	-rm -f objc-parse.output
objc.extraclean:
objc.maintainer-clean:
	-rm -f $(srcdir)/objc/objc-parse.y
	-rm -f $(srcdir)/objc/objc-parse.c $(srcdir)/objc/objc-parse.output

#
# Stage hooks:

objc.stage1: stage1-start
	-mv objc/*$(objext) stage1/objc
	-mv cc1obj$(exeext) stage1
objc.stage2: stage2-start
	-mv objc/*$(objext) stage2/objc
	-mv cc1obj$(exeext) stage2
objc.stage3: stage3-start
	-mv objc/*$(objext) stage3/objc
	-mv cc1obj$(exeext) stage3
objc.stage4: stage4-start
	-mv objc/*$(objext) stage4/objc
	-mv cc1obj$(exeext) stage4
