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

# When you read this source. Remember that $(sort ...) has the side effect
# of removing duplicates. It is actually this side effect that is
# desired whenever sort is used below!

ifeq (,$(_MAKEBASE_GMK))
  $(error You must include MakeBase.gmk prior to including NativeCompilation.gmk)
endif

ifneq ($(TOOLCHAIN_TYPE), microsoft)
  COMPILING_MSG=echo $(LOG_INFO) "Compiling $(notdir $1) (for $(notdir $2))"
  LINKING_MSG=echo $(LOG_INFO) "Linking $1"
  LINKING_EXE_MSG=echo $(LOG_INFO) "Linking executable $1"
  ARCHIVING_MSG=echo $(LOG_INFO) "Archiving $1"
else
  COMPILING_MSG=
  LINKING_MSG=
  LINKING_EXE_MSG=
  ARCHIVING_MSG=
endif

define add_native_source
  # param 1 = BUILD_MYPACKAGE
  # parma 2 = the source file name (..../alfa.c or .../beta.cpp)
  # param 3 = the bin dir that stores all .o (.obj) and .d files.
  # param 4 = the c flags to the compiler
  # param 5 = the c compiler
  # param 6 = the c++ flags to the compiler
  # param 7 = the c++ compiler
  # param 8 = the flags to the assembler

  ifneq (,$$(filter %.c,$2))
    # Compile as a C file
    $1_$2_FLAGS=$4 $$($1_$(notdir $2)_CFLAGS) -DTHIS_FILE='"$$(<F)"' -c
    $1_$2_COMP=$5
    $1_$2_DEP_FLAG:=$(C_FLAG_DEPS)
  else ifneq (,$$(filter %.m,$2))
    # Compile as a objective-c file
    $1_$2_FLAGS=-x objective-c $4 $$($1_$(notdir $2)_CFLAGS) -DTHIS_FILE='"$$(<F)"' -c
    $1_$2_COMP=$5
    $1_$2_DEP_FLAG:=$(C_FLAG_DEPS)
  else ifneq (,$$(filter %.s,$2))
    # Compile as assembler file
    $1_$2_FLAGS=$8 -DTHIS_FILE='"$$(<F)"'
    $1_$2_COMP=$(AS)
    $1_$2_DEP_FLAG:=
  else
    # Compile as a C++ file
    $1_$2_FLAGS=$6 $$($1_$(notdir $2)_CXXFLAGS) -DTHIS_FILE='"$$(<F)"' -c
    $1_$2_COMP=$7
    $1_$2_DEP_FLAG:=$(CXX_FLAG_DEPS)
  endif
  # Generate the .o (.obj) file name and place it in the bin dir.
  $1_$2_OBJ:=$3/$$(patsubst %.cpp,%$(OBJ_SUFFIX),$$(patsubst %.c,%$(OBJ_SUFFIX),$$(patsubst %.m,%$(OBJ_SUFFIX),$$(patsubst %.s,%$(OBJ_SUFFIX),$$(notdir $2)))))
  # Only continue if this object file hasn't been processed already. This lets the first found
  # source file override any other with the same name.
  ifeq (,$$(findstring $$($1_$2_OBJ),$$($1_OBJS_SO_FAR)))
    $1_OBJS_SO_FAR+=$$($1_$2_OBJ)
    ifeq (,$$(filter %.s,$2))
      # And this is the dependency file for this obj file.
      $1_$2_DEP:=$$(patsubst %$(OBJ_SUFFIX),%.d,$$($1_$2_OBJ))
      # Include previously generated dependency information. (if it exists)
      -include $$($1_$2_DEP)

      ifeq ($(TOOLCHAIN_TYPE), microsoft)
        $1_$2_DEBUG_OUT_FLAGS:=-Fd$$(patsubst %$(OBJ_SUFFIX),%.pdb,$$($1_$2_OBJ)) \
            -Fm$$(patsubst %$(OBJ_SUFFIX),%.map,$$($1_$2_OBJ))
      endif
    endif

    $$($1_$2_OBJ) : $2
        ifneq ($(TOOLCHAIN_TYPE), microsoft)
	  $$(call COMPILING_MSG,$2,$$($1_TARGET))
          # The Solaris studio compiler doesn't output the full path to the object file in the
          # generated deps files. Fixing it with sed. If compiling assembly, don't try this.
          ifeq ($(TOOLCHAIN_TYPE)$$(filter %.s,$2), solstudio)
	    $$($1_$2_COMP) $$($1_$2_FLAGS) $$($1_$2_DEP_FLAG) $$($1_$2_DEP).tmp $(CC_OUT_OPTION)$$($1_$2_OBJ) $2
	    $(SED) 's|^$$(@F):|$$@:|' $$($1_$2_DEP).tmp > $$($1_$2_DEP)
          else
	    $$($1_$2_COMP) $$($1_$2_FLAGS) $$($1_$2_DEP_FLAG) $$($1_$2_DEP) $(CC_OUT_OPTION)$$($1_$2_OBJ) $2
          endif
        endif
        # The Visual Studio compiler lacks a feature for generating make dependencies, but by
        # setting -showIncludes, all included files are printed. These are filtered out and
        # parsed into make dependences.
        ifeq ($(TOOLCHAIN_TYPE), microsoft)
	  ($$($1_$2_COMP) $$($1_$2_FLAGS) -showIncludes $$($1_$2_DEBUG_OUT_FLAGS) \
	      $(CC_OUT_OPTION)$$($1_$2_OBJ) $2 ; echo $$$$? > $$($1_$2_DEP).exitvalue) \
	      | $(TEE) $$($1_$2_DEP).raw | $(GREP) -v "^Note: including file:" \
	      && exit `cat $$($1_$2_DEP).exitvalue`
	  $(RM) $$($1_$2_DEP).exitvalue
	  ($(ECHO) $$@: \\ \
	  && $(SED) -e '/^Note: including file:/!d' \
	      -e 's|Note: including file: *||' \
	      -e 's|\\|/|g' \
	      -e 's|^\([a-zA-Z]\):|/cygdrive/\1|g' \
	      -e '/$(subst /,\/,$(TOPDIR))/!d' \
	      -e 's|$$$$| \\|g' \
	      $$($1_$2_DEP).raw) > $$($1_$2_DEP)
        endif
  endif
endef

define SetupNativeCompilation
  # param 1 is for example BUILD_MYPACKAGE
  # param 2,3,4,5,6,7,8 are named args.
  #   SRC one or more directory roots to scan for C/C++ files.
  #   LANG C or C++
  #   CFLAGS the compiler flags to be used, used both for C and C++.
  #   CXXFLAGS the compiler flags to be used for c++, if set overrides CFLAGS.
  #   LDFLAGS the linker flags to be used, used both for C and C++.
  #   LDFLAGS_SUFFIX the linker flags to be added last on the commandline
  #       typically the libraries linked to.
  #   ARFLAGS the archiver flags to be used
  #   OBJECT_DIR the directory where we store the object files
  #   LIBRARY the resulting library file
  #   PROGRAM the resulting exec file
  #   INCLUDES only pick source from these directories
  #   EXCLUDES do not pick source from these directories
  #   INCLUDE_FILES only compile exactly these files!
  #   EXCLUDE_FILES with these names
  #   VERSIONINFO_RESOURCE Input file for RC. Setting this implies that RC will be run
  #   RC_FLAGS flags for RC.
  #   MAPFILE mapfile
  #   REORDER reorder file
  #   DEBUG_SYMBOLS add debug symbols (if configured on)
  #   CC the compiler to use, default is $(CC)
  #   LDEXE the linker to use for linking executables, default is $(LDEXE)
  #   OPTIMIZATION sets optimization level to NONE, LOW, HIGH, HIGHEST
  $(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26, $(if $($i),$1_$(strip $($i)))$(NEWLINE))
  $(call LogSetupMacroEntry,SetupNativeCompilation($1),$2,$3,$4,$5,$6,$7,$8,$9,$(10),$(11),$(12),$(13),$(14),$(15),$(16),$(17),$(18),$(19),$(20),$(21),$(22),$(23),$(24),$(25),$(26))
  $(if $(27),$(error Internal makefile error: Too many arguments to SetupNativeCompilation, please update NativeCompilation.gmk))

  ifneq (,$$($1_BIN))
    $$(error BIN has been replaced with OBJECT_DIR)
  endif

  ifneq (,$$($1_LIB))
    $$(error LIB has been replaced with LIBRARY)
  endif

  ifneq (,$$($1_EXE))
    $$(error EXE has been replaced with PROGRAM)
  endif

  ifneq (,$$($1_LIBRARY))
    ifeq (,$$($1_OUTPUT_DIR))
      $$(error LIBRARY requires OUTPUT_DIR)
    endif

    ifneq ($$($1_LIBRARY),$(basename $$($1_LIBRARY)))
      $$(error directory of LIBRARY should be specified using OUTPUT_DIR)
    endif

    ifneq (,$(findstring $(SHARED_LIBRARY_SUFFIX),$$($1_LIBRARY)))
      $$(error LIBRARY should be specified without SHARED_LIBRARY_SUFFIX: $(SHARED_LIBRARY_SUFFIX))
    endif

    ifneq (,$(findstring $(LIBRARY_PREFIX),$$($1_LIBRARY)))
      $$(error LIBRARY should be specified without LIBRARY_PREFIX: $(LIBRARY_PREFIX))
    endif

    $1_BASENAME:=$(LIBRARY_PREFIX)$$($1_LIBRARY)$(SHARED_LIBRARY_SUFFIX)
    $1_TARGET:=$$($1_OUTPUT_DIR)/$$($1_BASENAME)
    $1_NOSUFFIX:=$(LIBRARY_PREFIX)$$($1_LIBRARY)
  endif

  ifneq (,$$($1_STATIC_LIBRARY))
    ifeq (,$$($1_OUTPUT_DIR))
      $$(error STATIC_LIBRARY requires OUTPUT_DIR)
    endif

    ifneq ($$($1_STATIC_LIBRARY),$(basename $$($1_STATIC_LIBRARY)))
      $$(error directory of STATIC_LIBRARY should be specified using OUTPUT_DIR)
    endif

    ifneq (,$(findstring $(STATIC_LIBRARY_SUFFIX),$$($1_STATIC_LIBRARY)))
      $$(error STATIC_LIBRARY should be specified without STATIC_LIBRARY_SUFFIX: $(STATIC_LIBRARY_SUFFIX))
    endif

    ifneq (,$(findstring $(LIBRARY_PREFIX),$$($1_STATIC_LIBRARY)))
      $$(error STATIC_LIBRARY should be specified without LIBRARY_PREFIX: $(LIBRARY_PREFIX))
    endif

    $1_BASENAME:=$(LIBRARY_PREFIX)$$($1_STATIC_LIBRARY)$(STATIC_LIBRARY_SUFFIX)
    $1_TARGET:=$$($1_OUTPUT_DIR)/$$($1_BASENAME)
    $1_NOSUFFIX:=$(LIBRARY_PREFIX)$$($1_STATIC_LIBRARY)
  endif

  ifneq (,$$($1_PROGRAM))
    ifeq (,$$($1_OUTPUT_DIR))
      $$(error PROGRAM requires OUTPUT_DIR)
    endif

    ifneq ($$($1_PROGRAM),$(basename $$($1_PROGRAM)))
      $$(error directory of PROGRAM should be specified using OUTPUT_DIR)
    endif

    ifneq (,$(findstring $(EXE_SUFFIX),$$($1_PROGRAM)))
      $$(error PROGRAM should be specified without EXE_SUFFIX: $(EXE_SUFFIX))
    endif

    $1_BASENAME:=$$($1_PROGRAM)$(EXE_SUFFIX)
    $1_TARGET:=$$($1_OUTPUT_DIR)/$$($1_BASENAME)
    $1_NOSUFFIX:=$$($1_PROGRAM)
  endif

  ifeq (,$$($1_TARGET))
    $$(error Neither PROGRAM, LIBRARY nor STATIC_LIBRARY has been specified for SetupNativeCompilation)
  endif

  ifeq (,$$($1_LANG))
    $$(error You have to specify LANG for native compilation $1)
  endif
  ifeq (C,$$($1_LANG))
    ifeq ($$($1_LDEXE),)
      $1_LDEXE:=$(LDEXE)
    endif
    $1_LD:=$(LD)
  else
    ifeq (C++,$$($1_LANG))
      $1_LD:=$(LDCXX)
      $1_LDEXE:=$(LDEXECXX)
    else
      $$(error Unknown native language $$($1_LANG) for $1)
    endif
  endif

  ifeq ($$($1_CC),)
    $1_CC:=$(CC)
  endif

  # Make sure the dirs exist.
  $$(eval $$(call MakeDir,$$($1_OBJECT_DIR) $$($1_OUTPUT_DIR)))
  $$(foreach d,$$($1_SRC), $$(if $$(wildcard $$d),,$$(error SRC specified to SetupNativeCompilation $1 contains missing directory $$d)))

  # Find all files in the source trees. Sort to remove duplicates.
  $1_ALL_SRCS := $$(sort $$(call CacheFind,$$($1_SRC)))
  # Extract the C/C++ files.
  $1_EXCLUDE_FILES:=$$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$($1_EXCLUDE_FILES)))
  $1_INCLUDE_FILES:=$$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$($1_INCLUDE_FILES)))
  ifneq ($$($1_EXCLUDE_FILES),)
    $1_EXCLUDE_FILES:=$$(addprefix %,$$($1_EXCLUDE_FILES))
  endif
  $1_SRCS := $$(filter-out $$($1_EXCLUDE_FILES),$$(filter %.s %.c %.cpp %.m,$$($1_ALL_SRCS)))
  ifneq (,$$(strip $$($1_INCLUDE_FILES)))
    $1_SRCS := $$(filter $$($1_INCLUDE_FILES),$$($1_SRCS))
  endif
  ifeq (,$$($1_SRCS))
    $$(error No sources found for $1 when looking inside the dirs $$($1_SRC))
  endif
  # There can be only a single bin dir root, no need to foreach over the roots.
  $1_BINS := $$(wildcard $$($1_OBJECT_DIR)/*$(OBJ_SUFFIX))
  # Now we have a list of all c/c++ files to compile: $$($1_SRCS)
  # and we have a list of all existing object files: $$($1_BINS)

  # Prepend the source/bin path to the filter expressions. Then do the filtering.
  ifneq ($$($1_INCLUDES),)
    $1_SRC_INCLUDES := $$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$(addsuffix /%,$$($1_INCLUDES))))
    $1_SRCS := $$(filter $$($1_SRC_INCLUDES),$$($1_SRCS))
  endif
  ifneq ($$($1_EXCLUDES),)
    $1_SRC_EXCLUDES := $$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$(addsuffix /%,$$($1_EXCLUDES))))
    $1_SRCS := $$(filter-out $$($1_SRC_EXCLUDES),$$($1_SRCS))
  endif

  # Calculate the expected output from compiling the sources (sort to remove duplicates. Also provides
  # a reproducable order on the input files to the linker).
  $1_EXPECTED_OBJS:=$$(sort $$(addprefix $$($1_OBJECT_DIR)/,$$(patsubst %.cpp,%$(OBJ_SUFFIX),$$(patsubst %.c,%$(OBJ_SUFFIX),$$(patsubst %.m,%$(OBJ_SUFFIX),$$(patsubst %.s,%$(OBJ_SUFFIX),$$(notdir $$($1_SRCS))))))))
  # Are there too many object files on disk? Perhaps because some source file was removed?
  $1_SUPERFLOUS_OBJS:=$$(sort $$(filter-out $$($1_EXPECTED_OBJS),$$($1_BINS)))
  # Clean out the superfluous object files.
  ifneq ($$($1_SUPERFLUOUS_OBJS),)
    $$(shell $(RM) -f $$($1_SUPERFLUOUS_OBJS))
  endif

  # Pickup extra OPENJDK_TARGET_OS_API and/or OPENJDK_TARGET_OS dependent variables for CFLAGS.
  $1_EXTRA_CFLAGS:=$$($1_CFLAGS_$(OPENJDK_TARGET_OS_API)) $$($1_CFLAGS_$(OPENJDK_TARGET_OS))
  ifneq ($(DEBUG_LEVEL),release)
    # Pickup extra debug dependent variables for CFLAGS
    $1_EXTRA_CFLAGS+=$$($1_CFLAGS_debug)
    $1_EXTRA_CFLAGS+=$$($1_CFLAGS_$(OPENJDK_TARGET_OS_API)_debug)
    $1_EXTRA_CFLAGS+=$$($1_CFLAGS_$(OPENJDK_TARGET_OS)_debug)
  else
    $1_EXTRA_CFLAGS+=$$($1_CFLAGS_release)
    $1_EXTRA_CFLAGS+=$$($1_CFLAGS_$(OPENJDK_TARGET_OS_API)_release)
    $1_EXTRA_CFLAGS+=$$($1_CFLAGS_$(OPENJDK_TARGET_OS)_release)
  endif

  # Pickup extra OPENJDK_TARGET_OS_API and/or OPENJDK_TARGET_OS dependent variables for CXXFLAGS.
  $1_EXTRA_CXXFLAGS:=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS_API)) $$($1_CXXFLAGS_$(OPENJDK_TARGET_OS))
  ifneq ($(DEBUG_LEVEL),release)
    # Pickup extra debug dependent variables for CXXFLAGS
    $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_debug)
    $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS_API)_debug)
    $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS)_debug)
  else
    $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_release)
    $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS_API)_release)
    $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS)_release)
  endif

  ifneq (,$$($1_DEBUG_SYMBOLS))
    ifeq ($(ENABLE_DEBUG_SYMBOLS), true)
      ifdef OPENJDK
        # Always add debug symbols
        $1_EXTRA_CFLAGS+=$(CFLAGS_DEBUG_SYMBOLS)
        $1_EXTRA_CXXFLAGS+=$(CXXFLAGS_DEBUG_SYMBOLS)
      else
        # Programs don't get the debug symbols added in the old build. It's not clear if
        # this is intentional.
        ifeq ($$($1_PROGRAM),)
          $1_EXTRA_CFLAGS+=$(CFLAGS_DEBUG_SYMBOLS)
          $1_EXTRA_CXXFLAGS+=$(CXXFLAGS_DEBUG_SYMBOLS)
        endif
      endif
    endif
  endif

  ifeq ($$($1_CXXFLAGS),)
    $1_CXXFLAGS:=$$($1_CFLAGS)
  endif
  ifeq ($$(strip $$($1_EXTRA_CXXFLAGS)),)
    $1_EXTRA_CXXFLAGS:=$$($1_EXTRA_CFLAGS)
  endif

  ifneq (,$$($1_REORDER))
    $1_EXTRA_CFLAGS += $$(C_FLAG_REORDER)
    $1_EXTRA_CXXFLAGS += $$(CXX_FLAG_REORDER)
  endif

  ifeq (NONE, $$($1_OPTIMIZATION))
    $1_EXTRA_CFLAGS += $(C_O_FLAG_NONE)
    $1_EXTRA_CXXFLAGS += $(CXX_O_FLAG_NONE)
  else ifeq (LOW, $$($1_OPTIMIZATION))
    $1_EXTRA_CFLAGS += $(C_O_FLAG_NORM)
    $1_EXTRA_CXXFLAGS += $(CXX_O_FLAG_NORM)
  else ifeq (HIGH, $$($1_OPTIMIZATION))
    $1_EXTRA_CFLAGS += $(C_O_FLAG_HI)
    $1_EXTRA_CXXFLAGS += $(CXX_O_FLAG_HI)
  else ifeq (HIGHEST, $$($1_OPTIMIZATION))
    $1_EXTRA_CFLAGS += $(C_O_FLAG_HIGHEST)
    $1_EXTRA_CXXFLAGS += $(CXX_O_FLAG_HIGHEST)
  else ifneq (, $$($1_OPTIMIZATION))
    $$(error Unknown value for OPTIMIZATION: $$($1_OPTIMIZATION))
  endif

  # Add sys root specific cflags last
  $1_EXTRA_CFLAGS += $(SYSROOT_CFLAGS)
  $1_EXTRA_CXXFLAGS += $(SYSROOT_CFLAGS)

  # Now call add_native_source for each source file we are going to compile.
  $$(foreach p,$$($1_SRCS), \
      $$(eval $$(call add_native_source,$1,$$p,$$($1_OBJECT_DIR), \
          $$($1_CFLAGS) $$($1_EXTRA_CFLAGS),$$($1_CC), \
          $$($1_CXXFLAGS) $$($1_EXTRA_CXXFLAGS),$(CXX),$$($1_ASFLAGS))))

  # On windows we need to create a resource file
  ifeq ($(OPENJDK_TARGET_OS), windows)
    ifneq (,$$($1_VERSIONINFO_RESOURCE))
      $1_RES:=$$($1_OBJECT_DIR)/$$($1_BASENAME).res
      $$($1_RES): $$($1_VERSIONINFO_RESOURCE)
		$(RC) $$($1_RC_FLAGS) $(CC_OUT_OPTION)$$@ $$($1_VERSIONINFO_RESOURCE)
    endif
    ifneq (,$$($1_MANIFEST))
      $1_GEN_MANIFEST:=$$($1_OBJECT_DIR)/$$($1_PROGRAM).manifest
      IMVERSIONVALUE:=$(JDK_MINOR_VERSION).$(JDK_MICRO_VERSION).$(JDK_UPDATE_VERSION).$(COOKED_BUILD_NUMBER)
      $$($1_GEN_MANIFEST): $$($1_MANIFEST)
		$(SED) 's%IMVERSION%$$(IMVERSIONVALUE)%g;s%PROGRAM%$$($1_PROGRAM)%g' $$< > $$@
    endif
  endif

  # mapfile doesnt seem to be implemented on macosx (yet??)
  ifneq ($(OPENJDK_TARGET_OS),macosx)
    ifneq ($(OPENJDK_TARGET_OS),windows)
      $1_REAL_MAPFILE:=$$($1_MAPFILE)
      ifneq (,$$($1_REORDER))
        $1_REAL_MAPFILE:=$$($1_OBJECT_DIR)/mapfile

        $$($1_REAL_MAPFILE) : $$($1_MAPFILE) $$($1_REORDER)
		$$(MKDIR) -p $$(@D)
		$$(CP) $$($1_MAPFILE) $$@.tmp
		$$(SED) -e 's=OUTPUTDIR=$$($1_OBJECT_DIR)=' $$($1_REORDER) >> $$@.tmp
		$$(MV) $$@.tmp $$@
      endif
    endif
  endif

  # Pickup extra OPENJDK_TARGET_OS_API and/or OPENJDK_TARGET_OS dependent variables
  # for LDFLAGS and LDFLAGS_SUFFIX
  $1_EXTRA_LDFLAGS:=$$($1_LDFLAGS_$(OPENJDK_TARGET_OS_API)) $$($1_LDFLAGS_$(OPENJDK_TARGET_OS))
  $1_EXTRA_LDFLAGS_SUFFIX:=$$($1_LDFLAGS_SUFFIX_$(OPENJDK_TARGET_OS_API)) $$($1_LDFLAGS_SUFFIX_$(OPENJDK_TARGET_OS))
  ifneq (,$$($1_REAL_MAPFILE))
    $1_EXTRA_LDFLAGS += $(call SET_SHARED_LIBRARY_MAPFILE,$$($1_REAL_MAPFILE))
  endif

  $1_EXTRA_LDFLAGS += $(SYSROOT_LDFLAGS)

  # Need to make sure TARGET is first on list
  $1 := $$($1_TARGET)
  ifeq ($$($1_STATIC_LIBRARY),)
    ifneq ($$($1_DEBUG_SYMBOLS),)
      ifeq ($(ENABLE_DEBUG_SYMBOLS), true)
        ifneq ($(OPENJDK_TARGET_OS), macosx) # no MacOS X support yet
          ifneq ($$($1_OUTPUT_DIR),$$($1_OBJECT_DIR))
            # The dependency on TARGET is needed on windows for debuginfo files
            # to be rebuilt properly.
            $$($1_OUTPUT_DIR)/% : $$($1_OBJECT_DIR)/% $$($1_TARGET)
		$(CP) $$< $$@
          endif

          # Generate debuginfo files.
          ifeq ($(OPENJDK_TARGET_OS), windows)
            $1_EXTRA_LDFLAGS += "-pdb:$$($1_OBJECT_DIR)/$$($1_NOSUFFIX).pdb" \
                "-map:$$($1_OBJECT_DIR)/$$($1_NOSUFFIX).map"
            $1_DEBUGINFO_FILES := $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).pdb \
                $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).map

            # This dependency dance ensures that windows debug info files get rebuilt
            # properly if deleted.
            $$($1_TARGET): $$($1_DEBUGINFO_FILES)
            $$($1_DEBUGINFO_FILES): $$($1_EXPECTED_OBJS)

          else ifeq ($(OPENJDK_TARGET_OS), solaris)
            $1_DEBUGINFO_FILES := $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).debuginfo
            # gobjcopy crashes on "empty" section headers with the SHF_ALLOC flag set.
            # Use $(FIX_EMPTY_SEC_HDR_FLAGS) to clear the SHF_ALLOC flag (if set) from
            # empty section headers until a fixed $(OBJCOPY) is available.
            # An empty section header has sh_addr == 0 and sh_size == 0.
            # This problem has only been seen on Solaris X64, but we call this tool
            # on all Solaris builds just in case.
            #
            # $(OBJCOPY) --add-gnu-debuglink=... corrupts SUNW_* sections.
            # Use $(ADD_GNU_DEBUGLINK) until a fixed $(OBJCOPY) is available.
            $$($1_DEBUGINFO_FILES): $$($1_TARGET) \
                $(FIX_EMPTY_SEC_HDR_FLAGS) $(ADD_GNU_DEBUGLINK)
			$(RM) $$@
			$(FIX_EMPTY_SEC_HDR_FLAGS) $(LOG_INFO) $$<
			$(OBJCOPY) --only-keep-debug $$< $$@
			$(CD) $$(@D) && $(ADD_GNU_DEBUGLINK) $(LOG_INFO) $$(@F) $$<
			$(TOUCH) $$@

          else ifeq ($(OPENJDK_TARGET_OS), linux)
            $1_DEBUGINFO_FILES := $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).debuginfo
            $$($1_DEBUGINFO_FILES): $$($1_TARGET)
			$(RM) $$@
			$(OBJCOPY) --only-keep-debug $$< $$@
			$(CD) $$(@D) && $(OBJCOPY) --add-gnu-debuglink=$$(@F) $$<
			$(TOUCH) $$@

          endif # No MacOS X support

          ifeq ($(ZIP_DEBUGINFO_FILES), true)
            $1_DEBUGINFO_ZIP := $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).diz
            $1 += $$(subst $$($1_OBJECT_DIR),$$($1_OUTPUT_DIR),$$($1_DEBUGINFO_ZIP))

            # The dependency on TARGET is needed on windows for debuginfo files
            # to be rebuilt properly.
            $$($1_DEBUGINFO_ZIP): $$($1_DEBUGINFO_FILES) $$($1_TARGET)
		$(CD) $$($1_OBJECT_DIR) \
		&& $(ZIP) -q $$@ $$(notdir $$($1_DEBUGINFO_FILES))

          else
            $1 += $$(subst $$($1_OBJECT_DIR),$$($1_OUTPUT_DIR),$$($1_DEBUGINFO_FILES))
          endif
        endif
      endif # !MacOS X
    endif # $1_DEBUG_SYMBOLS
  endif # !STATIC_LIBRARY

  ifneq (,$$($1_LIBRARY))
    # Generating a dynamic library.
    $1_EXTRA_LDFLAGS+=$$(call SET_SHARED_LIBRARY_NAME,$$($1_BASENAME))
    ifeq ($(OPENJDK_TARGET_OS), windows)
      $1_EXTRA_LDFLAGS+="-implib:$$($1_OBJECT_DIR)/$$($1_LIBRARY).lib"
    endif

    $1_EXTRA_LDFLAGS_SUFFIX += $(GLOBAL_LDFLAGS_SUFFIX)

    $$($1_TARGET) : $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_REAL_MAPFILE)
	$$(call LINKING_MSG,$$($1_BASENAME))
	$$($1_LD) $$($1_LDFLAGS) $$($1_EXTRA_LDFLAGS) $(LD_OUT_OPTION)$$@ \
	$$($1_EXPECTED_OBJS) $$($1_RES) $$($1_LDFLAGS_SUFFIX) \
	$$($1_EXTRA_LDFLAGS_SUFFIX)
        # Touch target to make sure it has a later time stamp than the debug
        # symbol files to avoid unnecessary relinking on rebuild.
        ifeq ($(OPENJDK_TARGET_OS), windows)
	  $(TOUCH) $$@
        endif

  endif

  ifneq (,$$($1_STATIC_LIBRARY))
    # Generating a static library, ie object file archive.
    $$($1_TARGET) : $$($1_EXPECTED_OBJS) $$($1_RES)
	$$(call ARCHIVING_MSG,$$($1_LIBRARY))
	$(AR) $$($1_ARFLAGS) $(AR_OUT_OPTION)$$($1_TARGET) $$($1_EXPECTED_OBJS) \
	    $$($1_RES) $$($1_LDFLAGS_SUFFIX) $$($1_EXTRA_LDFLAGS_SUFFIX)
  endif

  ifneq (,$$($1_PROGRAM))
    # A executable binary has been specified, setup the target for it.
    $1_EXTRA_LDFLAGS_SUFFIX += $(GLOBAL_LDFLAGS_SUFFIX)

    $$($1_TARGET) : $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_GEN_MANIFEST)
	$$(call LINKING_EXE_MSG,$$($1_BASENAME))
	$$($1_LDEXE) $$($1_LDFLAGS) $$($1_EXTRA_LDFLAGS) $(EXE_OUT_OPTION)$$($1_TARGET) \
	$$($1_EXPECTED_OBJS) $$($1_RES) $$($1_LDFLAGS_SUFFIX) \
	$$($1_EXTRA_LDFLAGS_SUFFIX)
        ifneq (,$$($1_GEN_MANIFEST))
	  $(MT) -nologo -manifest $$($1_GEN_MANIFEST) -outputresource:$$@;#1
        endif
        # This only works if the openjdk_codesign identity is present on the system. Let
        # silently fail otherwise.
        ifneq (,$(CODESIGN))
          ifneq (,$$($1_CODESIGN))
	    $(CODESIGN) -s openjdk_codesign $$@
          endif
        endif
        # Touch target to make sure it has a later time stamp than the debug
        # symbol files to avoid unnecessary relinking on rebuild.
        ifeq ($(OPENJDK_TARGET_OS), windows)
	  $(TOUCH) $$@
        endif

  endif
endef
