#
# Copyright (c) 2001, 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.
#

################################################################
# JDK TARGETS
################################################################

JDK_JAVA_EXE = $(OUTPUTDIR)/bin/java$(EXE_SUFFIX)

# NO_IMAGES may be set in conjunction with DEV_ONLY
IMAGES_TARGET = images
ifdef DEV_ONLY
  ifdef NO_IMAGES
    IMAGES_TARGET =
  endif
endif

# GENERATE_DOCS determines if we ask for the docs target
DOCS_TARGET = docs
ifeq ($(GENERATE_DOCS),false)
  DOCS_TARGET =
endif
  
JDK_BUILD_TARGETS = sanity all $(DOCS_TARGET) $(IMAGES_TARGET)

JDK_CLOBBER_TARGETS = clobber

JDK_BUILD_ARGUMENTS = $(COMMON_BUILD_ARGUMENTS) \
    ALT_OUTPUTDIR=$(ABS_OUTPUTDIR)

ifeq ($(BUILD_LANGTOOLS), true)
  JDK_BUILD_ARGUMENTS += ALT_LANGTOOLS_DIST=$(ABS_LANGTOOLS_DIST)
endif
ifeq ($(BUILD_CORBA), true)
  JDK_BUILD_ARGUMENTS += ALT_CORBA_DIST=$(ABS_CORBA_DIST)
endif
ifeq ($(BUILD_JAXP), true)
  JDK_BUILD_ARGUMENTS += ALT_JAXP_DIST=$(ABS_JAXP_DIST)
endif
ifeq ($(BUILD_JAXWS), true)
  JDK_BUILD_ARGUMENTS += ALT_JAXWS_DIST=$(ABS_JAXWS_DIST)
endif

ifeq ($(BUILD_HOTSPOT), true)
  JDK_BUILD_ARGUMENTS += ALT_HOTSPOT_IMPORT_PATH=$(HOTSPOT_DIR)/import
endif

JDK_BUILD_ARGUMENTS += \
        BUILD_HOTSPOT=$(BUILD_HOTSPOT)

# Move to COMMON_BUILD_ARGUMENTS when all repos support
# FULL_DEBUG_SYMBOLS and ZIP_DEBUGINFO_FILES:
ifdef FULL_DEBUG_SYMBOLS
  JDK_BUILD_ARGUMENTS += FULL_DEBUG_SYMBOLS=$(FULL_DEBUG_SYMBOLS)
endif

ifdef ZIP_DEBUGINFO_FILES
  JDK_BUILD_ARGUMENTS += ZIP_DEBUGINFO_FILES="$(ZIP_DEBUGINFO_FILES)"
endif


$(JDK_JAVA_EXE):: jdk-build

jdk: jdk-build
jdk-build:
	@$(call MakeStart,jdk,$(JDK_BUILD_TARGETS))
	( $(CD) $(JDK_TOPDIR)/make && \
	  $(MAKE) $(JDK_BUILD_TARGETS) $(JDK_BUILD_ARGUMENTS) ; )
	@$(call MakeFinish,jdk,$(JDK_BUILD_TARGETS))

jdk-clobber::
	@$(call MakeStart,jdk,$(JDK_CLOBBER_TARGETS))
	( $(CD) $(JDK_TOPDIR)/make && \
	  $(MAKE) $(JDK_CLOBBER_TARGETS) $(JDK_BUILD_ARGUMENTS) ; )
	@$(call MakeFinish,jdk,$(JDK_CLOBBER_TARGETS))

jdk-sanity::
	( $(CD) $(JDK_TOPDIR)/make && \
	  $(MAKE) sanity HOTSPOT_IMPORT_CHECK=false $(JDK_BUILD_ARGUMENTS) ; )

compare-images: compare-image
compare-image:
	@$(call MakeStart,jdk,compare-image)
	( $(CD) $(JDK_TOPDIR)/make && \
	  $(MAKE) ALT_OUTPUTDIR=$(ABS_OUTPUTDIR) compare-image )
	@$(call MakeFinish,jdk,compare-image)

compare-images-clobber: compare-image-clobber
compare-image-clobber:
	@$(call MakeStart,jdk,compare-image-clobber)
	( $(CD) $(JDK_TOPDIR)/make && \
	  $(MAKE) ALT_OUTPUTDIR=$(ABS_OUTPUTDIR) compare-image-clobber )
	@$(call MakeFinish,jdk,compare-image-clobber)

.PHONY: jdk jdk-build jdk-clobber jdk-sanity 

