#
# Copyright (c) 2012, 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 MakeFileStart.gmk

################################################################################
# This file is responsible for extracting the x11 native struct offsets to
# the xawt Java library. The tool needs to be run on the os/arch that
# will host the final jvm, thus the tool cannot be used when cross compiling.
#
# Two versions of the generated offset file, sizes-32.txt and sizes-64.txt are
# committed into the source code repository. These are the ones used in
# GensrcX11Wrappers.gmk to generate the Java code during the build.
################################################################################

include Execute.gmk
include JdkNativeCompilation.gmk
include $(TOPDIR)/make/ToolsJdk.gmk

ifeq ($(COMPILE_TYPE), cross)
  $(error It is not possible to update the x11wrappers when cross-compiling)
endif

BITS := $(OPENJDK_TARGET_CPU_BITS)

X11WRAPPERS_OUTPUT := $(SUPPORT_OUTPUTDIR)/x11wrappers
GENERATOR_SOURCE_FILE := $(X11WRAPPERS_OUTPUT)/src/data_generator.c

GENSRC_X11WRAPPERS_DATADIR := $(TOPDIR)/src/java.desktop/unix/data/x11wrappergen
WRAPPER_OUTPUT_FILE := $(GENSRC_X11WRAPPERS_DATADIR)/sizes-$(BITS).txt

# Generate the C code for the program that will output the offset file.
$(eval $(call SetupExecute, gensrc_generator, \
    INFO := Generating X11 wrapper data generator source code, \
    DEPS := $(GENSRC_X11WRAPPERS_DATADIR)/xlibtypes.txt $(BUILD_TOOLS_JDK), \
    OUTPUT_FILE := $(GENERATOR_SOURCE_FILE), \
    COMMAND := $(TOOL_WRAPPERGENERATOR) gen_c_source $(GENERATOR_SOURCE_FILE) \
        $(GENSRC_X11WRAPPERS_DATADIR)/xlibtypes.txt $(BITS), \
))

DATA_GENERATOR_INCLUDES := \
    -I$(TOPDIR)/src/hotspot/share/include \
    -I$(TOPDIR)/src/hotspot/os/$(HOTSPOT_TARGET_OS_TYPE)/include \
    -I$(SUPPORT_OUTPUTDIR)/modules_include/java.base \
    -I$(SUPPORT_OUTPUTDIR)/modules_include/java.base/$(OPENJDK_TARGET_OS_INCLUDE_SUBDIR) \
    -I$(TOPDIR)/src/java.base/share/native/libjava \
    -I$(TOPDIR)/src/java.base/$(OPENJDK_TARGET_OS_TYPE)/native/libjava \
    -I$(TOPDIR)/src/java.desktop/$(OPENJDK_TARGET_OS_TYPE)/native/common/awt \
    -I$(TOPDIR)/src/java.desktop/share/native/common/awt/debug \
    -I$(TOPDIR)/src/java.desktop/share/native/libawt/awt/image/cvutils \
    #

################################################################################
## Build data_generator
################################################################################

# Compile the generated C code into an executable.
$(eval $(call SetupJdkExecutable, BUILD_DATA_GENERATOR, \
    NAME := data_generator, \
    EXTRA_FILES := $(GENERATOR_SOURCE_FILE), \
    CFLAGS := $(X_CFLAGS) $(DATA_GENERATOR_INCLUDES), \
    LIBS := $(X_LIBS), \
    OUTPUT_DIR := $(X11WRAPPERS_OUTPUT)/bin, \
    OBJECT_DIR := $(X11WRAPPERS_OUTPUT)/objs, \
))

# Run the executable to create the data file.
$(eval $(call SetupExecute, run_wrappergen, \
    INFO := Generating X11 wrapper data files, \
    DEPS := $(BUILD_DATA_GENERATOR), \
    OUTPUT_FILE := $(WRAPPER_OUTPUT_FILE), \
    SUPPORT_DIR := $(X11WRAPPERS_OUTPUT)/run-wrapper, \
    COMMAND := $(BUILD_DATA_GENERATOR_TARGET) | $(SORT) > $(WRAPPER_OUTPUT_FILE), \
))

wrapper-information: $(run_wrappergen)
	$(ECHO) IMPORTANT: If you update the X11 wrapper data files, they most certainly
	$(ECHO) need to be updated for both 32 and 64 bit platforms. You have now
	$(ECHO) updated them for $(BITS) bit platforms only.

TARGETS += $(run_wrappergen) wrapper-information

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

include MakeFileEnd.gmk
