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

# This makefile is called for every imported module to copy the non class
# contents into the exploded jdk image.

default: all

include $(SPEC)
include MakeBase.gmk

LIBS_DIR := $(wildcard $(addsuffix /$(MODULE), $(IMPORT_MODULES_LIBS)))
CMDS_DIR := $(wildcard $(addsuffix /$(MODULE), $(IMPORT_MODULES_CMDS)))
CONF_DIR := $(wildcard $(addsuffix /$(MODULE), $(IMPORT_MODULES_CONF)))

$(call FillFindCache, $(LIBS_DIR) $(CMDS_DIR) $(CONF_DIR))

ifneq ($(LIBS_DIR), )
  ifeq ($(OPENJDK_TARGET_OS), windows)
    TO_BIN_FILTER := %$(SHARED_LIBRARY_SUFFIX) %.diz %.pdb %.map

    $(eval $(call SetupCopyFiles, COPY_LIBS_TO_BIN, \
        SRC := $(LIBS_DIR), \
        DEST := $(JDK_OUTPUTDIR)/bin, \
        FILES := $(filter $(TO_BIN_FILTER), \
            $(call FindFiles, $(LIBS_DIR))) \
    ))

    $(eval $(call SetupCopyFiles, COPY_LIBS_TO_LIB, \
        SRC := $(LIBS_DIR), \
        DEST := $(JDK_OUTPUTDIR)/lib, \
        FILES := $(filter-out $(TO_BIN_FILTER), \
            $(call FindFiles, $(LIBS_DIR))) \
    ))
    TARGETS += $(COPY_LIBS_TO_BIN) $(COPY_LIBS_TO_LIB)
  else
    $(eval $(call SetupCopyFiles, COPY_LIBS, \
        SRC := $(LIBS_DIR), \
        DEST := $(JDK_OUTPUTDIR)/lib, \
        FILES := $(filter %$(SHARED_LIBRARY_SUFFIX), $(call FindFiles, $(LIBS_DIR))), \
    ))

    # Use relative links if the import dir is inside the OUTPUTDIR, otherwise
    # copy to avoid having automated systems following symlinks when deleting files,
    # or risk invalidating the build output from external changes.
    ifeq ($(filter $(OUTPUTDIR)/%, $(LIBS_DIR)), )
      LINK_MACRO := install-file
      LOG_ACTION := Copying
    else
      LINK_MACRO := link-file-relative
      LOG_ACTION := Creating symlink
    endif
    $(eval $(call SetupCopyFiles, LINK_LIBS, \
        SRC := $(LIBS_DIR), \
        DEST := $(JDK_OUTPUTDIR)/lib, \
        FILES := $(filter-out %$(SHARED_LIBRARY_SUFFIX), $(call FindFiles, $(LIBS_DIR))), \
        MACRO := $(LINK_MACRO), \
        LOG_ACTION := $(LOG_ACTION), \
    ))
    TARGETS += $(COPY_LIBS) $(LINK_LIBS)
  endif
endif

ifneq ($(CMDS_DIR), )
  $(eval $(call SetupCopyFiles, COPY_CMDS, \
      SRC := $(CMDS_DIR), \
      DEST := $(JDK_OUTPUTDIR)/bin, \
      FILES := $(call FindFiles, $(CMDS_DIR)), \
  ))
  TARGETS += $(COPY_CMDS)
endif

ifneq ($(CONF_DIR), )
  $(eval $(call SetupCopyFiles, COPY_CONF, \
      SRC := $(CONF_DIR), \
      DEST := $(JDK_OUTPUTDIR)/lib, \
      FILES := $(call FindFiles, $(CONF_DIR)), \
  ))
  TARGETS += $(COPY_CONF)
endif

all: $(TARGETS)
