#
# 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 LauncherCommon.gmk

JAVA_VERSION_INFO_RESOURCE := \
    $(TOPDIR)/src/java.base/windows/native/launcher/java.rc

JAVA_RCFLAGS ?= -I$(TOPDIR)/src/java.base/windows/native/launcher/icons

################################################################################
## Build java
################################################################################

$(eval $(call SetupBuildLauncher, java, \
    ENABLE_ARG_FILES := true, \
    EXPAND_CLASSPATH_WILDCARDS := true, \
    EXTRA_RCFLAGS := $(JAVA_RCFLAGS), \
    VERSION_INFO_RESOURCE := $(JAVA_VERSION_INFO_RESOURCE), \
    OPTIMIZATION := HIGH, \
))

################################################################################
## Build javaw
################################################################################

ifeq ($(call isTargetOs, windows), true)
  $(eval $(call SetupBuildLauncher, javaw, \
      ENABLE_ARG_FILES := true, \
      EXPAND_CLASSPATH_WILDCARDS := true, \
      WINDOWS_JAVAW := true, \
      EXTRA_RCFLAGS := $(JAVA_RCFLAGS), \
      VERSION_INFO_RESOURCE := $(JAVA_VERSION_INFO_RESOURCE), \
  ))
endif

################################################################################
## Build keytool
################################################################################

$(eval $(call SetupBuildLauncher, keytool, \
    MAIN_CLASS := sun.security.tools.keytool.Main, \
))

ifeq ($(call isTargetOs, linux), true)
  ##############################################################################
  ## Build jexec
  ##############################################################################

  $(eval $(call SetupJdkExecutable, BUILD_JEXEC, \
      NAME := jexec, \
      SRC := $(TOPDIR)/src/$(MODULE)/unix/native/launcher, \
      OPTIMIZATION := LOW, \
      EXTRA_HEADER_DIRS := libjli, \
      CFLAGS_linux := -fPIC, \
      LD_SET_ORIGIN := false, \
      OUTPUT_DIR := $(SUPPORT_OUTPUTDIR)/modules_libs/$(MODULE), \
  ))

  TARGETS += $(BUILD_JEXEC)
endif

ifeq ($(call isTargetOsType, unix), true)
  ##############################################################################
  ## Build jspawnhelper
  ##############################################################################

  $(eval $(call SetupJdkExecutable, BUILD_JSPAWNHELPER, \
      NAME := jspawnhelper, \
      OPTIMIZATION := LOW, \
      CFLAGS := $(VERSION_CFLAGS), \
      EXTRA_HEADER_DIRS := libjava, \
      EXTRA_OBJECT_FILES := \
          $(SUPPORT_OUTPUTDIR)/native/$(MODULE)/libjava/childproc$(OBJ_SUFFIX), \
      LD_SET_ORIGIN := false, \
      OUTPUT_DIR := $(SUPPORT_OUTPUTDIR)/modules_libs/$(MODULE), \
  ))

  TARGETS += $(BUILD_JSPAWNHELPER)
endif

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