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

################################################################################
# Build demos for the JDK into $(SUPPORT_OUTPUTDIR)/demos/image.
################################################################################

default: all

include $(SPEC)
include MakeBase.gmk
include JavaCompilation.gmk
include NativeCompilation.gmk
include SetupJavaCompilers.gmk
include TextFileProcessing.gmk
include ZipArchive.gmk

# Prepare the find cache.
$(eval $(call FillCacheFind, $(wildcard $(JDK_TOPDIR)/src/demo \
    $(JDK_TOPDIR)/src/*/demo)))

# Append demo goals to this variable.
TARGETS =

# The demo structure and contents should really be cleaned up.
# Now every other demo has its own quirks where to put the
# READMEs and other files.

DEMO_SHARE_SRC := $(JDK_TOPDIR)/src/demo/share
GLOBAL_VERSION_INFO_RESOURCE := $(JDK_TOPDIR)/src/java.base/windows/native/common/version.rc

DEMO_MANIFEST := $(SUPPORT_OUTPUTDIR)/demos/java-main-manifest.mf

# This rule will be depended on due to the MANIFEST line in SetupBuildDemo
# and SetupBuildJvmtiDemo.
$(eval $(call SetupTextFileProcessing, BUILD_JAVA_MANIFEST, \
  SOURCE_FILES := $(JDK_TOPDIR)/make/data/mainmanifest/manifest.mf, \
  OUTPUT_FILE := $(DEMO_MANIFEST), \
  REPLACEMENTS := \
      @@VERSION_SPECIFICATION@@ => $(VERSION_SPECIFICATION) ; \
      @@VERSION_SHORT@@ => $(VERSION_SHORT) ; \
      @@COMPANY_NAME@@ => $(COMPANY_NAME) , \
))

################################################################################
# Build applet demos.

# Setup make rules for building a demo applet.
#
# Parameter 1 is the name of the rule. This name is used as variable prefix,
# and the targets generated are listed in a variable by that name. It is also
# used to locate the name of the applet subdir, and to determine the name
# of the output directory.
#
# Remaining parameters are named arguments. These include:
# SRC_DIR   Alternative source directory to use for the demos.
# DISABLE_SJAVAC   Passed to SetupJavaCompilation

SetupBuildAppletDemo = $(NamedParamsMacroTemplate)
define SetupBuildAppletDemoBody
  ifeq ($$($1_SRC_DIR), )
    $1_SRC_DIR := $(DEMO_SHARE_SRC)/applets
  endif

  $$(eval $$(call SetupJavaCompilation, BUILD_DEMO_APPLET_$1, \
      SETUP := GENERATE_USINGJDKBYTECODE, \
      SRC := $$($1_SRC_DIR)/$1, \
      BIN := $(SUPPORT_OUTPUTDIR)/demos/image/applets/$1, \
      COPY := .html .java .xyz .obj .au .gif, \
      DISABLE_SJAVAC := $$($1_DISABLE_SJAVAC), \
  ))

  $1 := $$(BUILD_DEMO_APPLET_$1)

  TARGETS += $$($1)
endef

ifneq ($(OPENJDK_TARGET_OS), solaris)
  $(eval $(call SetupBuildAppletDemo, ArcTest))
  $(eval $(call SetupBuildAppletDemo, BarChart))
  $(eval $(call SetupBuildAppletDemo, Blink))
  $(eval $(call SetupBuildAppletDemo, CardTest))
  $(eval $(call SetupBuildAppletDemo, Clock))
  $(eval $(call SetupBuildAppletDemo, DitherTest))
  $(eval $(call SetupBuildAppletDemo, DrawTest))
  $(eval $(call SetupBuildAppletDemo, Fractal))
  $(eval $(call SetupBuildAppletDemo, GraphicsTest))
  $(eval $(call SetupBuildAppletDemo, NervousText))
  $(eval $(call SetupBuildAppletDemo, SimpleGraph))
  $(eval $(call SetupBuildAppletDemo, SortDemo))
  $(eval $(call SetupBuildAppletDemo, SpreadSheet))
endif

################################################################################
# Build normal demos.

COPY_TO_JAR := .html .txt .properties .js .gif .jpg .theme .data .opt .c .h \
    .png .ttf .xyz .obj README COPYRIGHT

COPY_TO_IMAGE := *.html *.txt *.png *.xml README*

# Setup make rules for building a demo.
#
# Parameter 1 is the name of the rule. This name is used as variable prefix,
# and the targets generated are listed in a variable by that name.
#
# Remaining parameters are named arguments. These include:
# DEMO_SUBDIR   The name of the subdir of the demo, below the demo top dir.
# EXTRA_SRC_DIR   Additional source directory.
# SRC_SUB_DIR   Optional subdir to locate source code in
# SRC_DIR   Alternative source directory to use for the demos.
# EXCLUDE_FILES   Exclude file list
# JAR_NAME   Base name of jar file. Defaults to $1.
# MAIN_CLASS   The main class for the jar. Defaults to $1.
# EXTRA_COPY_TO_JAR   Additional files to copy to jar (as patterns)
# EXTRA_COPY_TO_IMAGE   Additional files to copy to images (as wildcards)
# EXTRA_MANIFEST_ATTR   Extra manifest attribute
# SKIP_COMPILATION   Skip Java compilation iff true
# DISABLE_SJAVAC   Passed to SetupJavaCompilation
SetupBuildDemo = $(NamedParamsMacroTemplate)
define SetupBuildDemoBody
  ifeq ($$($1_SRC_DIR), )
    $1_SRC_DIR := $(DEMO_SHARE_SRC)
  endif

  $1_SRC_BASE := $$($1_SRC_DIR)/$$($1_DEMO_SUBDIR)/$1

  # In some demos the source is found in a subdir
  ifneq ($$($1_SRC_SUB_DIR), )
    $1_MAIN_SRC := $$($1_SRC_BASE)/$$($1_SRC_SUB_DIR)
  else
    # for allmost all
    $1_MAIN_SRC := $$($1_SRC_BASE)
  endif

  # Default is to use demo name as jar file name.
  ifeq ($$($1_JAR_NAME), )
    $1_JAR_NAME := $1
  endif

  # Default is to use demo name as jar main class.
  ifeq ($$($1_MAIN_CLASS), )
    $1_MAIN_CLASS := $1
  else ifeq ($$($1_MAIN_CLASS), NONE)
    $1_MAIN_CLASS :=
    $1_EXTRA_MANIFEST_ATTR += Main-Class: \n
  endif

  ifneq ($$($1_SKIP_COMPILATION), true)
    $$(eval $$(call SetupJavaCompilation, BUILD_DEMO_$1, \
        SETUP := GENERATE_USINGJDKBYTECODE, \
        SRC := $$($1_MAIN_SRC) $$($1_EXTRA_SRC_DIR), \
        BIN := $(SUPPORT_OUTPUTDIR)/demos/classes/$$($1_DEMO_SUBDIR)/$1, \
        COPY := $(COPY_TO_JAR) $$($1_EXTRA_COPY_TO_JAR), \
        JAR := $(SUPPORT_OUTPUTDIR)/demos/image/$$($1_DEMO_SUBDIR)/$1/$$($1_JAR_NAME).jar, \
        JARMAIN := $$($1_MAIN_CLASS), \
        MANIFEST := $(DEMO_MANIFEST), \
        EXTRA_MANIFEST_ATTR := $$($1_EXTRA_MANIFEST_ATTR), \
        SRCZIP := $(SUPPORT_OUTPUTDIR)/demos/image/$$($1_DEMO_SUBDIR)/$1/src.zip, \
        EXCLUDE_FILES := $$($1_EXCLUDE_FILES), \
        DISABLE_SJAVAC := $$($1_DISABLE_SJAVAC), \
    ))

    $1 += $$(BUILD_DEMO_$1)
  endif

  # Copy files. Sort is needed to remove duplicates.
  $1_COPY_FILES := $$(sort $$(wildcard $$(addprefix $$($1_SRC_BASE)/, \
      $(COPY_TO_IMAGE) $$($1_EXTRA_COPY_TO_IMAGE))))
  $$(eval $$(call SetupCopyFiles, COPY_DEMO_$1, \
      SRC :=  $$($1_SRC_BASE), \
      DEST := $(SUPPORT_OUTPUTDIR)/demos/image/$$($1_DEMO_SUBDIR)/$1, \
      FILES := $$($1_COPY_FILES), \
  ))

  $1 += $$(COPY_DEMO_$1)

  TARGETS += $$($1)
endef

CODEPOINT_SERVICE := java.awt.im.spi.InputMethodDescriptor
CODEPOINT_METAINF_SERVICE_FILE := \
    $(SUPPORT_OUTPUTDIR)/demos/classes/jfc/CodePointIM/META-INF/services/$(CODEPOINT_SERVICE)

$(eval $(call SetupBuildDemo, CodePointIM, \
    DEMO_SUBDIR := jfc, \
    EXTRA_COPY_TO_JAR := $(CODEPOINT_SERVICE), \
))

# We also need to copy the CODEPOINT_SERVICE file to the META-INF/services
# location, and make sure the jar depends on that file to get it included.
$(CODEPOINT_METAINF_SERVICE_FILE): $(DEMO_SHARE_SRC)/jfc/CodePointIM/$(CODEPOINT_SERVICE)
	$(call install-file)

$(BUILD_DEMO_CodePointIM_JAR): $(CODEPOINT_METAINF_SERVICE_FILE)

ifneq ($(OPENJDK_TARGET_OS), solaris)
  $(eval $(call SetupBuildDemo, MoleculeViewer, \
      DEMO_SUBDIR := applets, \
      MAIN_CLASS := XYZChemModel, \
      EXTRA_COPY_TO_IMAGE := *.java, \
  ))

  $(eval $(call SetupBuildDemo, WireFrame, \
      DEMO_SUBDIR := applets, \
      MAIN_CLASS := ThreeD, \
      EXTRA_COPY_TO_IMAGE := *.java, \
  ))

  $(eval $(call SetupBuildDemo, SwingApplet, \
      DEMO_SUBDIR := jfc, \
  ))
endif

$(eval $(call SetupBuildDemo, FileChooserDemo, \
    DEMO_SUBDIR := jfc, \
))

$(eval $(call SetupBuildDemo, Font2DTest, \
    DEMO_SUBDIR := jfc, \
))

$(eval $(call SetupBuildDemo, Metalworks, \
    DEMO_SUBDIR := jfc, \
))

$(eval $(call SetupBuildDemo, Notepad, \
    DEMO_SUBDIR := jfc, \
))

$(eval $(call SetupBuildDemo, SampleTree, \
    DEMO_SUBDIR := jfc, \
))

$(eval $(call SetupBuildDemo, TableExample, \
    DEMO_SUBDIR := jfc, \
))

$(eval $(call SetupBuildDemo, TransparentRuler, \
    DEMO_SUBDIR := jfc, \
    MAIN_CLASS := transparentruler.Ruler, \
))

################################################################################
# Copy html and README files.

$(SUPPORT_OUTPUTDIR)/demos/image/README: $(DEMO_SHARE_SRC)/README
	$(call install-file)

TARGETS += $(SUPPORT_OUTPUTDIR)/demos/image/README

################################################################################
# Copy netbeans project files.

$(SUPPORT_OUTPUTDIR)/demos/image/nbproject/%: $(DEMO_SHARE_SRC)/nbproject/%
	$(call install-file)
	$(CHMOD) -f ug+w $@

ifeq ($(OPENJDK_TARGET_OS), solaris)
  TARGETS += $(patsubst $(DEMO_SHARE_SRC)/nbproject/%, \
    $(SUPPORT_OUTPUTDIR)/demos/image/nbproject/%, \
    $(filter-out $(DEMO_SHARE_SRC)/nbproject/jfc/SwingApplet%, \
    $(call CacheFind, $(DEMO_SHARE_SRC)/nbproject)))
else
  TARGETS += $(patsubst $(DEMO_SHARE_SRC)/nbproject/%, \
    $(SUPPORT_OUTPUTDIR)/demos/image/nbproject/%, \
    $(call CacheFind, $(DEMO_SHARE_SRC)/nbproject))
endif

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

ifneq ($(filter images, $(MAKECMDGOALS)), )
  $(eval $(call SetupCopyFiles, COPY_TO_TEST_IMAGE, \
      SRC := $(SUPPORT_OUTPUTDIR)/demos/image, \
      DEST := $(TEST_IMAGE_DIR)/jdk/demos, \
      FILES := $(call DoubleDollar, $(call CacheFind, $(SUPPORT_OUTPUTDIR)/demos/image)), \
  ))

  IMAGES_TARGETS := $(COPY_TO_TEST_IMAGE)
endif

################################################################################
# Hook to include the corresponding custom file, if present.
$(eval $(call IncludeCustomExtension, jdk, CompileDemos.gmk))

all: $(TARGETS)
images: $(IMAGES_TARGETS)

.PHONY: all
