#
# Copyright (c) 2014, 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
include GensrcProperties.gmk
include Execute.gmk

$(eval $(call SetupVersionProperties, JAVAC_VERSION, \
    com/sun/tools/javac/resources/version.properties))

$(eval $(call SetupCompileProperties, COMPILE_PROPERTIES, \
    SRC_DIRS := $(TOPDIR)/src/$(MODULE)/share/classes, \
    EXTRA_FILES := $(JAVAC_VERSION), \
    CLASS := java.util.ListResourceBundle, \
    TYPE := langtools, \
))

TARGETS += $(COMPILE_PROPERTIES)

################################################################################
#
# Compile properties files into enum-like classes using the propertiesparser tool
#

# To avoid reevaluating the compilation setup for the tools each time this file
# is included, the following trick is used to be able to declare a dependency on
# the built tools.
BUILD_TOOLS_LANGTOOLS := $(call SetupJavaCompilationCompileTarget, \
    BUILD_TOOLS_LANGTOOLS, $(BUILDTOOLS_OUTPUTDIR)/langtools_tools_classes)

TOOL_PARSEPROPERTIES_CMD := $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/langtools_tools_classes \
    propertiesparser.PropertiesParser

PARSEPROPERTIES_PACKAGE := com/sun/tools/javac/resources
PARSEPROPERTIES_FILES := compiler.properties launcher.properties

PARSEPROPERTIES_SRC := $(addprefix \
    $(MODULE_SRC)/share/classes/$(PARSEPROPERTIES_PACKAGE)/, \
    $(PARSEPROPERTIES_FILES))

PARSEPROPERTIES_ARGS := $(foreach file, $(PARSEPROPERTIES_SRC), \
    -compile $(file) \
    $(SUPPORT_OUTPUTDIR)/gensrc/$(MODULE)/$(PARSEPROPERTIES_PACKAGE)/)

$(eval $(call SetupExecute, PARSEPROPERTIES, \
    WARN := Generating classes for $(PARSEPROPERTIES_FILES), \
    DEPS := $(PARSEPROPERTIES_SRC) $(BUILD_TOOLS_LANGTOOLS), \
    OUTPUT_DIR := $(SUPPORT_OUTPUTDIR)/gensrc/$(MODULE), \
    COMMAND := $(TOOL_PARSEPROPERTIES_CMD) $(PARSEPROPERTIES_ARGS), \
))

TARGETS += $(PARSEPROPERTIES)

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