# Top level -*- makefile -*- fragment for GNU Objective-C
#   Copyright (C) 1997, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2007,
#   2008, 2009, 2010, 2011 Free Software Foundation, Inc.

#This file is part of GCC.

#GCC 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 3, or (at your option)
#any later version.

#GCC 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 GCC; see the file COPYING3.  If not see
# <http://www.gnu.org/licenses/>.


# This file provides the language dependent support in the main Makefile.
# Each language makefile fragment must provide the following targets:
#
# foo.all.cross, foo.start.encap, foo.rest.encap,
# foo.install-common, foo.install-man, foo.install-info, foo.install-pdf,
# foo.install-html, foo.info, foo.dvi, foo.pdf, foo.html, foo.uninstall,
# foo.mostlyclean, foo.clean, foo.distclean,
# 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: cc1obj$(exeext)

# Tell GNU make to ignore these if they exist.
.PHONY: objc

START_HDRS = $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) $(C_TREE_H) \
  c-lang.h langhooks.h c-family/c-objc.h objc/objc-act.h

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

# Language-specific object files for Objective C.
OBJC_OBJS = objc/objc-lang.o objc/objc-act.o \
   objc/objc-runtime-shared-support.o \
   objc/objc-gnu-runtime-abi-01.o \
   objc/objc-next-runtime-abi-01.o \
   objc/objc-next-runtime-abi-02.o \
   objc/objc-encoding.o \
   objc/objc-map.o

objc_OBJS = $(OBJC_OBJS) cc1obj-checksum.o

cc1obj-checksum.c : build/genchecksum$(build_exeext) checksum-options \
        $(OBJC_OBJS) $(C_AND_OBJC_OBJS) $(BACKEND) $(LIBDEPS)
	build/genchecksum$(build_exeext) $(OBJC_OBJS) $(C_AND_OBJC_OBJS) \
        $(BACKEND) $(LIBDEPS) checksum-options > cc1obj-checksum.c.tmp && \
	$(srcdir)/../move-if-change cc1obj-checksum.c.tmp cc1obj-checksum.c

cc1obj-checksum.o : cc1obj-checksum.c $(CONFIG_H) $(SYSTEM_H)

cc1obj$(exeext): $(OBJC_OBJS) $(C_AND_OBJC_OBJS) cc1obj-checksum.o $(BACKEND) $(LIBDEPS)
	+$(LINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \
	      $(OBJC_OBJS) $(C_AND_OBJC_OBJS) cc1obj-checksum.o \
	      $(BACKEND) $(LIBS) $(BACKENDLIBS)

# Objective C language specific files.

# When editing, please keep the objc/ header dependencies in
# alphabetical order, and try to use a similar logical order for the
# other files between the different targets.

objc/objc-lang.o : objc/objc-lang.c \
   $(START_HDRS) \
   $(GGC_H) \
   $(LANGHOOKS_DEF_H) $(C_COMMON_H) gtype-objc.h \
   c-objc-common.h

objc/objc-runtime-shared-support.o : objc/objc-runtime-shared-support.c \
   gt-objc-objc-runtime-shared-support.h \
   $(START_HDRS) \
   $(GGC_H) $(DIAGNOSTIC_CORE_H) $(FLAGS_H) input.h \
   objc/objc-encoding.h \
   objc/objc-next-metadata-tags.h \
   objc/objc-runtime-shared-support.h

objc/objc-gnu-runtime-abi-01.o: objc/objc-gnu-runtime-abi-01.c \
   gt-objc-objc-gnu-runtime-abi-01.h \
   $(START_HDRS) \
   $(GGC_H) $(DIAGNOSTIC_CORE_H) $(FLAGS_H) input.h \
   toplev.h \
   objc/objc-encoding.h \
   objc/objc-runtime-hooks.h \
   objc/objc-runtime-shared-support.h

objc/objc-next-runtime-abi-01.o: objc/objc-next-runtime-abi-01.c \
   gt-objc-objc-next-runtime-abi-01.h \
   $(START_HDRS) \
   $(GGC_H) $(DIAGNOSTIC_CORE_H) $(FLAGS_H) input.h \
   $(TARGET_H) output.h \
   objc/objc-encoding.h \
   objc/objc-next-metadata-tags.h \
   objc/objc-runtime-hooks.h \
   objc/objc-runtime-shared-support.h

objc/objc-next-runtime-abi-02.o: objc/objc-next-runtime-abi-02.c \
   gt-objc-objc-next-runtime-abi-02.h \
   $(START_HDRS) \
   $(GGC_H) $(DIAGNOSTIC_CORE_H) $(FLAGS_H) input.h \
   $(TARGET_H) \
   objc/objc-encoding.h \
   objc/objc-next-metadata-tags.h \
   objc/objc-runtime-hooks.h \
   objc/objc-runtime-shared-support.h

objc/objc-act.o : objc/objc-act.c \
   gt-objc-objc-act.h \
   $(START_HDRS) \
   $(GGC_H) $(DIAGNOSTIC_CORE_H) $(FLAGS_H) input.h \
   toplev.h $(FUNCTION_H) output.h debug.h $(LANGHOOKS_DEF_H) \
   $(HASHTAB_H) $(GIMPLE_H) \
   $(C_PRAGMA_H) $(C_TARGET_H) \
   objc/objc-encoding.h \
   objc/objc-map.h \
   objc/objc-runtime-hooks.h \
   objc/objc-runtime-shared-support.h

objc/objc-encoding.o : objc/objc-encoding.c \
   $(START_HDRS) \
   $(GGC_H) $(DIAGNOSTIC_CORE_H) $(FLAGS_H) input.h \
   $(OBSTACK_H) \
   objc/objc-encoding.h \
   objc/objc-runtime-shared-support.h

objc/objc-map.o : objc/objc-map.c \
   $(START_HDRS) \
   $(GGC_H) $(DIAGNOSTIC_CORE_H) $(FLAGS_H) input.h \
   $(OBSTACK_H) \
   objc/objc-map.h

objc.srcextra:

#
# Build hooks:

objc.all.cross:
objc.start.encap:
objc.rest.encap:
objc.info:
objc.install-info:
objc.dvi:
objc.pdf:
objc.install-pdf:
objc.html:
objc.install-html:
objc.man:
objc.srcinfo:
objc.srcman:
objc.install-plugin:

objc.tags: force
	cd $(srcdir)/objc; etags -o TAGS.sub *.c *.h; \
	etags --include TAGS.sub --include ../TAGS.sub

lang_checks += check-objc

# The following allows you to do 'make check-objc -j2'.  The
# execute.exp tests will be run in parallel with all the other ones.
lang_checks_parallelized += check-objc
check_objc_parallelize = gnu-encoding.exp execute.exp exceptions.exp

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

objc.install-common:

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 objc/*$(objext) objc/xforward objc/fflags
	-rm -f objc/*$(coverageexts)
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
objc.maintainer-clean:

#
# Stage hooks:

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