#
# Copyright (c) 2011, 2023, 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 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_tzdb_classes \
    #

$(eval $(call SetupJavaCompilation, BUILD_TOOLS_JDK, \
    TARGET_RELEASE := $(TARGET_RELEASE_BOOTJDK), \
    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, \
    DISABLED_WARNINGS := options, \
    JAVAC_FLAGS := \
        --add-exports java.desktop/sun.awt=ALL-UNNAMED \
        --add-exports java.base/sun.text=ALL-UNNAMED \
        --add-exports java.base/sun.security.util=ALL-UNNAMED \
        --add-exports jdk.internal.opt/jdk.internal.opt=jdk.compiler.interim \
        --add-exports jdk.internal.opt/jdk.internal.opt=jdk.javadoc.interim, \
))

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 SetupCopyFiles,COPY_CLDRCONVERTER_PROPERTIES, \
    SRC := $(TOPDIR)/make/jdk/src/classes/build/tools/cldrconverter, \
    DEST := $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes/build/tools/cldrconverter, \
    FILES := $(wildcard $(TOPDIR)/make/jdk/src/classes/build/tools/cldrconverter/*.properties)))

TARGETS += $(COPY_CLDRCONVERTER_PROPERTIES)

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

$(eval $(call SetupJavaCompilation, COMPILE_DEPEND, \
    TARGET_RELEASE := $(TARGET_RELEASE_BOOTJDK), \
    SRC := $(TOPDIR)/make/jdk/src/classes, \
    INCLUDES := build/tools/depend, \
    BIN := $(BUILDTOOLS_OUTPUTDIR)/depend, \
    DISABLED_WARNINGS := options, \
    JAVAC_FLAGS := \
        --add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED \
        --add-exports jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED \
        --add-exports jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED \
        --add-exports jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED \
        --add-exports jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED \
        --add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED \
        --add-exports jdk.internal.opt/jdk.internal.opt=jdk.compiler.interim \
        --add-exports jdk.internal.opt/jdk.internal.opt=jdk.javadoc.interim, \
))

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 := \
          @@JAVA_SMALL@@ => $(JAVA_SMALL) ; \
          @@BUILDTOOLS_OUTPUTDIR@@ => $(BUILDTOOLS_OUTPUTDIR) ; \
  ))

  # 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 := \
          @@JAVA_SMALL@@ => $(JAVA_SMALL) ; \
          @@BUILDTOOLS_OUTPUTDIR@@ => $(BUILDTOOLS_OUTPUTDIR) ; \
  ))

  # 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)
