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

# Hook to include the corresponding custom file, if present.
$(eval $(call IncludeCustomExtension, modules/java.desktop/Lib.gmk))

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

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

include lib/Awt2dLibraries.gmk

################################################################################
# Create the libjsound library

ifeq ($(call isTargetOs, aix), false)

  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 \
      #

  ifeq ($(call isTargetOs, macosx), true)
    LIBJSOUND_TOOLCHAIN := TOOLCHAIN_LINK_CXX
  endif

  $(eval $(call SetupJdkLibrary, BUILD_LIBJSOUND, \
      NAME := jsound, \
      TOOLCHAIN := $(LIBJSOUND_TOOLCHAIN), \
      OPTIMIZATION := LOW, \
      CFLAGS := $(CFLAGS_JDKLIB) \
          $(LIBJSOUND_CFLAGS), \
      CXXFLAGS := $(CXXFLAGS_JDKLIB) $(LIBJSOUND_CFLAGS), \
      DISABLED_WARNINGS_gcc := undef, \
      DISABLED_WARNINGS_clang := undef, \
      LDFLAGS := $(LDFLAGS_JDKLIB) \
          $(call SET_SHARED_LIBRARY_ORIGIN), \
      LIBS_unix := -ljava -ljvm, \
      LIBS_linux := $(ALSA_LIBS), \
      LIBS_macosx := -framework CoreAudio -framework CoreFoundation \
          -framework CoreServices -framework AudioUnit \
          -framework CoreMIDI -framework AudioToolbox $(LIBCXX), \
      LIBS_windows := $(WIN_JAVA_LIB) advapi32.lib dsound.lib winmm.lib user32.lib ole32.lib, \
  ))

  $(BUILD_LIBJSOUND): $(call FindLib, java.base, java)

  TARGETS += $(BUILD_LIBJSOUND)

endif

################################################################################
# Create the macosx specific osxapp and osx libraries

ifeq ($(call isTargetOs, macosx), true)

  $(eval $(call SetupJdkLibrary, BUILD_LIBOSXAPP, \
      NAME := osxapp, \
      OPTIMIZATION := LOW, \
      CFLAGS := $(CFLAGS_JDKLIB), \
      DISABLED_WARNINGS_clang_NSApplicationAWT.m := deprecated-declarations format-nonliteral, \
      DISABLED_WARNINGS_clang_QueuingApplicationDelegate.m := objc-method-access, \
      LDFLAGS := $(LDFLAGS_JDKLIB) \
          $(call SET_SHARED_LIBRARY_ORIGIN), \
      LIBS := \
          -ljava \
          -framework Accelerate \
          -framework ApplicationServices \
          -framework AudioToolbox \
          -framework Carbon \
          -framework Cocoa \
          -framework Security \
          -framework ExceptionHandling \
          -framework JavaRuntimeSupport \
          -framework OpenGL \
          -framework IOSurface \
          -framework QuartzCore, \
  ))

  $(BUILD_LIBOSXAPP): $(call FindLib, java.base, java)

  TARGETS += $(BUILD_LIBOSXAPP)

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

  $(eval $(call SetupJdkLibrary, BUILD_LIBOSX, \
      NAME := osx, \
      OPTIMIZATION := LOW, \
      CFLAGS := $(CFLAGS_JDKLIB), \
      EXTRA_HEADER_DIRS := libosxapp, \
      DISABLED_WARNINGS_clang_CFileManager.m := deprecated-declarations, \
      LDFLAGS := $(LDFLAGS_JDKLIB) \
          -L$(SUPPORT_OUTPUTDIR)/modules_libs/java.desktop \
          $(call SET_SHARED_LIBRARY_ORIGIN), \
      LIBS := \
          -losxapp \
          -framework Cocoa \
          -framework ApplicationServices \
          -framework JavaRuntimeSupport \
          -framework SystemConfiguration \
          $(JDKLIB_LIBS), \
  ))

  TARGETS += $(BUILD_LIBOSX)

  $(BUILD_LIBOSX): $(call FindLib, java.desktop, osxapp)

  $(BUILD_LIBOSX): $(call FindLib, java.base, java)

endif
