1 #
   2 # Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
   3 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4 #
   5 # This code is free software; you can redistribute it and/or modify it
   6 # under the terms of the GNU General Public License version 2 only, as
   7 # published by the Free Software Foundation.  Oracle designates this
   8 # particular file as subject to the "Classpath" exception as provided
   9 # by Oracle in the LICENSE file that accompanied this code.
  10 #
  11 # This code is distributed in the hope that it will be useful, but WITHOUT
  12 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13 # FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14 # version 2 for more details (a copy is included in the LICENSE file that
  15 # accompanied this code).
  16 #
  17 # You should have received a copy of the GNU General Public License version
  18 # 2 along with this work; if not, write to the Free Software Foundation,
  19 # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20 #
  21 # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22 # or visit www.oracle.com if you need additional information or have any
  23 # questions.
  24 #
  25 
  26 # When you read this source. Remember that $(sort ...) has the side effect
  27 # of removing duplicates. It is actually this side effect that is
  28 # desired whenever sort is used below!
  29 
  30 ifeq  (,$(_MAKEBASE_GMK))
  31     $(error You must include MakeBase.gmk prior to including NativeCompilation.gmk)
  32 endif
  33 
  34 ifeq ($(COMPILER_TYPE),CC)
  35     COMPILING_MSG=echo $(LOG_INFO) "Compiling $(notdir $1) (for $(notdir $2))"
  36     LINKING_MSG=echo $(LOG_INFO) "Linking $1"
  37     LINKING_EXE_MSG=echo $(LOG_INFO) "Linking executable $1"
  38     ARCHIVING_MSG=echo $(LOG_INFO) "Archiving $1"
  39 else
  40     COMPILING_MSG=
  41     LINKING_MSG=
  42     LINKING_EXE_MSG=
  43     ARCHIVING_MSG=
  44 endif
  45 
  46 define add_native_source
  47     # param 1 = BUILD_MYPACKAGE
  48     # parma 2 = the source file name (..../alfa.c or .../beta.cpp)
  49     # param 3 = the bin dir that stores all .o (.obj) and .d files.
  50     # param 4 = the c flags to the compiler
  51     # param 5 = the c compiler
  52     # param 6 = the c++ flags to the compiler
  53     # param 7 = the c++ compiler
  54     # param 8 = the flags to the assembler
  55 
  56     ifneq (,$$(filter %.c,$2))
  57         # Compile as a C file
  58         $1_$2_FLAGS=$4 $$($1_$(notdir $2)_CFLAGS) -DTHIS_FILE='"$$(<F)"' -c
  59         $1_$2_COMP=$5
  60         $1_$2_DEP_FLAG:=$(C_FLAG_DEPS)
  61     else ifneq (,$$(filter %.m,$2))
  62         # Compile as a objective-c file
  63         $1_$2_FLAGS=-x objective-c $4 $$($1_$(notdir $2)_CFLAGS) -DTHIS_FILE='"$$(<F)"' -c
  64         $1_$2_COMP=$5
  65         $1_$2_DEP_FLAG:=$(C_FLAG_DEPS)
  66     else ifneq (,$$(filter %.s,$2))
  67         # Compile as assembler file
  68         $1_$2_FLAGS=$8 -DTHIS_FILE='"$$(<F)"'
  69         $1_$2_COMP=$(AS)
  70         $1_$2_DEP_FLAG:=
  71     else
  72         # Compile as a C++ file
  73         $1_$2_FLAGS=$6 $$($1_$(notdir $2)_CXXFLAGS) -DTHIS_FILE='"$$(<F)"' -c
  74         $1_$2_COMP=$7
  75         $1_$2_DEP_FLAG:=$(CXX_FLAG_DEPS)
  76     endif
  77     # Generate the .o (.obj) file name and place it in the bin dir.
  78     $1_$2_OBJ:=$3/$$(patsubst %.cpp,%$(OBJ_SUFFIX),$$(patsubst %.c,%$(OBJ_SUFFIX),$$(patsubst %.m,%$(OBJ_SUFFIX),$$(patsubst %.s,%$(OBJ_SUFFIX),$$(notdir $2)))))
  79     # Only continue if this object file hasn't been processed already. This lets the first found
  80     # source file override any other with the same name.
  81     ifeq (,$$(findstring $$($1_$2_OBJ),$$($1_OBJS_SO_FAR)))
  82         $1_OBJS_SO_FAR+=$$($1_$2_OBJ)
  83         ifeq (,$$(filter %.s,$2))
  84           # And this is the dependency file for this obj file.
  85           $1_$2_DEP:=$$(patsubst %$(OBJ_SUFFIX),%.d,$$($1_$2_OBJ))
  86           # Include previously generated dependency information. (if it exists)
  87           -include $$($1_$2_DEP)
  88 
  89           ifeq ($(COMPILER_TYPE),CL)
  90               $1_$2_DEBUG_OUT_FLAGS:=-Fd$$(patsubst %$(OBJ_SUFFIX),%.pdb,$$($1_$2_OBJ)) \
  91                                      -Fm$$(patsubst %$(OBJ_SUFFIX),%.map,$$($1_$2_OBJ))
  92           endif
  93         endif
  94 
  95         $$($1_$2_OBJ) : $2
  96         ifeq ($(COMPILER_TYPE),CC)
  97                 $$(call COMPILING_MSG,$2,$$($1_TARGET))
  98                 $$($1_$2_COMP) $$($1_$2_FLAGS) $$($1_$2_DEP_FLAG) $$($1_$2_DEP) $(CC_OUT_OPTION)$$($1_$2_OBJ) $2
  99         endif
 100         ifeq ($(COMPILER_TYPE),CL)
 101                 $$($1_$2_COMP) $$($1_$2_FLAGS) $$($1_$2_DEBUG_OUT_FLAGS) $(CC_OUT_OPTION)$$($1_$2_OBJ) $2
 102         endif
 103     endif
 104 endef
 105 
 106 define SetupNativeCompilation
 107     # param 1 is for example BUILD_MYPACKAGE
 108     # param 2,3,4,5,6,7,8 are named args.
 109     #    SRC one or more directory roots to scan for C/C++ files.
 110     #    LANG C or C++
 111     #    CFLAGS the compiler flags to be used, used both for C and C++.
 112     #    CXXFLAGS the compiler flags to be used for c++, if set overrides CFLAGS.
 113     #    LDFLAGS the linker flags to be used, used both for C and C++.
 114     #    LDFLAGS_SUFFIX the linker flags to be added last on the commandline
 115     #        typically the libraries linked to.
 116     #    ARFLAGS the archiver flags to be used
 117     #    OBJECT_DIR the directory where we store the object files
 118     #    LIBRARY the resulting library file
 119     #    PROGRAM the resulting exec file
 120     #    INCLUDES only pick source from these directories
 121     #    EXCLUDES do not pick source from these directories
 122     #    INCLUDE_FILES only compile exactly these files!
 123     #    EXCLUDE_FILES with these names
 124     #    VERSIONINFO_RESOURCE Input file for RC. Setting this implies that RC will be run
 125     #    RC_FLAGS flags for RC.
 126     #    MAPFILE mapfile
 127     #    REORDER reorder file
 128     #    DEBUG_SYMBOLS add debug symbols (if configured on)
 129     #    CC the compiler to use, default is $(CC)
 130     #    LDEXE the linker to use for linking executables, default is $(LDEXE)
 131     #    OPTIMIZATION sets optimization level to NONE, LOW, HIGH, HIGHEST
 132     $(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, $(if $($i),$1_$(strip $($i)))$(NEWLINE))
 133     $(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))
 134     $(if $(26),$(error Internal makefile error: Too many arguments to SetupNativeCompilation, please update NativeCompilation.gmk))
 135 
 136     ifneq (,$$($1_BIN))
 137         $$(error BIN has been replaced with OBJECT_DIR)
 138     endif
 139 
 140     ifneq (,$$($1_LIB))
 141         $$(error LIB has been replaced with LIBRARY)
 142     endif
 143 
 144     ifneq (,$$($1_EXE))
 145         $$(error EXE has been replaced with PROGRAM)
 146     endif
 147 
 148     ifneq (,$$($1_LIBRARY))
 149         ifeq (,$$($1_OUTPUT_DIR))
 150             $$(error LIBRARY requires OUTPUT_DIR)
 151         endif
 152 
 153         ifneq ($$($1_LIBRARY),$(basename $$($1_LIBRARY)))
 154             $$(error directory of LIBRARY should be specified using OUTPUT_DIR)
 155         endif
 156 
 157         ifneq (,$(findstring $(SHARED_LIBRARY_SUFFIX),$$($1_LIBRARY)))
 158             $$(error LIBRARY should be specified without SHARED_LIBRARY_SUFFIX: $(SHARED_LIBRARY_SUFFIX))
 159         endif
 160 
 161         ifneq (,$(findstring $(LIBRARY_PREFIX),$$($1_LIBRARY)))
 162             $$(error LIBRARY should be specified without LIBRARY_PREFIX: $(LIBRARY_PREFIX))
 163         endif
 164 
 165         $1_BASENAME:=$(LIBRARY_PREFIX)$$($1_LIBRARY)$(SHARED_LIBRARY_SUFFIX)
 166         $1_TARGET:=$$($1_OUTPUT_DIR)/$$($1_BASENAME)
 167 
 168     endif
 169 
 170     ifneq (,$$($1_STATIC_LIBRARY))
 171         ifeq (,$$($1_OUTPUT_DIR))
 172             $$(error STATIC_LIBRARY requires OUTPUT_DIR)
 173         endif
 174 
 175         ifneq ($$($1_STATIC_LIBRARY),$(basename $$($1_STATIC_LIBRARY)))
 176             $$(error directory of STATIC_LIBRARY should be specified using OUTPUT_DIR)
 177         endif
 178 
 179         ifneq (,$(findstring $(STATIC_LIBRARY_SUFFIX),$$($1_STATIC_LIBRARY)))
 180             $$(error STATIC_LIBRARY should be specified without STATIC_LIBRARY_SUFFIX: $(STATIC_LIBRARY_SUFFIX))
 181         endif
 182 
 183         ifneq (,$(findstring $(LIBRARY_PREFIX),$$($1_STATIC_LIBRARY)))
 184             $$(error STATIC_LIBRARY should be specified without LIBRARY_PREFIX: $(LIBRARY_PREFIX))
 185         endif
 186 
 187         $1_BASENAME:=$(LIBRARY_PREFIX)$$($1_STATIC_LIBRARY)$(STATIC_LIBRARY_SUFFIX)
 188         $1_TARGET:=$$($1_OUTPUT_DIR)/$$($1_BASENAME)
 189     endif
 190 
 191     ifneq (,$$($1_PROGRAM))
 192         ifeq (,$$($1_OUTPUT_DIR))
 193             $$(error PROGRAM requires OUTPUT_DIR)
 194         endif
 195 
 196         ifneq ($$($1_PROGRAM),$(basename $$($1_PROGRAM)))
 197             $$(error directory of PROGRAM should be specified using OUTPUT_DIR)
 198         endif
 199 
 200         ifneq (,$(findstring $(EXE_SUFFIX),$$($1_PROGRAM)))
 201             $$(error PROGRAM should be specified without EXE_SUFFIX: $(EXE_SUFFIX))
 202         endif
 203 
 204         $1_BASENAME:=$$($1_PROGRAM)$(EXE_SUFFIX)
 205         $1_TARGET:=$$($1_OUTPUT_DIR)/$$($1_BASENAME)
 206 
 207     endif
 208 
 209     ifeq (,$$($1_TARGET))
 210         $$(error Neither PROGRAM, LIBRARY nor STATIC_LIBRARY has been specified for SetupNativeCompilation)
 211     endif
 212 
 213     ifeq (,$$($1_LANG))
 214         $$(error You have to specify LANG for native compilation $1)
 215     endif
 216     ifeq (C,$$($1_LANG))
 217         ifeq ($$($1_LDEXE),)
 218             $1_LDEXE:=$(LDEXE)
 219         endif
 220         $1_LD:=$(LD)
 221     else
 222        ifeq (C++,$$($1_LANG))
 223            $1_LD:=$(LDCXX)
 224            $1_LDEXE:=$(LDEXECXX)
 225        else
 226            $$(error Unknown native language $$($1_LANG) for $1)
 227        endif
 228     endif
 229 
 230     ifeq ($$($1_CC),)
 231         $1_CC:=$(CC)
 232     endif
 233 
 234     # Make sure the dirs exist.
 235     $$(eval $$(call MakeDir,$$($1_OBJECT_DIR) $$($1_OUTPUT_DIR)))
 236     $$(foreach d,$$($1_SRC), $$(if $$(wildcard $$d),,$$(error SRC specified to SetupNativeCompilation $1 contains missing directory $$d)))
 237 
 238     # Find all files in the source trees. Sort to remove duplicates.
 239     $1_ALL_SRCS := $$(sort $$(call CacheFind,$$($1_SRC)))
 240     # Extract the C/C++ files.
 241     $1_EXCLUDE_FILES:=$$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$($1_EXCLUDE_FILES)))
 242     $1_INCLUDE_FILES:=$$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$($1_INCLUDE_FILES)))
 243     ifneq ($$($1_EXCLUDE_FILES),)
 244         $1_EXCLUDE_FILES:=$$(addprefix %,$$($1_EXCLUDE_FILES))
 245     endif
 246     $1_SRCS     := $$(filter-out $$($1_EXCLUDE_FILES),$$(filter %.s %.c %.cpp %.m,$$($1_ALL_SRCS)))
 247     ifneq (,$$(strip $$($1_INCLUDE_FILES)))
 248         $1_SRCS := $$(filter $$($1_INCLUDE_FILES),$$($1_SRCS))
 249     endif
 250     ifeq (,$$($1_SRCS))
 251         $$(error No sources found for $1 when looking inside the dirs $$($1_SRC))
 252     endif
 253     # There can be only a single bin dir root, no need to foreach over the roots.
 254     $1_BINS     := $$(wildcard $$($1_OBJECT_DIR)/*$(OBJ_SUFFIX))
 255     # Now we have a list of all c/c++ files to compile: $$($1_SRCS)
 256     # and we have a list of all existing object files: $$($1_BINS)
 257 
 258     # Prepend the source/bin path to the filter expressions. Then do the filtering.
 259     ifneq ($$($1_INCLUDES),)
 260         $1_SRC_INCLUDES := $$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$(addsuffix /%,$$($1_INCLUDES))))
 261         $1_SRCS         := $$(filter $$($1_SRC_INCLUDES),$$($1_SRCS))
 262     endif
 263     ifneq ($$($1_EXCLUDES),)
 264         $1_SRC_EXCLUDES := $$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$(addsuffix /%,$$($1_EXCLUDES))))
 265         $1_SRCS         := $$(filter-out $$($1_SRC_EXCLUDES),$$($1_SRCS))
 266     endif
 267 
 268     # Calculate the expected output from compiling the sources (sort to remove duplicates. Also provides
 269     # a reproducable order on the input files to the linker).
 270     $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))))))))
 271     # Are there too many object files on disk? Perhaps because some source file was removed?
 272     $1_SUPERFLOUS_OBJS:=$$(sort $$(filter-out $$($1_EXPECTED_OBJS),$$($1_BINS)))
 273     # Clean out the superfluous object files.
 274     ifneq ($$($1_SUPERFLUOUS_OBJS),)
 275         $$(shell $(RM) -f $$($1_SUPERFLUOUS_OBJS))
 276     endif
 277 
 278     # Pickup extra OPENJDK_TARGET_OS_API and/or OPENJDK_TARGET_OS dependent variables for CFLAGS.
 279     $1_EXTRA_CFLAGS:=$$($1_CFLAGS_$(OPENJDK_TARGET_OS_API)) $$($1_CFLAGS_$(OPENJDK_TARGET_OS))
 280     ifneq ($(DEBUG_LEVEL),release)
 281         # Pickup extra debug dependent variables for CFLAGS
 282         $1_EXTRA_CFLAGS+=$$($1_CFLAGS_debug)
 283         $1_EXTRA_CFLAGS+=$$($1_CFLAGS_$(OPENJDK_TARGET_OS_API)_debug)
 284         $1_EXTRA_CFLAGS+=$$($1_CFLAGS_$(OPENJDK_TARGET_OS)_debug)
 285     else
 286         $1_EXTRA_CFLAGS+=$$($1_CFLAGS_release)
 287         $1_EXTRA_CFLAGS+=$$($1_CFLAGS_$(OPENJDK_TARGET_OS_API)_release)
 288         $1_EXTRA_CFLAGS+=$$($1_CFLAGS_$(OPENJDK_TARGET_OS)_release)
 289     endif
 290 
 291     # Pickup extra OPENJDK_TARGET_OS_API and/or OPENJDK_TARGET_OS dependent variables for CXXFLAGS.
 292     $1_EXTRA_CXXFLAGS:=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS_API)) $$($1_CXXFLAGS_$(OPENJDK_TARGET_OS))
 293     ifneq ($(DEBUG_LEVEL),release)
 294         # Pickup extra debug dependent variables for CXXFLAGS
 295         $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_debug)
 296         $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS_API)_debug)
 297         $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS)_debug)
 298     else
 299         $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_release)
 300         $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS_API)_release)
 301         $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS)_release)
 302     endif
 303 
 304     ifneq (,$$($1_DEBUG_SYMBOLS))       
 305         ifeq ($(ENABLE_DEBUG_SYMBOLS), true)
 306             # Programs don't get the debug symbols added in the old build. It's not clear if
 307             # this is intentional.
 308             ifeq ($$($1_PROGRAM),)
 309                 $1_EXTRA_CFLAGS+=$(CFLAGS_DEBUG_SYMBOLS)
 310                 $1_EXTRA_CXXFLAGS+=$(CXXFLAGS_DEBUG_SYMBOLS)
 311             endif
 312         endif
 313     endif
 314 
 315     ifeq ($$($1_CXXFLAGS),)
 316         $1_CXXFLAGS:=$$($1_CFLAGS)
 317     endif
 318     ifeq ($$(strip $$($1_EXTRA_CXXFLAGS)),)
 319         $1_EXTRA_CXXFLAGS:=$$($1_EXTRA_CFLAGS)
 320     endif
 321 
 322     ifneq (,$$($1_REORDER))
 323           $1_EXTRA_CFLAGS += $$(C_FLAG_REORDER)
 324           $1_EXTRA_CXXFLAGS += $$(CXX_FLAG_REORDER)
 325     endif
 326 
 327     ifeq (NONE, $$($1_OPTIMIZATION))
 328         $1_EXTRA_CFLAGS += $(C_O_FLAG_NONE)
 329         $1_EXTRA_CXXFLAGS += $(CXX_O_FLAG_NONE)
 330     else ifeq (LOW, $$($1_OPTIMIZATION))
 331         $1_EXTRA_CFLAGS += $(C_O_FLAG_NORM)
 332         $1_EXTRA_CXXFLAGS += $(CXX_O_FLAG_NORM)
 333     else ifeq (HIGH, $$($1_OPTIMIZATION))
 334         $1_EXTRA_CFLAGS += $(C_O_FLAG_HI)
 335         $1_EXTRA_CXXFLAGS += $(CXX_O_FLAG_HI)
 336     else ifeq (HIGHEST, $$($1_OPTIMIZATION))
 337         $1_EXTRA_CFLAGS += $(C_O_FLAG_HIGHEST)
 338         $1_EXTRA_CXXFLAGS += $(CXX_O_FLAG_HIGHEST)
 339     else ifneq (, $$($1_OPTIMIZATION))
 340         $$(error Unknown value for OPTIMIZATION: $$($1_OPTIMIZATION))
 341     endif
 342 
 343     # Now call add_native_source for each source file we are going to compile.
 344     $$(foreach p,$$($1_SRCS),\
 345         $$(eval $$(call add_native_source,$1,$$p,$$($1_OBJECT_DIR),\
 346                         $$($1_CFLAGS) $$($1_EXTRA_CFLAGS),$$($1_CC),\
 347                         $$($1_CXXFLAGS) $$($1_EXTRA_CXXFLAGS),$(CXX),$$($1_ASFLAGS))))
 348 
 349     # On windows we need to create a resource file
 350     ifeq ($(OPENJDK_TARGET_OS), windows)
 351         ifneq (,$$($1_VERSIONINFO_RESOURCE))
 352             $1_RES:=$$($1_OBJECT_DIR)/$$($1_BASENAME).res
 353             $$($1_RES): $$($1_VERSIONINFO_RESOURCE)
 354                 $(RC) $$($1_RC_FLAGS) $(CC_OUT_OPTION)$$@ $$($1_VERSIONINFO_RESOURCE)
 355         endif
 356         ifneq (,$$($1_MANIFEST))
 357             $1_GEN_MANIFEST:=$$($1_OBJECT_DIR)/$$($1_PROGRAM).manifest
 358             IMVERSIONVALUE:=$(JDK_MINOR_VERSION).$(JDK_MICRO_VERSION).$(JDK_UPDATE_VERSION).$(COOKED_BUILD_NUMBER)
 359             $$($1_GEN_MANIFEST): $$($1_MANIFEST)
 360                 $(SED) 's%IMVERSION%$$(IMVERSIONVALUE)%g;s%PROGRAM%$$($1_PROGRAM)%g' $$< > $$@
 361         endif
 362     endif
 363 
 364     # mapfile doesnt seem to be implemented on macosx (yet??)
 365     ifneq ($(OPENJDK_TARGET_OS),macosx)
 366     ifneq ($(OPENJDK_TARGET_OS),windows)
 367         $1_REAL_MAPFILE:=$$($1_MAPFILE)
 368         ifneq (,$$($1_REORDER))
 369             $1_REAL_MAPFILE:=$$($1_OBJECT_DIR)/mapfile
 370 
 371             $$($1_REAL_MAPFILE) : $$($1_MAPFILE) $$($1_REORDER)
 372                 $$(MKDIR) -p $$(@D)
 373                 $$(CP) $$($1_MAPFILE) $$@.tmp
 374                 $$(SED) -e 's=OUTPUTDIR=$$($1_OBJECT_DIR)=' $$($1_REORDER) >> $$@.tmp
 375                 $$(MV) $$@.tmp $$@
 376         endif
 377     endif
 378     endif
 379 
 380     # Pickup extra OPENJDK_TARGET_OS_API and/or OPENJDK_TARGET_OS dependent variables
 381     # for LDFLAGS and LDFLAGS_SUFFIX
 382     $1_EXTRA_LDFLAGS:=$$($1_LDFLAGS_$(OPENJDK_TARGET_OS_API)) $$($1_LDFLAGS_$(OPENJDK_TARGET_OS))
 383     $1_EXTRA_LDFLAGS_SUFFIX:=$$($1_LDFLAGS_SUFFIX_$(OPENJDK_TARGET_OS_API)) $$($1_LDFLAGS_SUFFIX_$(OPENJDK_TARGET_OS))
 384     ifneq (,$$($1_REAL_MAPFILE))
 385         $1_EXTRA_LDFLAGS += $(call SET_SHARED_LIBRARY_MAPFILE,$$($1_REAL_MAPFILE))
 386     endif
 387 
 388     $1 := $$($1_TARGET)
 389     ifneq (,$$($1_LIBRARY))
 390         # Generating a dynamic library.
 391         $1_EXTRA_LDFLAGS+=$$(call SET_SHARED_LIBRARY_NAME,$$($1_BASENAME))
 392         ifeq ($(OPENJDK_TARGET_OS), windows)
 393             $1_EXTRA_LDFLAGS+="-implib:$$($1_OBJECT_DIR)/$$($1_LIBRARY).lib"
 394         endif
 395 
 396         $1_EXTRA_LDFLAGS_SUFFIX += $(GLOBAL_LDFLAGS_SUFFIX)        
 397 
 398         ifneq (,$$($1_DEBUG_SYMBOLS))
 399             ifeq ($(ENABLE_DEBUG_SYMBOLS), true)
 400                 ifeq ($(OPENJDK_TARGET_OS), windows)
 401                     $1_EXTRA_LDFLAGS+="-pdb:$$($1_OBJECT_DIR)/$$($1_LIBRARY).pdb" \
 402                                       "-map:$$($1_OBJECT_DIR)/$$($1_LIBRARY).map"
 403                 endif
 404 
 405                 ifneq ($$($1_OUTPUT_DIR),$$($1_OBJECT_DIR))
 406                     $$($1_OUTPUT_DIR)/% : $$($1_OBJECT_DIR)/%
 407                         $(CP) $$< $$@
 408                 endif
 409 
 410                 ifeq ($(OPENJDK_TARGET_OS), solaris)
 411                     # gobjcopy crashes on "empty" section headers with the SHF_ALLOC flag set.
 412                     # Use $(FIX_EMPTY_SEC_HDR_FLAGS) to clear the SHF_ALLOC flag (if set) from
 413                     # empty section headers until a fixed $(OBJCOPY) is available.
 414                     # An empty section header has sh_addr == 0 and sh_size == 0.
 415                     # This problem has only been seen on Solaris X64, but we call this tool
 416                     # on all Solaris builds just in case.
 417                     #
 418                     # $(OBJCOPY) --add-gnu-debuglink=... corrupts SUNW_* sections.
 419                     # Use $(ADD_GNU_DEBUGLINK) until a fixed $(OBJCOPY) is available.
 420                     $$($1_OBJECT_DIR)/$$(LIBRARY_PREFIX)$$($1_LIBRARY).debuginfo : $$($1_TARGET) \
 421                                         $(FIX_EMPTY_SEC_HDR_FLAGS) $(ADD_GNU_DEBUGLINK)
 422                         $(RM) $$@
 423                         $(FIX_EMPTY_SEC_HDR_FLAGS) $(LOG_INFO) $$<
 424                         $(OBJCOPY) --only-keep-debug $$< $$@
 425                         $(CD) $$(@D) && $(ADD_GNU_DEBUGLINK) $(LOG_INFO) $$(@F) $$<
 426                 else # not solaris
 427                     $$($1_OBJECT_DIR)/$$(LIBRARY_PREFIX)$$($1_LIBRARY).debuginfo : $$($1_TARGET)
 428                         $(RM) $$@
 429                         $(OBJCOPY) --only-keep-debug $$< $$@
 430                         $(CD) $$(@D) && $(OBJCOPY) --add-gnu-debuglink=$$(@F) $$<
 431                 endif # Touch to not retrigger rule on rebuild
 432                         $(TOUCH) $$@
 433 
 434                 ifeq ($(ZIP_DEBUGINFO_FILES), true)
 435                     $1 += $$($1_OUTPUT_DIR)/$$(LIBRARY_PREFIX)$$($1_LIBRARY).diz
 436 
 437                     ifeq ($(OPENJDK_TARGET_OS), windows)
 438                         $$($1_OBJECT_DIR)/$$(LIBRARY_PREFIX)$$($1_LIBRARY).diz : $$($1_TARGET)
 439                                 $(CD) $$($1_OBJECT_DIR) \
 440                                 && $(ZIP) -q $$@ $$($1_LIBRARY).map $$($1_LIBRARY).pdb
 441                     else
 442                         $$($1_OBJECT_DIR)/$$(LIBRARY_PREFIX)$$($1_LIBRARY).diz : $$($1_TARGET) \
 443                                         $$($1_OBJECT_DIR)/$$(LIBRARY_PREFIX)$$($1_LIBRARY).debuginfo
 444                                 $(CD) $$($1_OBJECT_DIR) \
 445                                 && $(ZIP) -q $$@ $$(LIBRARY_PREFIX)$$($1_LIBRARY).debuginfo 
 446                     endif
 447                 else
 448                     ifeq ($(OPENJDK_TARGET_OS), windows)
 449                         $1 += $$($1_OUTPUT_DIR)/$$($1_LIBRARY).map \
 450                               $$($1_OUTPUT_DIR)/$$($1_LIBRARY).pdb
 451                     else
 452                         $1 += $$($1_OUTPUT_DIR)/$$(LIBRARY_PREFIX)$$($1_LIBRARY).debuginfo
 453                     endif
 454                 endif
 455             endif
 456         endif
 457 
 458         $$($1_TARGET) : $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_REAL_MAPFILE)
 459                 $$(call LINKING_MSG,$$($1_BASENAME))
 460                 $$($1_LD) $$($1_LDFLAGS) $$($1_EXTRA_LDFLAGS) $(LD_OUT_OPTION)$$@ \
 461                 $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_LDFLAGS_SUFFIX) \
 462                 $$($1_EXTRA_LDFLAGS_SUFFIX)
 463 
 464     endif
 465 
 466     ifneq (,$$($1_STATIC_LIBRARY))
 467         # Generating a static library, ie object file archive.
 468         $$($1_TARGET) : $$($1_EXPECTED_OBJS) $$($1_RES)
 469                 $$(call ARCHIVING_MSG,$$($1_LIBRARY))
 470                 $(AR) $$($1_AR_FLAGS) $(AR_OUT_OPTION)$$($1_TARGET) $$($1_EXPECTED_OBJS) \
 471                         $$($1_RES) $$($1_LDFLAGS_SUFFIX) $$($1_EXTRA_LDFLAGS_SUFFIX)
 472     endif
 473 
 474     ifneq (,$$($1_PROGRAM))
 475         # A executable binary has been specified, setup the target for it.
 476         ifneq (,$$($1_DEBUG_SYMBOLS))
 477             ifeq ($(ENABLE_DEBUG_SYMBOLS), true)
 478                 ifeq ($(OPENJDK_TARGET_OS), windows)
 479                     $1_EXTRA_LDFLAGS+="-pdb:$$($1_OBJECT_DIR)/$$($1_PROGRAM).pdb" \
 480                                       "-map:$$($1_OBJECT_DIR)/$$($1_PROGRAM).map"
 481                 endif
 482 
 483                 ifneq ($$($1_OUTPUT_DIR),$$($1_OBJECT_DIR))
 484                     $$($1_OUTPUT_DIR)/% : $$($1_OBJECT_DIR)/%
 485                         $(CP) $$< $$@
 486                 endif
 487 
 488                 ifeq ($(OPENJDK_TARGET_OS), solaris)
 489                     # gobjcopy crashes on "empty" section headers with the SHF_ALLOC flag set.
 490                     # Use $(FIX_EMPTY_SEC_HDR_FLAGS) to clear the SHF_ALLOC flag (if set) from
 491                     # empty section headers until a fixed $(OBJCOPY) is available.
 492                     # An empty section header has sh_addr == 0 and sh_size == 0.
 493                     # This problem has only been seen on Solaris X64, but we call this tool
 494                     # on all Solaris builds just in case.
 495                     #
 496                     # $(OBJCOPY) --add-gnu-debuglink=... corrupts SUNW_* sections.
 497                     # Use $(ADD_GNU_DEBUGLINK) until a fixed $(OBJCOPY) is available.
 498                     $$($1_OBJECT_DIR)/$$($1_PROGRAM).debuginfo : $$($1_TARGET) \
 499                                         $(FIX_EMPTY_SEC_HDR_FLAGS) $(ADD_GNU_DEBUGLINK)
 500                         $(RM) $$@
 501                         $(FIX_EMPTY_SEC_HDR_FLAGS) $(LOG_INFO) $$<
 502                         $(OBJCOPY) --only-keep-debug $$< $$@
 503                         $(CD) $$(@D) && $(ADD_GNU_DEBUGLINK) $(LOG_INFO) $$(@F) $$<
 504                 else # not solaris
 505                     $$($1_OBJECT_DIR)/$$($1_PROGRAM).debuginfo : $$($1_TARGET)
 506                         $(RM) $$@
 507                         $(OBJCOPY) --only-keep-debug $$< $$@
 508                         $(CD) $$(@D) && $(OBJCOPY) --add-gnu-debuglink=$$(@F) $$<
 509                 endif
 510                         $(TOUCH) $$@
 511 
 512                 ifeq ($(ZIP_DEBUGINFO_FILES), true)
 513                     $1 += $$($1_OUTPUT_DIR)/$$($1_PROGRAM).diz
 514 
 515                     ifeq ($(OPENJDK_TARGET_OS), windows)
 516                         $$($1_OBJECT_DIR)/$$($1_PROGRAM).diz : $$($1_TARGET)
 517                                 $(CD) $$($1_OBJECT_DIR) \
 518                                 && $(ZIP) -q $$@ $$($1_PROGRAM).map $$($1_PROGRAM).pdb
 519                     else
 520                         $$($1_OBJECT_DIR)/$$(PROGRAM_PREFIX)$$($1_PROGRAM).diz : $$($1_TARGET) \
 521                                         $$($1_OBJECT_DIR)/$$($1_PROGRAM).debuginfo
 522                                 $(CD) $$($1_OBJECT_DIR) \
 523                                 && $(ZIP) -q $$@ $$($1_PROGRAM).debuginfo 
 524                     endif
 525                 else
 526                     ifeq ($(OPENJDK_TARGET_OS), windows)
 527                         $1 += $$($1_OUTPUT_DIR)/$$($1_PROGRAM).map \
 528                               $$($1_OUTPUT_DIR)/$$($1_PROGRAM).pdb
 529                     else
 530                         $1 += $$($1_OUTPUT_DIR)/$$($1_PROGRAM).debuginfo
 531                     endif
 532                 endif
 533             endif
 534         endif
 535 
 536         $1_EXTRA_LDFLAGS_SUFFIX += $(GLOBAL_LDFLAGS_SUFFIX)
 537 
 538         $$($1_TARGET) : $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_GEN_MANIFEST)
 539                 $$(call LINKING_EXE_MSG,$$($1_BASENAME))
 540                 $$($1_LDEXE) $$($1_LDFLAGS) $$($1_EXTRA_LDFLAGS) $(EXE_OUT_OPTION)$$($1_TARGET) \
 541                         $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_LDFLAGS_SUFFIX) \
 542                         $$($1_EXTRA_LDFLAGS_SUFFIX)
 543         ifneq (,$$($1_GEN_MANIFEST))
 544                 $(MT) -nologo -manifest $$($1_GEN_MANIFEST) -outputresource:$$@;#1
 545         endif
 546 
 547     endif
 548 endef