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

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

################################################################################
# Create all the core libraries

include lib/CoreLibraries.gmk

################################################################################
## Build libnet
################################################################################

$(eval $(call SetupJdkLibrary, BUILD_LIBNET, \
    NAME := net, \
    OPTIMIZATION := LOW, \
    DISABLED_WARNINGS_gcc_net_util_md.c := format-nonliteral unused-variable, \
    DISABLED_WARNINGS_gcc_NetworkInterface.c := unused-function, \
    DISABLED_WARNINGS_clang_net_util_md.c := format-nonliteral \
        unused-variable, \
    DISABLED_WARNINGS_clang_NetworkInterface.c := unused-function, \
    DISABLED_WARNINGS_clang_aix_DefaultProxySelector.c := \
        deprecated-non-prototype, \
    DISABLED_WARNINGS_clang_aix_NetworkInterface.c := gnu-pointer-arith, \
    DISABLED_WARNINGS_microsoft_InetAddress.c := 4244, \
    DISABLED_WARNINGS_microsoft_ResolverConfigurationImpl.c := 4996, \
    LDFLAGS_windows := -delayload:iphlpapi.dll -delayload:secur32.dll \
        -delayload:winhttp.dll, \
    JDK_LIBS := libjava libjvm, \
    LIBS_linux := $(LIBDL), \
    LIBS_aix := $(LIBDL), \
    LIBS_windows := advapi32.lib delayimp.lib iphlpapi.lib secur32.lib \
        winhttp.lib ws2_32.lib, \
    LIBS_macosx := \
        -framework CoreFoundation \
        -framework CoreServices, \
))

TARGETS += $(BUILD_LIBNET)

################################################################################
## Build libnio
################################################################################

$(eval $(call SetupJdkLibrary, BUILD_LIBNIO, \
    NAME := nio, \
    OPTIMIZATION := HIGH, \
    EXTRA_HEADER_DIRS := \
        libnio/ch \
        libnio/fs \
        libjvm, \
    DISABLED_WARNINGS_clang_Net.c := unused-function unused-variable, \
    DISABLED_WARNINGS_clang_UnixNativeDispatcher.c := unused-variable, \
    JDK_LIBS := libjava libnet, \
    LIBS_linux := $(LIBDL) $(LIBPTHREAD), \
    LIBS_aix := $(LIBDL), \
    LIBS_macosx := \
        -framework CoreFoundation \
        -framework CoreServices, \
    LIBS_windows := advapi32.lib mswsock.lib ws2_32.lib, \
))

TARGETS += $(BUILD_LIBNIO)

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

  $(eval $(call SetupJdkLibrary, BUILD_LIBOSXSECURITY, \
      NAME := osxsecurity, \
      OPTIMIZATION := LOW, \
      DISABLED_WARNINGS_clang_KeystoreImpl.m := deprecated-declarations \
          unused-but-set-variable unused-variable, \
      JDK_LIBS := libjava, \
      LIBS_macosx := -lobjc \
          -framework CoreServices \
          -framework Foundation \
          -framework Security, \
  ))

  TARGETS += $(BUILD_LIBOSXSECURITY)
endif

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

  $(eval $(call SetupJdkLibrary, BUILD_LIBJSIG, \
      NAME := jsig, \
      OPTIMIZATION := LOW, \
      jsig.c_CFLAGS := -DHOTSPOT_VM_DISTRO='"$(HOTSPOT_VM_DISTRO)"', \
      DISABLED_WARNINGS_gcc_jsig.c := unused-but-set-variable, \
      DISABLED_WARNINGS_clang_jsig.c := unused-but-set-variable, \
      LIBS_linux := $(LIBDL), \
      LIBS_aix := $(LIBDL), \
      ONLY_EXPORTED := true, \
  ))

  TARGETS += $(BUILD_LIBJSIG)

  ##############################################################################
  # Create symlinks to libjsig in each JVM variant sub dir
  ifneq ($(STATIC_LIBS), true)
    LIB_OUTPUTDIR := $(call FindLibDirForModule, java.base)
    LIBJSIG_NAME := $(LIBRARY_PREFIX)jsig$(SHARED_LIBRARY_SUFFIX)

    # $1 variant subdir
    define CreateSymlinks
      # Always symlink from libdir/variant/libjsig.so -> ../libjsig.so.
      $(LIB_OUTPUTDIR)/$1/$(LIBJSIG_NAME): \
          $(LIB_OUTPUTDIR)/$(LIBJSIG_NAME)
		$$(call MakeDir, $$(@D))
		$(RM) $$@
		$(LN) -s ../$$(@F) $$@

      TARGETS += $(LIB_OUTPUTDIR)/$1/$(LIBJSIG_NAME)
    endef

    # The subdir is the same as the variant
    $(foreach v, $(JVM_VARIANTS), $(eval $(call CreateSymlinks,$v)))
  endif
endif

################################################################################
## Build libsyslookup
################################################################################

$(eval $(call SetupJdkLibrary, BUILD_LIBSYSLOOKUP, \
    NAME := syslookup, \
    EXTRA_HEADER_DIRS := java.base:libjava, \
    LD_SET_ORIGIN := false, \
    LDFLAGS_linux := -Wl$(COMMA)--no-as-needed, \
    LDFLAGS_aix := -brtl -bexpfull, \
    LIBS_linux := $(LIBDL) $(LIBM), \
    LIBS_aix := -ldecNumber $(LIBM), \
))

TARGETS += $(BUILD_LIBSYSLOOKUP)

ifeq ($(ENABLE_FALLBACK_LINKER), true)
  ##############################################################################
  ## Build libfallbackLinker
  ##############################################################################

  $(eval $(call SetupJdkLibrary, BUILD_LIBFALLBACKLINKER, \
      NAME := fallbackLinker, \
      EXTRA_HEADER_DIRS := java.base:libjava, \
      CFLAGS := $(LIBFFI_CFLAGS), \
      DISABLED_WARNINGS_gcc := implicit-function-declaration unused-variable, \
      LIBS := $(LIBFFI_LIBS), \
      LIBS_windows := ws2_32.lib, \
  ))

  TARGETS += $(BUILD_LIBFALLBACKLINKER)
endif

ifeq ($(call isTargetOs, linux)+$(call isTargetCpu, x86_64)+$(INCLUDE_COMPILER2)+$(filter $(TOOLCHAIN_TYPE), gcc), true+true+true+gcc)
  ##############################################################################
  ## Build libsimdsort
  ##############################################################################

  $(eval $(call SetupJdkLibrary, BUILD_LIBSIMD_SORT, \
      NAME := simdsort, \
      LINK_TYPE := C++, \
      OPTIMIZATION := HIGH, \
      CXXFLAGS := -std=c++17, \
      DISABLED_WARNINGS_gcc := unused-variable, \
      LIBS_linux := $(LIBDL) $(LIBM), \
  ))

  TARGETS += $(BUILD_LIBSIMD_SORT)
endif

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