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

################################################################################
# Generate classlist
################################################################################

default: all

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

################################################################################
# Create a jar with our generator class. Using a jar is intentional since it
# will load more classes

$(eval $(call SetupJarArchive, CLASSLIST_JAR, \
    SRCS := $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes, \
    INCLUDES := build/tools/classlist, \
    JAR := $(SUPPORT_OUTPUTDIR)/classlist.jar, \
))

TARGETS += $(CLASSLIST_JAR)

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

LINK_OPT_DIR := $(SUPPORT_OUTPUTDIR)/link_opt
CLASSLIST_FILE := $(LINK_OPT_DIR)/classlist
JLI_TRACE_FILE := $(LINK_OPT_DIR)/default_jli_trace.txt

# If an external buildjdk has been supplied, we don't build a separate interim
# image, so just use the external build jdk instead.
ifeq ($(EXTERNAL_BUILDJDK), true)
  INTERIM_IMAGE_DIR := $(BUILD_JDK)
endif

$(CLASSLIST_FILE): $(INTERIM_IMAGE_DIR)/bin/java$(EXE_SUFFIX) $(CLASSLIST_JAR)
	$(call MakeDir, $(LINK_OPT_DIR))
	$(call LogInfo, Generating $(patsubst $(OUTPUTDIR)/%, %, $@))
	$(call LogInfo, Generating $(patsubst $(OUTPUTDIR)/%, %, $(JLI_TRACE_FILE)))
	$(FIXPATH) $(INTERIM_IMAGE_DIR)/bin/java -XX:DumpLoadedClassList=$@.raw \
	    -Djava.lang.invoke.MethodHandle.TRACE_RESOLVE=true \
	    -cp $(SUPPORT_OUTPUTDIR)/classlist.jar \
	    build.tools.classlist.HelloClasslist \
	    $(LOG_DEBUG) 2>&1 > $(JLI_TRACE_FILE)
	$(GREP) -v HelloClasslist $@.raw > $@

# The jli trace is created by the same recipe as classlist. By declaring these
# dependencies, make will correctly rebuild both jli trace and classlist
# incrementally using the single recipe above.
$(CLASSLIST_FILE): $(JLI_TRACE_FILE)
$(JLI_TRACE_FILE): $(INTERIM_IMAGE_DIR)/bin/java$(EXE_SUFFIX) $(CLASSLIST_JAR)

TARGETS += $(CLASSLIST_FILE) $(JLI_TRACE_FILE)

# Copy the classlist file into java.base libs
$(eval $(call SetupCopyFiles, COPY_CLASSLIST, \
    FILES := $(CLASSLIST_FILE), \
    DEST := $(SUPPORT_OUTPUTDIR)/modules_libs/java.base, \
))

TARGETS += $(COPY_CLASSLIST)

# Copy the default_jli_trace.txt file into jdk.jlink
$(eval $(call SetupCopyFiles, COPY_JLI_TRACE, \
    FILES := $(JLI_TRACE_FILE), \
    DEST := $(JDK_OUTPUTDIR)/modules/jdk.jlink/jdk/tools/jlink/internal/plugins, \
))

# Because of the single recipe for jli trace and classlist above, the
# COPY_JLI_TRACE rule needs to explicitly add the classlist file as a
# prerequisite.
$(COPY_JLI_TRACE): $(CLASSLIST_FILE)

TARGETS += $(COPY_JLI_TRACE)

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

all: $(TARGETS)
