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

################################################################################
## Build libsaproc
################################################################################

ifeq ($(call isTargetOs, macosx), true)
  LIBSAPROC_CFLAGS := -D_GNU_SOURCE -mno-omit-leaf-frame-pointer \
      -mstack-alignment=16 -fPIC
  LIBSAPROC_EXTRA_SRC := $(SUPPORT_OUTPUTDIR)/gensrc/jdk.hotspot.agent
else ifeq ($(call isTargetOs, windows), true)
  LIBSAPROC_CFLAGS := -D_WINDOWS -D_DEBUG -D_CONSOLE -EHsc
  ifeq ($(call isTargetCpu, x86_64), true)
    LIBSAPROC_CXXFLAGS := -DWIN64
  else
    # Only add /RTC1 flag for debug builds as it's
    # incompatible with release type builds. See
    # https://msdn.microsoft.com/en-us/library/8wtf2dfz.aspx
    ifeq ($(DEBUG_LEVEL), slowdebug)
      LIBSAPROC_CXXFLAGS := -RTC1
    endif
  endif
endif

ifeq ($(call isTargetOs, linux), true)
  LIBSAPROC_LINK_TYPE := C++
else
  LIBSAPROC_LINK_TYPE := C
endif

$(eval $(call SetupJdkLibrary, BUILD_LIBSAPROC, \
    NAME := saproc, \
    LINK_TYPE := $(LIBSAPROC_LINK_TYPE), \
    OPTIMIZATION := HIGH, \
    EXTRA_HEADER_DIRS := java.base:libjvm, \
    DISABLED_WARNINGS_gcc := sign-compare, \
    DISABLED_WARNINGS_gcc_ps_core.c := pointer-arith, \
    DISABLED_WARNINGS_clang := sign-compare, \
    DISABLED_WARNINGS_clang_libproc_impl.c := format-nonliteral, \
    DISABLED_WARNINGS_clang_MacosxDebuggerLocal.m := unused-variable, \
    DISABLED_WARNINGS_clang_ps_core.c := pointer-arith, \
    DISABLED_WARNINGS_clang_sadis.c := format-nonliteral, \
    CFLAGS := $(LIBSAPROC_CFLAGS), \
    CXXFLAGS := $(LIBSAPROC_CFLAGS) $(LIBSAPROC_CXXFLAGS), \
    EXTRA_SRC := $(LIBSAPROC_EXTRA_SRC), \
    JDK_LIBS := java.base:libjava, \
    LIBS_linux := $(LIBDL), \
    LIBS_macosx := \
        -framework CoreFoundation \
        -framework Foundation \
        -framework JavaRuntimeSupport \
        -framework Security, \
    LIBS_windows := dbgeng.lib, \
))

TARGETS += $(BUILD_LIBSAPROC)

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