#
# Copyright (c) 2010, 2017, 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)))

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, \
    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)

compile: $(NASGEN_RUN_FILE) $(BUILD_VERSION_FILE)
all: compile

.PHONY: compile all
