# Top level -*- makefile -*- fragment for GNU Objective-C
#   Copyright (C) 1997-2013 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/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 hash-table.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/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) \
   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) debug.h $(LANGHOOKS_DEF_H) \
   $(HASH_TABLE_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
