#
# 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 LibCommon.gmk
include Execute.gmk

# Prepare the find cache.
$(call FillFindCache, $(wildcard $(TOPDIR)/src/java.desktop/*/native))

################################################################################
# Create the AWT/2D libraries

include lib/AwtLibraries.gmk
include lib/ClientLibraries.gmk

ifeq ($(call isTargetOs, aix), false)
  ##############################################################################
  # Build libjsound
  ##############################################################################

  LIBJSOUND_CFLAGS := \
      $(ALSA_CFLAGS) \
      -DX_PLATFORM=X_$(OPENJDK_TARGET_OS_UPPERCASE) \
      -DUSE_PORTS=TRUE \
      -DUSE_DAUDIO=TRUE \
      -DUSE_PLATFORM_MIDI_OUT=TRUE \
      -DUSE_PLATFORM_MIDI_IN=TRUE \
      #

  LIBJSOUND_LINK_TYPE := C
  ifeq ($(call isTargetOs, macosx), true)
    LIBJSOUND_LINK_TYPE := C++
  endif

  $(eval $(call SetupJdkLibrary, BUILD_LIBJSOUND, \
      NAME := jsound, \
      LINK_TYPE := $(LIBJSOUND_LINK_TYPE), \
      OPTIMIZATION := LOW, \
      EXTRA_HEADER_DIRS := java.base:libjava, \
      CFLAGS := $(LIBJSOUND_CFLAGS), \
      CXXFLAGS := $(LIBJSOUND_CFLAGS), \
      DISABLED_WARNINGS_gcc := undef unused-variable, \
      DISABLED_WARNINGS_clang := undef unused-variable, \
      DISABLED_WARNINGS_clang_PLATFORM_API_MacOSX_MidiUtils.c := \
          unused-but-set-variable, \
      DISABLED_WARNINGS_clang_DirectAudioDevice.c := unused-function, \
      LIBS_linux := $(ALSA_LIBS), \
      LIBS_macosx := \
          -framework AudioToolbox \
          -framework AudioUnit \
          -framework CoreAudio \
          -framework CoreFoundation \
          -framework CoreMIDI \
          -framework CoreServices, \
      LIBS_windows := advapi32.lib dsound.lib ole32.lib user32.lib winmm.lib, \
  ))

  TARGETS += $(BUILD_LIBJSOUND)
endif

ifeq ($(call isTargetOs, macosx), true)
  ##############################################################################
  # Build libosxapp
  ##############################################################################

  $(eval $(call SetupJdkLibrary, BUILD_LIBOSXAPP, \
      NAME := osxapp, \
      OPTIMIZATION := LOW, \
      DISABLED_WARNINGS_clang_NSApplicationAWT.m := deprecated-declarations \
          format-nonliteral, \
      DISABLED_WARNINGS_clang_QueuingApplicationDelegate.m := \
          objc-method-access, \
      JDK_LIBS := java.base:libjava, \
      LIBS_macosx := \
          -framework Accelerate \
          -framework ApplicationServices \
          -framework AudioToolbox \
          -framework Carbon \
          -framework Cocoa \
          -framework ExceptionHandling \
          -framework IOSurface \
          -framework JavaRuntimeSupport \
          -framework OpenGL \
          -framework QuartzCore \
          -framework Security, \
  ))

  TARGETS += $(BUILD_LIBOSXAPP)

  ##############################################################################
  # Build libosx
  ##############################################################################

  $(eval $(call SetupJdkLibrary, BUILD_LIBOSX, \
      NAME := osx, \
      OPTIMIZATION := LOW, \
      EXTRA_HEADER_DIRS := java.base:libjava, \
      DISABLED_WARNINGS_clang_CFileManager.m := deprecated-declarations, \
      JDK_LIBS := libosxapp, \
      LIBS_macosx := \
          -framework ApplicationServices \
          -framework Cocoa \
          -framework JavaRuntimeSupport \
          -framework SystemConfiguration, \
  ))

  TARGETS += $(BUILD_LIBOSX)
endif

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