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

include $(SPEC)
include MakeBase.gmk
include TextFileProcessing.gmk

default: bundles

# Only macosx has bundles defined.
ifeq ($(OPENJDK_TARGET_OS), macosx)

  bundles: jre-bundle jdk-bundle

  # JDK_MACOSX_CONTENTS_DIR and JRE_MACOSX_CONTENTS_DIR are defined in SPEC.

  MACOSX_PLIST_SRC := $(JDK_TOPDIR)/make/data/bundle

  BUNDLE_ID := $(MACOSX_BUNDLE_ID_BASE).$(VERSION_SHORT)
  BUNDLE_NAME := $(MACOSX_BUNDLE_NAME_BASE) $(VERSION_SHORT)
  BUNDLE_INFO := $(MACOSX_BUNDLE_NAME_BASE) $(VERSION_STRING)
  BUNDLE_PLATFORM_VERSION := $(VERSION_MAJOR).$(VERSION_MINOR)
  BUNDLE_VERSION := $(VERSION_NUMBER)
  ifeq ($(COMPANY_NAME), N/A)
    BUNDLE_VENDOR := UNDEFINED
  else
    BUNDLE_VENDOR := $(COMPANY_NAME)
  endif

  JDK_FILE_LIST := $(shell $(FIND) $(JDK_IMAGE_DIR))
  JRE_FILE_LIST := $(shell $(FIND) $(JRE_IMAGE_DIR))

  JDK_TARGET_LIST := $(subst $(JDK_IMAGE_DIR)/,$(JDK_MACOSX_CONTENTS_DIR)/Home/,$(JDK_FILE_LIST))
  JRE_TARGET_LIST := $(subst $(JRE_IMAGE_DIR)/,$(JRE_MACOSX_CONTENTS_DIR)/Home/,$(JRE_FILE_LIST))

  # Copy empty directories (jre/lib/applet).
  $(JDK_MACOSX_CONTENTS_DIR)/Home/%: $(JDK_IMAGE_DIR)/%
	$(call LogInfo, Copying $(patsubst $(OUTPUT_ROOT)/%,%,$@))
	$(MKDIR) -p $(@D)
	if [ -d "$<" ]; then $(MKDIR) -p $@; else $(CP) -f -R -P '$<' '$@'; fi

  $(JRE_MACOSX_CONTENTS_DIR)/Home/%: $(JRE_IMAGE_DIR)/%
	$(call LogInfo, Copying $(patsubst $(OUTPUT_ROOT)/%,%,$@))
	$(MKDIR) -p $(@D)
	if [ -d "$<" ]; then $(MKDIR) -p $@; else $(CP) -f -R -P '$<' '$@'; fi

  $(JDK_MACOSX_CONTENTS_DIR)/MacOS/libjli.dylib:
	$(call LogInfo, Creating link $(patsubst $(OUTPUT_ROOT)/%,%,$@))
	$(MKDIR) -p $(@D)
	$(RM) $@
	$(LN) -s ../Home/lib/jli/libjli.dylib $@

  $(JRE_MACOSX_CONTENTS_DIR)/MacOS/libjli.dylib:
	$(call LogInfo, Creating link $(patsubst $(OUTPUT_ROOT)/%,%,$@))
	$(MKDIR) -p $(@D)
	$(RM) $@
	$(LN) -s ../Home/lib/jli/libjli.dylib $@

  $(eval $(call SetupTextFileProcessing, BUILD_JDK_PLIST, \
      SOURCE_FILES := $(MACOSX_PLIST_SRC)/JDK-Info.plist, \
      OUTPUT_FILE := $(JDK_MACOSX_CONTENTS_DIR)/Info.plist, \
      REPLACEMENTS := \
          @@ID@@ => $(BUNDLE_ID).jdk ; \
          @@NAME@@ => $(BUNDLE_NAME) ; \
          @@INFO@@ => $(BUNDLE_INFO) ; \
          @@PLATFORM_VERSION@@ => $(BUNDLE_PLATFORM_VERSION) ; \
          @@VERSION@@ => $(BUNDLE_VERSION) ; \
          @@VENDOR@@ => $(BUNDLE_VENDOR) , \
  ))

  $(eval $(call SetupTextFileProcessing, BUILD_JRE_PLIST, \
      SOURCE_FILES := $(MACOSX_PLIST_SRC)/JRE-Info.plist, \
      OUTPUT_FILE := $(JRE_MACOSX_CONTENTS_DIR)/Info.plist, \
      REPLACEMENTS := \
          @@ID@@ => $(BUNDLE_ID).jre ; \
          @@NAME@@ => $(BUNDLE_NAME) ; \
          @@INFO@@ => $(BUNDLE_INFO) ; \
          @@PLATFORM_VERSION@@ => $(BUNDLE_PLATFORM_VERSION) ; \
          @@VERSION@@ => $(BUNDLE_VERSION) ; \
          @@VENDOR@@ => $(BUNDLE_VENDOR) , \
  ))

  jdk-bundle: $(JDK_TARGET_LIST) $(JDK_MACOSX_CONTENTS_DIR)/MacOS/libjli.dylib \
      $(BUILD_JDK_PLIST)
	$(SETFILE) -a B $(dir $(JDK_MACOSX_CONTENTS_DIR))

  jre-bundle: $(JRE_TARGET_LIST) $(JRE_MACOSX_CONTENTS_DIR)/MacOS/libjli.dylib \
      $(BUILD_JRE_PLIST)
	$(SETFILE) -a B $(dir $(JRE_MACOSX_CONTENTS_DIR))

else # Not macosx

  bundles:
	$(ECHO) "No bundles defined for $(OPENJDK_TARGET_OS)"

endif # macosx

.PHONY: jdk-bundle jre-bundle bundles
