#
# Copyright (c) 2023, 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

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

include CopyFiles.gmk
include Execute.gmk
include JavaCompilation.gmk

ifeq ($(call isTargetOs, macosx), true)
  ##############################################################################
  # Build the XcodeProjectMaker java tool.

  PROJECT_MAKER_DIR := $(TOPDIR)/make/ide/xcode/hotspot
  TOOLS_OUTPUTDIR := $(MAKESUPPORT_OUTPUTDIR)/ide/xcode
  IDE_OUTPUTDIR := $(OUTPUTDIR)/xcode
  PROJECT_FILE_NAME := hotspot.xcodeproj

  COMPILE_COMMAND_FILE := $(OUTPUTDIR)/compile_commands.json
  LINKER_FLAGS_FILE := $(MAKESUPPORT_OUTPUTDIR)/compile-commands/LIBRARY_hotspot_variant-server_libjvm_libjvm-ldflags.txt

  $(eval $(call SetupJavaCompilation, BUILD_PROJECT_CREATOR, \
      TARGET_RELEASE := $(TARGET_RELEASE_BOOTJDK), \
      SRC := $(PROJECT_MAKER_DIR)/src/classes, \
      BIN := $(TOOLS_OUTPUTDIR), \
      DISABLED_WARNINGS := rawtypes unchecked serial, \
  ))

  TARGETS += $(BUILD_PROJECT_CREATOR)

  # Run the XcodeProjectMaker tool
  PROJECT_CREATOR_TOOL := $(JAVA_SMALL) -cp $(TOOLS_OUTPUTDIR) XcodeProjectMaker

  ifneq ($(findstring $(LOG_LEVEL), debug trace), )
    XCODE_PROJ_DEBUG_OPTION := -d
  endif

  XCODE_PROJ_VARDEPS := $(TOPDIR) $(IDE_OUTPUTDIR) \
      $(PROJECT_MAKER_DIR)/data $(COMPILE_COMMAND_FILE) $(LINKER_FLAGS_FILE)
  XCODE_PROJ_VARDEPS_FILE := $(call DependOnVariable, XCODE_PROJ_VARDEPS, \
    $(TOOLS_OUTPUTDIR)/xcodeproj.vardeps)

  $(eval $(call SetupExecute, build_xcode_project, \
      WARN := Generating Xcode project file, \
      DEPS := $(BUILD_PROJECT_CREATOR) $(COMPILE_COMMAND_FILE) \
          $(LINKER_FLAGS_FILE) $(XCODE_PROJ_VARDEPS_FILE), \
      OUTPUT_DIR := $(TOOLS_OUTPUTDIR), \
      COMMAND := $(PROJECT_CREATOR_TOOL) $(TOPDIR) $(IDE_OUTPUTDIR) \
          $(PROJECT_MAKER_DIR)/data $(COMPILE_COMMAND_FILE) \
          $(LINKER_FLAGS_FILE) $(XCODE_PROJ_DEBUG_OPTION), \
  ))

  TARGETS += $(build_xcode_project)

  $(eval $(call SetupCopyFiles, copy_xcode_project, \
      DEST := $(IDE_OUTPUTDIR), \
      FILES := $(PROJECT_MAKER_DIR)/data/script_before.sh $(PROJECT_MAKER_DIR)/data/script_after.sh , \
      MACRO := copy-and-chmod-executable, \
  ))

  TARGETS += $(copy_xcode_project)

  $(eval $(call SetupExecute, open_xcode_project, \
      INFO := Opening Xcode project file, \
      DEPS := $(build_xcodeproject_TARGET) FORCE, \
      OUTPUT_DIR := $(TOOLS_OUTPUTDIR), \
      COMMAND := open $(IDE_OUTPUTDIR)/$(PROJECT_FILE_NAME), \
  ))

  TARGETS += $(open_xcode_project)

  # Always call open without considering dependencies being up to date
  FORCE:

  build: $(build_xcode_project) $(copy_xcode_project)

  open: $(open_xcode_project)
else
  build:
  open:
  all:
	$(info Xcode projects are only supported on macOS)
endif

.PHONY: build open

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

include MakeFileEnd.gmk
