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

ifeq ($(COMPILER_TYPE),CC)
  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 ($(COMPILER_TYPE),CL)
        $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
        ifeq ($(COMPILER_TYPE),CC)
	  $$(call COMPILING_MSG,$2,$$($1_TARGET))
          # The Sun 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 ($(COMPILER_NAME)$$(filter %.s,$2),ossc)
	    $$($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 ($(COMPILER_TYPE),CL)
	  ($$($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)

  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)
  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)

  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

  ifeq ($$($1_CXXFLAGS),)
    $1_CXXFLAGS:=$$($1_CFLAGS)
  endif
  ifeq ($$(strip $$($1_EXTRA_CXXFLAGS)),)
    $1_EXTRA_CXXFLAGS:=$$($1_EXTRA_CFLAGS)
  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

  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

  # 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 := $$($1_TARGET)
  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)

    ifneq (,$$($1_DEBUG_SYMBOLS))
      ifeq ($(ENABLE_DEBUG_SYMBOLS), true)
        ifeq ($(OPENJDK_TARGET_OS), windows)
          $1_EXTRA_LDFLAGS+="-pdb:$$($1_OBJECT_DIR)/$$($1_LIBRARY).pdb" \
              "-map:$$($1_OBJECT_DIR)/$$($1_LIBRARY).map"
        endif

        ifneq ($$($1_OUTPUT_DIR),$$($1_OBJECT_DIR))
          $$($1_OUTPUT_DIR)/% : $$($1_OBJECT_DIR)/%
		$(CP) $$< $$@
        endif

        ifneq ($(OPENJDK_TARGET_OS), macosx)   # OBJCOPY is not used on MacOS X
          ifneq ($(OPENJDK_TARGET_OS), windows)  # nor on Windows
            ifeq ($(OPENJDK_TARGET_OS), solaris)
              # 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_OBJECT_DIR)/$$(LIBRARY_PREFIX)$$($1_LIBRARY).debuginfo : $$($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) $$<
            else # not solaris
              $$($1_OBJECT_DIR)/$$(LIBRARY_PREFIX)$$($1_LIBRARY).debuginfo : $$($1_TARGET)
		$(RM) $$@
		$(OBJCOPY) --only-keep-debug $$< $$@
		$(CD) $$(@D) && $(OBJCOPY) --add-gnu-debuglink=$$(@F) $$<
            endif # Touch to not retrigger rule on rebuild
		$(TOUCH) $$@
          endif # !windows
        endif # !macosx

        ifeq ($(ZIP_DEBUGINFO_FILES), true)
ifneq ($(OPENJDK_TARGET_OS), macosx) # no MacOS X support yet
          $1 += $$($1_OUTPUT_DIR)/$$(LIBRARY_PREFIX)$$($1_LIBRARY).diz

          ifeq ($(OPENJDK_TARGET_OS), windows)
            $$($1_OBJECT_DIR)/$$(LIBRARY_PREFIX)$$($1_LIBRARY).diz : $$($1_TARGET)
		$(CD) $$($1_OBJECT_DIR) \
		&& $(ZIP) -q $$@ $$($1_LIBRARY).map $$($1_LIBRARY).pdb
          else
            $$($1_OBJECT_DIR)/$$(LIBRARY_PREFIX)$$($1_LIBRARY).diz : $$($1_TARGET) \
                $$($1_OBJECT_DIR)/$$(LIBRARY_PREFIX)$$($1_LIBRARY).debuginfo
		$(CD) $$($1_OBJECT_DIR) \
		&& $(ZIP) -q $$@ $$(LIBRARY_PREFIX)$$($1_LIBRARY).debuginfo
          endif
endif # no MacOS X support yet
        else
          ifeq ($(OPENJDK_TARGET_OS), windows)
            $1 += $$($1_OUTPUT_DIR)/$$($1_LIBRARY).map \
                $$($1_OUTPUT_DIR)/$$($1_LIBRARY).pdb
          else ifneq ($(OPENJDK_TARGET_OS), macosx) # MacOS X does not use .debuginfo files
            $1 += $$($1_OUTPUT_DIR)/$$(LIBRARY_PREFIX)$$($1_LIBRARY).debuginfo
          endif
        endif
      endif
    endif

    $$($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)

  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.
    ifneq (,$$($1_DEBUG_SYMBOLS))
      ifeq ($(ENABLE_DEBUG_SYMBOLS), true)
        ifeq ($(OPENJDK_TARGET_OS), windows)
          $1_EXTRA_LDFLAGS+="-pdb:$$($1_OBJECT_DIR)/$$($1_PROGRAM).pdb" \
              "-map:$$($1_OBJECT_DIR)/$$($1_PROGRAM).map"
        endif

        ifneq ($$($1_OUTPUT_DIR),$$($1_OBJECT_DIR))
          $$($1_OUTPUT_DIR)/% : $$($1_OBJECT_DIR)/%
		$(CP) $$< $$@
        endif

        ifneq ($(OPENJDK_TARGET_OS), macosx)   # OBJCOPY is not used on MacOS X
          ifneq ($(OPENJDK_TARGET_OS), windows)  # nor on Windows
            ifeq ($(OPENJDK_TARGET_OS), solaris)
              # 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_OBJECT_DIR)/$$($1_PROGRAM).debuginfo : $$($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) $$<
            else # not solaris
              $$($1_OBJECT_DIR)/$$($1_PROGRAM).debuginfo : $$($1_TARGET)
		$(RM) $$@
		$(OBJCOPY) --only-keep-debug $$< $$@
		$(CD) $$(@D) && $(OBJCOPY) --add-gnu-debuglink=$$(@F) $$<
            endif
		$(TOUCH) $$@
          endif # !windows
        endif # !macosx

        ifeq ($(ZIP_DEBUGINFO_FILES), true)
ifneq ($(OPENJDK_TARGET_OS), macosx) # no MacOS X support yet
          $1 += $$($1_OUTPUT_DIR)/$$($1_PROGRAM).diz

          ifeq ($(OPENJDK_TARGET_OS), windows)
            $$($1_OBJECT_DIR)/$$($1_PROGRAM).diz : $$($1_TARGET)
		$(CD) $$($1_OBJECT_DIR) \
		&& $(ZIP) -q $$@ $$($1_PROGRAM).map $$($1_PROGRAM).pdb
          else
            $$($1_OBJECT_DIR)/$$(PROGRAM_PREFIX)$$($1_PROGRAM).diz : $$($1_TARGET) \
                $$($1_OBJECT_DIR)/$$($1_PROGRAM).debuginfo
		$(CD) $$($1_OBJECT_DIR) \
		&& $(ZIP) -q $$@ $$($1_PROGRAM).debuginfo
          endif
endif # no MacOS X support yet
        else
          ifeq ($(OPENJDK_TARGET_OS), windows)
            $1 += $$($1_OUTPUT_DIR)/$$($1_PROGRAM).map \
                $$($1_OUTPUT_DIR)/$$($1_PROGRAM).pdb
          else ifneq ($(OPENJDK_TARGET_OS), macosx) # MacOS X does not use .debuginfo files
            $1 += $$($1_OUTPUT_DIR)/$$($1_PROGRAM).debuginfo
          endif
        endif
      endif
    endif

    $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
  endif
endef
