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

# This must be the first rule
default: all

# Inclusion of this pseudo-target will cause make to execute this file
# serially, regardless of -j. Recursively called makefiles will not be
# affected, however. This is required for correct dependency management.
.NOTPARALLEL:

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

# Setup the java compilers for the JDK build.
include Setup.gmk

# Include Profile information
include ProfileNames.gmk

# Include the corresponding custom file, if present.
-include $(CUSTOM_MAKE_DIR)/BuildJdk.gmk

import: import-only
import-only:
        # Import (corba jaxp jaxws langtools hotspot)
	+$(MAKE) -f Import.gmk

gensrc: import gensrc-only
gensrc-only:
	+$(MAKE) -f GenerateSources.gmk
        # Ok, now gensrc is fully populated.

gendata: gensrc gendata-only
gendata-only:
	+$(MAKE) -f GenerateData.gmk

classes: gendata classes-only
classes-only:
	+$(MAKE) -f CompileJavaClasses.gmk
        # The classes are now built and
        # any javah files have now been generated.

libs: classes libs-only
libs-only:
	+$(MAKE) -f CompileNativeLibraries.gmk

launchers: libs launchers-only
launchers-only:
        # Finally compile the launchers.
	+$(MAKE) -f CompileLaunchers.gmk

genclasses: launchers genclasses-only
genclasses-only:
        # Generate classes that have other sources. Needs
        # to execute launchers.
	+$(MAKE) -f GenerateClasses.gmk

securityjars: genclasses securityjars-only
securityjars-only:
	+$(MAKE) -f CreateSecurityJars.gmk

jdk: securityjars
        # Now we have a complete jdk, which you can run.
        # It is not yet wrapped up as an installed image.

demos:
        # The demos are compiled against this jdk.
	+$(MAKE) -f CompileDemos.gmk
        # Now copy the sample sources into the jdk.
	+$(MAKE) -f CopySamples.gmk

# Create the final jdk and jre images, to be wrapped up
# into packages, or installed. Ensure PROFILE is not set
# in these cases.
images:
	+$(MAKE) PROFILE="" -f CreateJars.gmk
	+$(MAKE) PROFILE="" -f Images.gmk
        ifeq ($(OPENJDK_TARGET_OS), macosx)
	  +$(MAKE) -f Bundles.gmk
        endif

overlay-images:
	+$(MAKE) -f CompileLaunchers.gmk OVERLAY_IMAGES=true
	+$(MAKE) -f Images.gmk overlay-images

# Create Compact Profile images
$(ALL_PROFILES):
	+$(MAKE) PROFILE=$@ -f CreateJars.gmk
	+$(MAKE) PROFILE=$@ JRE_IMAGE_DIR=$(IMAGES_OUTPUTDIR)/j2re-$(word $(call profile_number,$@),$(PROFILE_NAMES))-image -f Images.gmk profile-image

profiles: $(ALL_PROFILES)

sign-jars:
	+$(MAKE) -f SignJars.gmk

BINARIES := $(notdir $(wildcard $(JDK_IMAGE_DIR)/bin/*))
INSTALLDIR := openjdk-$(RELEASE)

# Install the jdk image, in a very crude way. Not taking into
# account, how to install properly on macosx or windows etc.
install:
	echo Installing jdk image into $(INSTALL_PREFIX)/jvm/$(INSTALLDIR)
	echo and creating $(words $(BINARIES)) links from $(INSTALL_PREFIX)/bin into the jdk.
	$(MKDIR) -p $(INSTALL_PREFIX)/jvm/$(INSTALLDIR)
	$(RM) -r $(INSTALL_PREFIX)/jvm/$(INSTALLDIR)/*
	$(CP) -rp $(JDK_IMAGE_DIR)/* $(INSTALL_PREFIX)/jvm/$(INSTALLDIR)
	$(MKDIR) -p $(INSTALL_PREFIX)/bin
	$(RM) $(addprefix $(INSTALL_PREFIX)/bin/, $(BINARIES))
	$(foreach b, $(BINARIES), $(LN) -s $(INSTALL_PREFIX)/jvm/$(INSTALLDIR)/bin/$b $(INSTALL_PREFIX)/bin/$b &&) true

# The all target builds the JDK, but not the images
all: jdk

.PHONY: import gensrc gendata classes libs launchers genclasses
.PHONY: import-only gensrc-only gendata-only classes-only libs-only launchers-only genclasses-only
.PHONY: all jdk demos images overlay-images bundles install
.PHONY: profiles $(ALL_PROFILES)
