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

# Cache all finds needed for this file. Only used on windows.
$(eval $(call FillCacheFind, $(JDK_TOPDIR)/make/src/classes))

TOOLS_SRC := $(JDK_TOPDIR)/make/src/classes

ifeq ($(findstring $(OPENJDK_TARGET_OS),windows macosx),)
  TOOLS_SRC += $(JDK_TOPDIR)/src/solaris/classes/sun/awt/X11/generator
endif

# The exception handling of swing beaninfo which have the own tool directory
ifeq (, $(BUILD_TOOLS))
  $(eval $(call SetupJavaCompilation,BUILD_TOOLS, \
      SETUP := GENERATE_OLDBYTECODE, \
      SRC := $(TOOLS_SRC), \
      BIN := $(JDK_OUTPUTDIR)/btclasses))
endif

$(JDK_OUTPUTDIR)/btclasses/build/tools/generatenimbus/resources/%.template: \
    $(JDK_TOPDIR)/src/share/classes/javax/swing/plaf/nimbus/%.template
	$(call install-file)

BUILD_TOOLS += $(foreach i, $(wildcard $(JDK_TOPDIR)/src/share/classes/javax/swing/plaf/nimbus/*.template), $(JDK_OUTPUTDIR)/btclasses/build/tools/generatenimbus/resources/$(notdir $i))

# Resource used by CheckDeps tool
$(JDK_OUTPUTDIR)/btclasses/build/tools/deps/refs.allowed: \
    $(JDK_TOPDIR)/make/data/checkdeps/refs.allowed
	$(call install-file)

BUILD_TOOLS += $(JDK_OUTPUTDIR)/btclasses/build/tools/deps/refs.allowed

# Add a checksum ("jsum") to the end of a text file. Prevents trivial tampering with class lists.
TOOL_ADDJSUM = $(JAVA) -cp $(JDK_OUTPUTDIR)/btclasses \
    build.tools.addjsum.AddJsum

# The buildmetaindex tool creates a meta-index to make core class loaders lazier.
TOOL_BUILDMETAINDEX = $(JAVA) -cp $(JDK_OUTPUTDIR)/btclasses \
    build.tools.buildmetaindex.BuildMetaIndex

TOOL_COMPILEFONTCONFIG = $(JAVA) -cp $(JDK_OUTPUTDIR)/btclasses \
    build.tools.compilefontconfig.CompileFontConfig

TOOL_COMPILEPROPERTIES = $(JAVA) -cp $(JDK_OUTPUTDIR)/btclasses \
    build.tools.compileproperties.CompileProperties

TOOL_STRIPPROPERTIES = $(JAVA) -cp $(JDK_OUTPUTDIR)/btclasses \
    build.tools.stripproperties.StripProperties

TOOL_JARREORDER = $(JAVA) -cp $(JDK_OUTPUTDIR)/btclasses \
    build.tools.jarreorder.JarReorder

TOOL_GENERATECHARACTER = $(JAVA) -cp $(JDK_OUTPUTDIR)/btclasses \
    build.tools.generatecharacter.GenerateCharacter

TOOL_CHARACTERNAME = $(JAVA) -cp $(JDK_OUTPUTDIR)/btclasses \
    build.tools.generatecharacter.CharacterName

TOOL_DTDBUILDER = $(JAVA) -Ddtd_home=$(JDK_TOPDIR)/make/data/dtdbuilder \
    -cp $(JDK_OUTPUTDIR)/btclasses build.tools.dtdbuilder.DTDBuilder

TOOL_GENERATEBREAKITERATORDATA = $(JAVA) \
    -cp $(JDK_OUTPUTDIR)/btclasses \
    build.tools.generatebreakiteratordata.GenerateBreakIteratorData

TOOL_GENERATECURRENCYDATA = $(JAVA) -cp $(JDK_OUTPUTDIR)/btclasses \
    build.tools.generatecurrencydata.GenerateCurrencyData

TOOL_HASHER = $(JAVA) -cp $(JDK_OUTPUTDIR)/btclasses \
    build.tools.hasher.Hasher

TOOL_TZDB = $(JAVA) -cp $(JDK_OUTPUTDIR)/btclasses \
    build.tools.tzdb.TzdbZoneRulesCompiler


# TODO: There are references to the jdwpgen.jar in jdk/make/netbeans/jdwpgen/build.xml
# and nbproject/project.properties in the same dir. Needs to be looked at.
TOOL_JDWPGEN = $(JAVA) -cp $(JDK_OUTPUTDIR)/btclasses build.tools.jdwpgen.Main

# TODO: Lots of files in jdk/make/tools/CharsetMapping dir
TOOL_CHARSETMAPPING = $(JAVA) -cp $(JDK_OUTPUTDIR)/btclasses \
    build.tools.charsetmapping.Main

TOOL_SPP = $(JAVA) -cp $(JDK_OUTPUTDIR)/btclasses build.tools.spp.Spp

# Nimbus is used somewhere in the swing build.
TOOL_GENERATENIMBUS = $(JAVA) -cp $(JDK_OUTPUTDIR)/btclasses \
    build.tools.generatenimbus.Generator

TOOL_WRAPPERGENERATOR = $(JAVA) -cp $(JDK_OUTPUTDIR)/btclasses \
    WrapperGenerator

TOOL_AWT_TOBIN = $(JAVA) -Djava.awt.headless=true -cp $(JDK_OUTPUTDIR)/btclasses \
    build.tools.icondata.awt.ToBin

TOOL_OSX_TOBIN = $(JAVA) -Djava.awt.headless=true -cp $(JDK_OUTPUTDIR)/btclasses \
    build.tools.icondata.osxapp.ToBin

TOOL_CLDRCONVERTER = $(JAVA) -cp $(JDK_OUTPUTDIR)/btclasses \
    build.tools.cldrconverter.CLDRConverter

TOOL_CHECKDEPS = $(JAVA) -Xbootclasspath/p:$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar \
    -cp $(JDK_OUTPUTDIR)/btclasses:$(JDK_OUTPUTDIR) \
    build.tools.deps.CheckDeps

TOOL_ADDTORESTRICTEDPKGS=$(JAVA) -cp $(JDK_OUTPUTDIR)/btclasses \
 	build.tools.addtorestrictedpkgs.AddToRestrictedPkgs

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

# Tools needed on solaris because OBJCOPY is broken.

ifeq ($(OPENJDK_TARGET_OS), solaris)
$(eval $(call SetupNativeCompilation,ADD_GNU_DEBUGLINK, \
    SRC := $(JDK_TOPDIR)/make/src/native/add_gnu_debuglink, \
    LANG := C, \
    CC := $(BUILD_CC), \
    LDEXE := $(BUILD_LD), \
    LDFLAGS := -lelf, \
    OBJECT_DIR := $(JDK_OUTPUTDIR)/objs/add_gnu_debuglink, \
    OUTPUT_DIR := $(JDK_OUTPUTDIR)/btbin, \
    PROGRAM := add_gnu_debuglink))

$(eval $(call SetupNativeCompilation,FIX_EMPTY_SEC_HDR_FLAGS, \
    SRC := $(JDK_TOPDIR)/make/src/native/fix_empty_sec_hdr_flags, \
    LANG := C, \
    CC := $(BUILD_CC), \
    LDEXE := $(BUILD_LD), \
    LDFLAGS := -lelf, \
    OBJECT_DIR := $(JDK_OUTPUTDIR)/objs/fix_empty_sec_hdr_flags, \
    OUTPUT_DIR := $(JDK_OUTPUTDIR)/btbin, \
    PROGRAM := fix_empty_sec_hdr_flags))
endif
