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

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

include GensrcCommon.gmk

################################################################################
# Translate the Java debugger wire protocol (jdwp.spec) file into a front-end
# Java implementation (JDWP.java), a back-end C header file (JDWPCommands.h) and
# an HTML documentation file (jdwp-protocol.html).

JDWP_SPEC_FILE := $(TOPDIR)/src/java.se/share/data/jdwp/jdwp.spec
HEADER_FILE := $(SUPPORT_OUTPUTDIR)/headers/jdk.jdwp.agent/JDWPCommands.h
JAVA_FILE := $(SUPPORT_OUTPUTDIR)/gensrc/jdk.jdi/com/sun/tools/jdi/JDWP.java
HTML_FILE := $(SUPPORT_OUTPUTDIR)/gensrc/jdk.jdi/jdwp-protocol.html

# Both the header and java file are created using the same recipe. By declaring
# this rule and adding header file to dependencies for java file, both are
# rebuilt if either is missing
$(HEADER_FILE): $(JDWP_SPEC_FILE) $(BUILD_TOOLS_JDK)

# Touch the target of this rule at the end to avoid triggering false rebuilds
$(JAVA_FILE): $(JDWP_SPEC_FILE) $(BUILD_TOOLS_JDK) $(HEADER_FILE)
	$(call LogInfo, Creating JDWP.java and JDWPCommands.h from jdwp.spec)
	$(call MakeDir, $(@D) $(SUPPORT_OUTPUTDIR)/headers/jdk.jdwp.agent)
	$(RM) $@ $(SUPPORT_OUTPUTDIR)/headers/jdk.jdwp.agent/JDWPCommands.h
	$(TOOL_JDWPGEN) $< -jdi $@ -include \
	    $(SUPPORT_OUTPUTDIR)/headers/jdk.jdwp.agent/JDWPCommands.h
	$(TOUCH) $@

$(HTML_FILE): $(JDWP_SPEC_FILE) \
    $(BUILD_TOOLS_JDK)
	$(call LogInfo, Creating $(@F) from jdwp.spec)
	$(call MakeDir, $(@D))
	$(RM) $@
	$(TOOL_JDWPGEN) $< -doc $@

TARGETS += $(JAVA_FILE) $(HEADER_FILE) $(HTML_FILE)

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

include GensrcProperties.gmk

$(eval $(call SetupCompileProperties, COMPILE_PROPERTIES, \
    SRC_DIRS := $(TOPDIR)/src/jdk.jdi/share/classes/com/sun/tools/jdi/resources, \
    CLASS := ListResourceBundle, \
))

TARGETS += $(COMPILE_PROPERTIES)

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