#
# 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 ($(call isTargetOs, windows), true)
    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)
