#
# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.  Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
#
# This code 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
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#

default: all

include $(SPEC)
include MakeBase.gmk
include JavaCompilation.gmk
include NativeCompilation.gmk

# Setup the java compilers for the JDK build.
include Setup.gmk
# We need the tools.
include Tools.gmk

# Now include all the rules that generate Java sources.
# The Java sources are written into the gensrc_.... directories.

include GensrcProperties.gmk
GENSRC += $(GENSRC_PROPERTIES)

include GensrcLocaleDataMetaInfo.gmk
GENSRC += $(GENSRC_LOCALEDATAMETAINFO)

include GensrcCharacterData.gmk
GENSRC += $(GENSRC_CHARACTERDATA)

include GensrcJDWP.gmk
GENSRC += $(GENSRC_JDWP)

include GensrcMisc.gmk
GENSRC += $(GENSRC_MISC)

include GensrcCharsetMapping.gmk
GENSRC += $(GENSRC_CHARSETMAPPING)

include GensrcCharsetCoder.gmk
GENSRC += $(GENSRC_CHARSETCODER)

include GensrcBuffer.gmk
GENSRC += $(GENSRC_BUFFER)

include GensrcExceptions.gmk
GENSRC += $(GENSRC_EXCEPTIONS)

ifneq ($(OPENJDK_TARGET_OS),windows)
include GensrcIcons.gmk
GENSRC += $(GENSRC_X11_ICONS)

ifeq ($(OPENJDK_TARGET_OS),macosx)
GENSRC += $(GENSRC_OSX_ICONS)
endif

include GensrcX11Wrappers.gmk
GENSRC += $(GENSRC_X11WRAPPERS)
endif

include GensrcCLDR.gmk
GENSRC += $(GENSRC_CLDR)

include GensrcSwing.gmk
GENSRC += $(GENSRC_SWING_BEANINFO) $(GENSRC_SWING_NIMBUS)

ifeq ($(OPENJDK_TARGET_OS), macosx)
     include GensrcJObjC.gmk
     GENSRC += $(GENSRC_JOBJC)
endif

$(GENSRC) : $(BUILD_TOOLS)

all: $(GENSRC)


.PHONY: all
