#
# Copyright (c) 2016, 2019, 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

PRODUCT_TARGETS :=
LEGACY_TARGETS :=
TEST_TARGETS :=
DOCS_TARGETS :=

# On Windows tar frequently complains that "file changed as we read it" for
# some random source files. This seems to be cause by anti virus scanners and
# is most likely safe to ignore. When it happens, tar returns '1'.
ifeq ($(call isBuildOs, windows), true)
  TAR_IGNORE_EXIT_VALUE := || test "$$$$?" = "1"
endif

# Hook to include the corresponding custom file, if present.
$(eval $(call IncludeCustomExtension, Bundles-pre.gmk))
################################################################################
# BUNDLE : Name of bundle to create
# FILES : Files in BASE_DIRS to add to bundle
# SPECIAL_INCLUDES : List of directories inside BASE_DIRS to look for additional
#     files in. These files will not get proper dependency handling. Use when
#     files or directories may contain spaces.
# BASE_DIRS : Base directories for the root dir in the bundle.
# SUBDIR : Optional name of root dir in bundle.
# OUTPUTDIR : Optionally override output dir
SetupBundleFile = $(NamedParamsMacroTemplate)
define SetupBundleFileBody

  $$(foreach d, $$($1_BASE_DIRS), \
    $$(eval $1_$$d_RELATIVE_FILES := $$$$(patsubst $$d/%, %, \
        $$$$(filter $$d/%, $$$$($1_FILES)))) \
    $$(eval $1_$$d_LIST_FILE := \
        $(SUPPORT_OUTPUTDIR)/bundles/_$1_$$$$(subst /,_,$$$$(patsubst $(OUTPUTDIR)/%,%,$$d)_files)) \
  )

  ifneq ($$(filter %.tar.gz, $$($1_BUNDLE_NAME)), )
    $1_TYPE := tar.gz
  else ifneq ($$(filter %.zip, $$($1_BUNDLE_NAME)), )
    $1_TYPE := zip
  else
    $$(error Unknown bundle type $$($1_BUNDLE_NAME))
  endif

  $$(call SetIfEmpty, $1_UNZIP_DEBUGINFO, false)

  $$(call SetIfEmpty, $1_OUTPUTDIR, $$(BUNDLES_OUTPUTDIR))

  $$($1_OUTPUTDIR)/$$($1_BUNDLE_NAME): $$($1_FILES)
	$$(call MakeTargetDir)
	$$(call LogWarn, Creating $$($1_BUNDLE_NAME))
        # If any of the files contain a space in the file name, FindFiles
        # will have replaced it with ?. Tar does not accept that so need to
        # switch it back.
	$$(foreach d, $$($1_BASE_DIRS), \
	  $$(eval $$(call ListPathsSafely, \
	      $1_$$d_RELATIVE_FILES, $$($1_$$d_LIST_FILE))) \
	  $$(CAT) $$($1_$$d_LIST_FILE) | $$(TR) '?' ' ' > $$($1_$$d_LIST_FILE).tmp \
	      && $(MV) $$($1_$$d_LIST_FILE).tmp $$($1_$$d_LIST_FILE) $$(NEWLINE) \
	)
        ifneq ($$($1_SPECIAL_INCLUDES), )
	  $$(foreach i, $$($1_SPECIAL_INCLUDES), \
	    $$(foreach d, $$($1_BASE_DIRS), \
	      ($(CD) $$d && $(FIND) $$i >> $$($1_$$d_LIST_FILE)) ; ))
        endif
        ifeq ($$($1_SUBDIR)-$$($1_TYPE)-$$($1_UNZIP_DEBUGINFO), .-zip-false)
          # If no subdir is specified, zip can be done directly from BASE_DIRS.
	  $$(foreach d, $$($1_BASE_DIRS), \
	    ( $(CD) $$d \
	    && $(ZIPEXE) -qru $$@ . -i@$$($1_$$d_LIST_FILE) \
	    || test "$$$$?" = "12" )$$(NEWLINE))
        else ifeq ($$($1_SUBDIR)-$$($1_TYPE)-$$($1_UNZIP_DEBUGINFO)-$$(words $$($1_BASE_DIRS)), \
            .-tar.gz-false-1)
          # If no subdir is specified and only one BASE_DIR, tar.gz can be done
          # directly from BASE_DIR.
	  $(CD) $$($1_BASE_DIRS) \
	      && ( $(TAR) cf - $(TAR_CREATE_EXTRA_PARAM) \
	          -$(TAR_INCLUDE_PARAM) $$($1_$$($1_BASE_DIRS)_LIST_FILE) \
	          $(TAR_IGNORE_EXIT_VALUE) ) \
	      | $(GZIP) > $$@
        else ifeq ($$($1_TYPE)-$(TAR_SUPPORTS_TRANSFORM)-$$($1_UNZIP_DEBUGINFO)-$$(words $$($1_BASE_DIRS)), \
            tar.gz-true-false-1)
          # If only one BASE_DIR, but with a SUBDIR set, tar.gz can use the
          # transform option to create bundle directly from the BASE_DIR.
	  $(CD) $$($1_BASE_DIRS) \
	      && ( $(TAR) cf - $(TAR_CREATE_EXTRA_PARAM) \
	          -$(TAR_INCLUDE_PARAM) $$($1_$$($1_BASE_DIRS)_LIST_FILE) \
	          $$(if $$($1_SUBDIR), --transform 's|^|$$($1_SUBDIR)/|S') \
	          $(TAR_IGNORE_EXIT_VALUE) ) \
	      | $(GZIP) > $$@
        else
          # In all other cases, need to copy all files into a temporary location
          # before creation bundle.
	  $(RM) -r $(SUPPORT_OUTPUTDIR)/bundles/$1/$$($1_SUBDIR)
	  $(MKDIR) -p $(SUPPORT_OUTPUTDIR)/bundles/$1/$$($1_SUBDIR)
	  $$(foreach d, $$($1_BASE_DIRS), \
	    ( $(CD) $$d \
	    && $(TAR) cf - -$(TAR_INCLUDE_PARAM) $$($1_$$d_LIST_FILE) \
	        $(TAR_IGNORE_EXIT_VALUE) ) \
	    | ( $(CD) $(SUPPORT_OUTPUTDIR)/bundles/$1/$$($1_SUBDIR) && $(TAR) xf - )$$(NEWLINE) )
          # Unzip any zipped debuginfo files
          ifeq ($$($1_UNZIP_DEBUGINFO), true)
	    for f in `$(FIND) $(SUPPORT_OUTPUTDIR)/bundles/$1/$$($1_SUBDIR) -name "*.diz"`; do \
	      $(CD) $$$${f%/*} && $(UNZIP) -q $$$${f} && $(RM) $$$${f}; \
	    done
          endif
          ifeq ($$($1_TYPE), tar.gz)
	    $(CD) $(SUPPORT_OUTPUTDIR)/bundles/$1 && \
	    ( $(TAR) cf - $(TAR_CREATE_EXTRA_PARAM) \
	        $$(if $$($1_SUBDIR), $$($1_SUBDIR), .) $(TAR_IGNORE_EXIT_VALUE) ) \
	    | $(GZIP) > $$@
          else ifeq ($$($1_TYPE), zip)
	    $(CD) $(SUPPORT_OUTPUTDIR)/bundles/$1 && $(ZIPEXE) -qr $$@ .
          endif
        endif

  $1 += $$($1_OUTPUTDIR)/$$($1_BUNDLE_NAME)

endef

################################################################################

# On Macosx, we bundle up the macosx specific images which already have the
# correct base directories.
ifeq ($(call isTargetOs, macosx)+$(DEBUG_LEVEL), true+release)
  JDK_IMAGE_DIR := $(JDK_MACOSX_BUNDLE_DIR)
  JRE_IMAGE_DIR := $(JRE_MACOSX_BUNDLE_DIR)
  JDK_IMAGE_HOMEDIR := $(JDK_MACOSX_CONTENTS_DIR)/Home
  JRE_IMAGE_HOMEDIR := $(JRE_MACOSX_CONTENTS_DIR)/Home
  JDK_BUNDLE_SUBDIR :=
  JRE_BUNDLE_SUBDIR :=
else
  JDK_IMAGE_HOMEDIR := $(JDK_IMAGE_DIR)
  JRE_IMAGE_HOMEDIR := $(JRE_IMAGE_DIR)
  JDK_BUNDLE_SUBDIR := jdk-$(VERSION_NUMBER)
  JRE_BUNDLE_SUBDIR := jre-$(VERSION_NUMBER)
  ifneq ($(DEBUG_LEVEL), release)
    JDK_BUNDLE_SUBDIR := $(JDK_BUNDLE_SUBDIR)/$(DEBUG_LEVEL)
    JRE_BUNDLE_SUBDIR := $(JRE_BUNDLE_SUBDIR)/$(DEBUG_LEVEL)
  endif
endif

################################################################################

ifneq ($(filter product-bundles% legacy-bundles, $(MAKECMDGOALS)), )

  SYMBOLS_EXCLUDE_PATTERN := %.debuginfo %.diz %.pdb %.map

  # There may be files with spaces in the names, so use ShellFindFiles
  # explicitly.
  ALL_JDK_FILES := $(call ShellFindFiles, $(JDK_IMAGE_DIR))

  # Create special filter rules when dealing with unzipped .dSYM directories on
  # macosx
  ifeq ($(call isTargetOs, macosx), true)
    ifeq ($(ZIP_EXTERNAL_DEBUG_SYMBOLS), false)
      JDK_SYMBOLS_EXCLUDE_PATTERN := $(addprefix %, \
          $(call containing, .dSYM/, $(patsubst $(JDK_IMAGE_DIR)/%, %, $(ALL_JDK_FILES))))
    endif
  endif

  JDK_BUNDLE_FILES := \
      $(filter-out \
          $(JDK_SYMBOLS_EXCLUDE_PATTERN) \
          $(JDK_EXTRA_EXCLUDES) \
          $(SYMBOLS_EXCLUDE_PATTERN) \
          $(JDK_IMAGE_HOMEDIR)/demo/% \
          , \
          $(ALL_JDK_FILES) \
      )
  JDK_SYMBOLS_BUNDLE_FILES := \
      $(filter \
          $(JDK_SYMBOLS_EXCLUDE_PATTERN) \
          $(SYMBOLS_EXCLUDE_PATTERN) \
          , \
          $(filter-out \
              $(JDK_IMAGE_HOMEDIR)/demo/% \
              , \
              $(ALL_JDK_FILES) \
          ) \
      ) \
      $(call FindFiles, $(SYMBOLS_IMAGE_DIR))

  TEST_DEMOS_BUNDLE_FILES := $(filter $(JDK_IMAGE_HOMEDIR)/demo/%, $(ALL_JDK_FILES))

  ALL_JRE_FILES := $(call ShellFindFiles, $(JRE_IMAGE_DIR))

  # Create special filter rules when dealing with unzipped .dSYM directories on
  # macosx
  ifeq ($(OPENJDK_TARGET_OS), macosx)
    ifeq ($(ZIP_EXTERNAL_DEBUG_SYMBOLS), false)
      JRE_SYMBOLS_EXCLUDE_PATTERN := $(addprefix %, \
          $(call containing, .dSYM/, $(patsubst $(JRE_IMAGE_DIR)/%, %, $(ALL_JRE_FILES))))
    endif
  endif

  JRE_BUNDLE_FILES := $(filter-out \
      $(JRE_SYMBOLS_EXCLUDE_PATTERN) \
      $(SYMBOLS_EXCLUDE_PATTERN), \
      $(ALL_JRE_FILES))

  $(eval $(call SetupBundleFile, BUILD_JDK_BUNDLE, \
      BUNDLE_NAME := $(JDK_BUNDLE_NAME), \
      FILES := $(JDK_BUNDLE_FILES), \
      SPECIAL_INCLUDES := $(JDK_SPECIAL_INCLUDES), \
      BASE_DIRS := $(JDK_IMAGE_DIR), \
      SUBDIR := $(JDK_BUNDLE_SUBDIR), \
  ))

  PRODUCT_TARGETS += $(BUILD_JDK_BUNDLE)

  $(eval $(call SetupBundleFile, BUILD_JRE_BUNDLE, \
      BUNDLE_NAME := $(JRE_BUNDLE_NAME), \
      FILES := $(JRE_BUNDLE_FILES), \
      BASE_DIRS := $(JRE_IMAGE_DIR), \
      SUBDIR := $(JRE_BUNDLE_SUBDIR), \
  ))

  LEGACY_TARGETS += $(BUILD_JRE_BUNDLE)

  $(eval $(call SetupBundleFile, BUILD_JDK_SYMBOLS_BUNDLE, \
      BUNDLE_NAME := $(JDK_SYMBOLS_BUNDLE_NAME), \
      FILES := $(JDK_SYMBOLS_BUNDLE_FILES), \
      BASE_DIRS := $(JDK_IMAGE_DIR) $(wildcard $(SYMBOLS_IMAGE_DIR)), \
      SUBDIR := $(JDK_BUNDLE_SUBDIR), \
      UNZIP_DEBUGINFO := true, \
  ))

  PRODUCT_TARGETS += $(BUILD_JDK_SYMBOLS_BUNDLE)

  # The demo bundle is only created to support client tests. Ideally it should
  # be built with the main test bundle, but since the prerequisites match
  # better with the product build, it makes more sense to keep it there for now.
  $(eval $(call SetupBundleFile, BUILD_TEST_DEMOS_BUNDLE, \
      BUNDLE_NAME := $(TEST_DEMOS_BUNDLE_NAME), \
      FILES := $(TEST_DEMOS_BUNDLE_FILES), \
      BASE_DIRS := $(JDK_IMAGE_DIR), \
      SUBDIR := $(JDK_BUNDLE_SUBDIR), \
  ))

  PRODUCT_TARGETS += $(BUILD_TEST_DEMOS_BUNDLE)
endif

################################################################################

ifneq ($(filter test-bundles, $(MAKECMDGOALS)), )
  TEST_BUNDLE_FILES := $(call FindFiles, $(TEST_IMAGE_DIR))

  $(eval $(call SetupBundleFile, BUILD_TEST_BUNDLE, \
      BUNDLE_NAME := $(TEST_BUNDLE_NAME), \
      FILES := $(TEST_BUNDLE_FILES), \
      BASE_DIRS := $(TEST_IMAGE_DIR), \
  ))

  TEST_TARGETS += $(BUILD_TEST_BUNDLE)
endif

################################################################################

ifneq ($(filter docs-bundles, $(MAKECMDGOALS)), )
  DOCS_BUNDLE_FILES := $(call FindFiles, $(DOCS_IMAGE_DIR))

  $(eval $(call SetupBundleFile, BUILD_DOCS_BUNDLE, \
      BUNDLE_NAME := $(DOCS_BUNDLE_NAME), \
      FILES := $(DOCS_BUNDLE_FILES), \
      BASE_DIRS := $(DOCS_IMAGE_DIR), \
      SUBDIR := docs, \
  ))

  DOCS_TARGETS += $(BUILD_DOCS_BUNDLE)
endif

################################################################################

ifneq ($(filter jcov-bundles, $(MAKECMDGOALS)), )
  JCOV_BUNDLE_FILES := $(call FindFiles, $(JCOV_IMAGE_DIR))

  $(eval $(call SetupBundleFile, BUILD_JCOV_BUNDLE, \
      BUNDLE_NAME := $(JCOV_BUNDLE_NAME), \
      FILES := $(JCOV_BUNDLE_FILES), \
      BASE_DIRS := $(JCOV_IMAGE_DIR), \
      SUBDIR := $(JDK_BUNDLE_SUBDIR), \
  ))

  JCOV_TARGETS += $(BUILD_JCOV_BUNDLE)
endif

################################################################################

ifneq ($(filter static-libs-bundles, $(MAKECMDGOALS)), )
  STATIC_LIBS_BUNDLE_FILES := $(call FindFiles, $(STATIC_LIBS_IMAGE_DIR))

  ifeq ($(OPENJDK_TARGET_OS)-$(DEBUG_LEVEL), macosx-release)
    STATIC_LIBS_BUNDLE_SUBDIR := $(JDK_MACOSX_CONTENTS_SUBDIR)/Home
  else
    STATIC_LIBS_BUNDLE_SUBDIR := $(JDK_BUNDLE_SUBDIR)
  endif

  $(eval $(call SetupBundleFile, BUILD_STATIC_LIBS_BUNDLE, \
      BUNDLE_NAME := $(STATIC_LIBS_BUNDLE_NAME), \
      FILES := $(STATIC_LIBS_BUNDLE_FILES), \
      BASE_DIRS := $(STATIC_LIBS_IMAGE_DIR), \
      SUBDIR := $(STATIC_LIBS_BUNDLE_SUBDIR), \
  ))

  STATIC_LIBS_TARGETS += $(BUILD_STATIC_LIBS_BUNDLE)
endif

################################################################################

# Hook to include the corresponding custom file, if present.
$(eval $(call IncludeCustomExtension, Bundles.gmk))

################################################################################

product-bundles: $(PRODUCT_TARGETS)
legacy-bundles: $(LEGACY_TARGETS)
test-bundles: $(TEST_TARGETS)
docs-bundles: $(DOCS_TARGETS)
static-libs-bundles: $(STATIC_LIBS_TARGETS)
jcov-bundles: $(JCOV_TARGETS)

.PHONY: all default product-bundles test-bundles docs-bundles \
    static-libs-bundles jcov-bundles
