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

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

include CopyFiles.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

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

include MakeFileEnd.gmk
