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

default: all

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

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

$(eval $(call IncludeCustomExtension, CompileTools.gmk))

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

# Use += to be able to add to this from a custom extension
BUILD_TOOLS_SRC_DIRS += \
    $(TOPDIR)/make/jdk/src/classes \
    $(BUILDTOOLS_OUTPUTDIR)/interim_cldrconverter_classes \
    $(BUILDTOOLS_OUTPUTDIR)/interim_tzdb_classes \
    #

$(eval $(call SetupJavaCompilation,BUILD_TOOLS_JDK, \
    SETUP := GENERATE_OLDBYTECODE, \
    SRC := $(BUILD_TOOLS_SRC_DIRS), \
    EXCLUDES := \
        build/tools/classlist \
        build/tools/deps \
        build/tools/docs \
        build/tools/jigsaw \
        build/tools/depend \
        , \
    BIN := $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes, \
    ADD_JAVAC_FLAGS := \
        --add-exports java.desktop/sun.awt=ALL-UNNAMED \
        --add-exports java.base/sun.text=ALL-UNNAMED \
        , \
))

TARGETS += $(BUILD_TOOLS_JDK)

$(eval $(call SetupCopyFiles,COPY_NIMBUS_TEMPLATES, \
    SRC := $(TOPDIR)/src/java.desktop/share/classes/javax/swing/plaf/nimbus, \
    DEST := $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes/build/tools/generatenimbus/resources, \
    FILES := $(wildcard $(TOPDIR)/src/java.desktop/share/classes/javax/swing/plaf/nimbus/*.template)))

TARGETS += $(COPY_NIMBUS_TEMPLATES)

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

$(eval $(call SetupJavaCompilation, COMPILE_DEPEND, \
    SETUP := GENERATE_OLDBYTECODE, \
    SRC := $(TOPDIR)/make/jdk/src/classes, \
    INCLUDES := build/tools/depend, \
    BIN := $(BUILDTOOLS_OUTPUTDIR)/depend, \
))

DEPEND_SERVICE_PROVIDER := $(BUILDTOOLS_OUTPUTDIR)/depend/META-INF/services/com.sun.source.util.Plugin

$(DEPEND_SERVICE_PROVIDER):
	$(call MakeDir, $(BUILDTOOLS_OUTPUTDIR)/depend/META-INF/services)
	$(ECHO) build.tools.depend.Depend > $@

TARGETS += $(COMPILE_DEPEND) $(DEPEND_SERVICE_PROVIDER)

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

# To be able to call the javascript filter when generating man pages using
# pandoc, we need to create this executable wrapper script.
ifeq ($(ENABLE_PANDOC), true)
  # PANDOC_TROFF_MANPAGE_FILTER is duplicated for export in ToolsJdk.gmk.
  PANDOC_TROFF_MANPAGE_FILTER := \
      $(BUILDTOOLS_OUTPUTDIR)/manpages/pandoc-troff-manpage-filter
  PANDOC_TROFF_MANPAGE_FILTER_SETUP := \
      $(BUILDTOOLS_OUTPUTDIR)/manpages/_pandoc_troff_manpage_filter_setup.marker

  # Create a usable instance of the wrapper script that calls the pandoc filter
  # (which is written in javascript).
  $(eval $(call SetupTextFileProcessing, CREATE_PANDOC_TROFF_MANPAGE_FILTER, \
      SOURCE_FILES := $(TOPDIR)/make/scripts/pandoc-troff-manpage-filter.sh.template, \
      OUTPUT_FILE := $(PANDOC_TROFF_MANPAGE_FILTER), \
      REPLACEMENTS := \
          @@BOOT_JDK@@ => $(BOOT_JDK) ; \
          @@TOPDIR@@ => $(TOPDIR) ; \
          @@JJS_FLAGS@@ => $(addprefix -J, $(JAVA_FLAGS_SMALL)), \
  ))

  # Created script must be made executable
  $(PANDOC_TROFF_MANPAGE_FILTER_SETUP): $(CREATE_PANDOC_TROFF_MANPAGE_FILTER)
	$(CHMOD) a+rx $(PANDOC_TROFF_MANPAGE_FILTER)
	$(TOUCH) $@

  TARGETS += $(PANDOC_TROFF_MANPAGE_FILTER_SETUP)

  # PANDOC_HTML_MANPAGE_FILTER is duplicated for export in ToolsJdk.gmk.
  PANDOC_HTML_MANPAGE_FILTER := \
      $(BUILDTOOLS_OUTPUTDIR)/manpages/pandoc-html-manpage-filter
  PANDOC_HTML_MANPAGE_FILTER_SETUP := \
      $(BUILDTOOLS_OUTPUTDIR)/manpages/_pandoc_html_manpage_filter_setup.marker

  # Create a usable instance of the wrapper script that calls the pandoc filter
  # (which is written in javascript).
  $(eval $(call SetupTextFileProcessing, CREATE_PANDOC_HTML_MANPAGE_FILTER, \
      SOURCE_FILES := $(TOPDIR)/make/scripts/pandoc-html-manpage-filter.sh.template, \
      OUTPUT_FILE := $(PANDOC_HTML_MANPAGE_FILTER), \
      REPLACEMENTS := \
          @@BOOT_JDK@@ => $(BOOT_JDK) ; \
          @@TOPDIR@@ => $(TOPDIR) ; \
          @@JJS_FLAGS@@ => $(addprefix -J, $(JAVA_FLAGS_SMALL)), \
  ))

  # Created script must be made executable
  $(PANDOC_HTML_MANPAGE_FILTER_SETUP): $(CREATE_PANDOC_HTML_MANPAGE_FILTER)
	$(CHMOD) a+rx $(PANDOC_HTML_MANPAGE_FILTER)
	$(TOUCH) $@

  TARGETS += $(PANDOC_HTML_MANPAGE_FILTER_SETUP)
endif

all: $(TARGETS)
