#
# Copyright (c) 2010, 2016, 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 must be the first rule
default: all

include $(SPEC)
include MakeBase.gmk
include JarArchive.gmk
include JavaCompilation.gmk
include SetupJavaCompilers.gmk
include TextFileProcessing.gmk

JDK_CLASSES := $(call PathList, $(strip $(addprefix $(JDK_OUTPUTDIR)/modules/, \
      java.base java.logging java.scripting jdk.dynalink)))

NASHORN_JAR := $(IMAGES_OUTPUTDIR)/nashorn.jar

MODULESOURCEPATH := $(NASHORN_TOPDIR)/src/*/share/classes

# Need to use source and target 8 for nasgen to work.
$(eval $(call SetupJavaCompiler,GENERATE_NEWBYTECODE_DEBUG, \
    JVM := $(JAVA_JAVAC), \
    JAVAC := $(NEW_JAVAC), \
    FLAGS := -g -source 9 -target 9 --upgrade-module-path "$(JDK_OUTPUTDIR)/modules/" \
         --system none --module-source-path "$(MODULESOURCEPATH)", \
    SERVER_DIR := $(SJAVAC_SERVER_DIR), \
    SERVER_JVM := $(SJAVAC_SERVER_JAVA)))

# Build nashorn into intermediate directory
# Name the compilation setup the same as the module, as is done in the global
# CompileJavaModules.gmk, to make dependency checking with other modules work
# seamlessly.
$(eval $(call SetupJavaCompilation,jdk.scripting.nashorn, \
    SETUP := GENERATE_NEWBYTECODE_DEBUG, \
    MODULE := jdk.scripting.nashorn, \
    SRC := $(NASHORN_TOPDIR)/src/jdk.scripting.nashorn/share/classes, \
    EXCLUDE_FILES := META-INF/MANIFEST.MF, \
    COPY := .properties .js, \
    BIN := $(SUPPORT_OUTPUTDIR)/special_classes))

NASGEN_SRC := $(NASHORN_TOPDIR)/buildtools/nasgen/src
ASM_SRC := $(JDK_TOPDIR)/src/java.base/share/classes/jdk/internal/org/objectweb/asm

# Build nasgen
$(eval $(call SetupJavaCompilation,BUILD_NASGEN, \
    SETUP := GENERATE_OLDBYTECODE, \
    SRC := $(NASGEN_SRC) $(ASM_SRC), \
    BIN := $(BUILDTOOLS_OUTPUTDIR)/nasgen_classes))

NASHORN_CLASSES_DIR := $(JDK_OUTPUTDIR)/modules/jdk.scripting.nashorn
NASGEN_RUN_FILE := $(NASHORN_CLASSES_DIR)/_the.nasgen.run

ifeq ($(BOOT_JDK_MODULAR), true)
  NASGEN_OPTIONS := \
      -cp $(BUILDTOOLS_OUTPUTDIR)/nasgen_classes \
      --patch-module java.base=$(BUILDTOOLS_OUTPUTDIR)/nasgen_classes \
      --add-exports java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED \
      --add-exports java.base/jdk.internal.org.objectweb.asm.util=ALL-UNNAMED \
      #
else
  NASGEN_OPTIONS := \
      -Xbootclasspath/p:$(BUILDTOOLS_OUTPUTDIR)/nasgen_classes
endif

# Copy classes to final classes dir and run nasgen to modify classes in jdk.nashorn.internal.objects package
$(NASGEN_RUN_FILE): $(BUILD_NASGEN) $(jdk.scripting.nashorn)
	$(ECHO) Running nasgen
	$(MKDIR) -p $(@D)
	$(RM) -rf $(@D)/jdk $(@D)/netscape
	$(CP) -R -p $(SUPPORT_OUTPUTDIR)/special_classes/jdk.scripting.nashorn/* $(@D)/
	$(JAVA_SMALL) $(NASGEN_OPTIONS) \
	    jdk.nashorn.internal.tools.nasgen.Main $(@D) jdk.nashorn.internal.objects $(@D)
	$(TOUCH) $@

# Version file needs to be processed with version numbers
$(eval $(call SetupTextFileProcessing, BUILD_VERSION_FILE, \
  SOURCE_FILES := $(NASHORN_TOPDIR)/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/resources/version.properties.template, \
  OUTPUT_FILE := $(JDK_OUTPUTDIR)/modules/jdk.scripting.nashorn/jdk/nashorn/internal/runtime/resources/version.properties, \
  REPLACEMENTS := \
      @@VERSION_STRING@@ => $(VERSION_STRING) ; \
      @@VERSION_SHORT@@ => $(VERSION_SHORT) , \
))

# Version processing needs to happen after nasgen run since nasgen run deletes it
$(BUILD_VERSION_FILE): $(NASGEN_RUN_FILE)


MANIFEST_ATTRIBUTES := Name: jdk/nashorn/\nImplementation-Title: Oracle Nashorn\nImplementation-Version: $(VERSION_SHORT)

# Create nashorn.jar from the final classes dir
$(eval $(call SetupJarArchive,BUILD_NASHORN_JAR, \
    DEPENDENCIES := $(NASGEN_RUN_FILE) $(BUILD_VERSION_FILE), \
    SRCS := $(NASHORN_CLASSES_DIR), \
    SUFFIXES := .class .js .properties Factory, \
    MANIFEST := $(NASHORN_TOPDIR)/src/jdk.scripting.nashorn/share/classes/META-INF/MANIFEST.MF, \
    EXTRA_MANIFEST_ATTR := $(MANIFEST_ATTRIBUTES), \
    SKIP_METAINF := true, \
    JAR := $(NASHORN_JAR), \
))

compile: $(NASHORN_RUN_FILE) $(BUILD_VERSION_FILE)
all: $(NASHORN_JAR)

.PHONY: compile all
