#
# 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/tools \
    $(JDK_TOPDIR)/src/solaris/classes \
    $(JDK_TOPDIR)/makefiles/sun))

TOOLS_SRC:=$(JDK_TOPDIR)/make/tools/src \
           $(JDK_TOPDIR)/makefiles/sun/awt/ \
           $(JDK_TOPDIR)/makefiles/sun/osxapp \
           $(JDK_TOPDIR)/make/tools/swing-beans

ifneq ($(OPENJDK_TARGET_OS),windows)
  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))

# Resources used by CheckDeps tool
$(JDK_OUTPUTDIR)/btclasses/build/tools/deps/% : \
		$(JDK_TOPDIR)/make/tools/src/build/tools/deps/%
	$(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

# The comment checker is not currently used. Should it be removed or added to javac?
TOOL_COMMENTCHECKER=$(JAVA) -cp $(JDK_OUTPUTDIR)/btclasses \
	build.tools.commentchecker.CommentChecker

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_DIRDIFF=$(JAVA) -cp $(JDK_OUTPUTDIR)/btclasses \
	build.tools.dirdiff.DirDiff

TOOL_DTDBUILDER=$(JAVA) -Ddtd_home=$(JDK_TOPDIR)/make/tools/dtdbuilder/dtds \
	-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

# Jarsplit used in jdk/makefiles/common/Release.gmk
TOOL_JARSPLIT=$(JAVA) -cp $(JDK_OUTPUTDIR)/btclasses \
	build.tools.jarsplit.JarSplit

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

# TODO: Only referenced in jdk/make/tools/sharing/README.txt. Find out what it means.
TOOL_MAKECLASSLIST=$(JAVA) -cp $(JDK_OUTPUTDIR)/btclasses \
	build.tools.makeclasslist.MakeClasslist

# 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 \
	sun.awt.ToBin

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

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

TOOL_REMOVEMETHODS=$(JAVA) -Xbootclasspath/p:$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar \
    -cp $(JDK_OUTPUTDIR)/btclasses:$(JDK_OUTPUTDIR) \
        build.tools.classfile.RemoveMethods

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

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

# Tools needed on solaris because OBJCOPY is broken.

$(eval $(call SetupNativeCompilation,ADD_GNU_DEBUGLINK,\
		SRC:=$(JDK_TOPDIR)/make/tools/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/tools/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))
