NativeCompilation.gmk 24.5 KB
Newer Older
1
#
2
# Copyright (c) 2011, 2018, Oracle and/or its affiliates. All rights reserved.
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
# 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!

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

34
ifneq ($(TOOLCHAIN_TYPE), microsoft)
35 36 37 38
  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"
39
else
40 41 42 43
  COMPILING_MSG=
  LINKING_MSG=
  LINKING_EXE_MSG=
  ARCHIVING_MSG=
44 45 46
endif

define add_native_source
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
  # 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)

89
      ifeq ($(TOOLCHAIN_TYPE), microsoft)
90 91 92 93 94 95
        $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
96
        ifneq ($(TOOLCHAIN_TYPE), microsoft)
97
	  $$(call COMPILING_MSG,$2,$$($1_TARGET))
98
          # The Solaris studio compiler doesn't output the full path to the object file in the
99
          # generated deps files. Fixing it with sed. If compiling assembly, don't try this.
100
          ifeq ($(TOOLCHAIN_TYPE)$$(filter %.s,$2), solstudio)
101 102
	    $$($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)
103
          else
104 105
	    $$($1_$2_COMP) $$($1_$2_FLAGS) $$($1_$2_DEP_FLAG) $$($1_$2_DEP) $(CC_OUT_OPTION)$$($1_$2_OBJ) $2
          endif
106 107
        endif
        # The Visual Studio compiler lacks a feature for generating make dependencies, but by
108
        # setting -showIncludes, all included files are printed. These are filtered out and
109
        # parsed into make dependences.
110
        ifeq ($(TOOLCHAIN_TYPE), microsoft)
111 112 113 114 115 116 117 118 119 120 121 122 123
	  ($$($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)
124
        endif
125
  endif
126 127 128
endef

define SetupNativeCompilation
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
  # 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))
157

158 159 160
  ifneq (,$$($1_BIN))
    $$(error BIN has been replaced with OBJECT_DIR)
  endif
161

162 163 164
  ifneq (,$$($1_LIB))
    $$(error LIB has been replaced with LIBRARY)
  endif
165

166 167 168
  ifneq (,$$($1_EXE))
    $$(error EXE has been replaced with PROGRAM)
  endif
169

170 171 172
  ifneq (,$$($1_LIBRARY))
    ifeq (,$$($1_OUTPUT_DIR))
      $$(error LIBRARY requires OUTPUT_DIR)
173 174
    endif

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

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

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

187 188
    $1_BASENAME:=$(LIBRARY_PREFIX)$$($1_LIBRARY)$(SHARED_LIBRARY_SUFFIX)
    $1_TARGET:=$$($1_OUTPUT_DIR)/$$($1_BASENAME)
189

190
  endif
191

192 193 194
  ifneq (,$$($1_STATIC_LIBRARY))
    ifeq (,$$($1_OUTPUT_DIR))
      $$(error STATIC_LIBRARY requires OUTPUT_DIR)
195 196
    endif

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

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

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

209 210 211
    $1_BASENAME:=$(LIBRARY_PREFIX)$$($1_STATIC_LIBRARY)$(STATIC_LIBRARY_SUFFIX)
    $1_TARGET:=$$($1_OUTPUT_DIR)/$$($1_BASENAME)
  endif
212

213 214 215
  ifneq (,$$($1_PROGRAM))
    ifeq (,$$($1_OUTPUT_DIR))
      $$(error PROGRAM requires OUTPUT_DIR)
O
ohair 已提交
216
    endif
217

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

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

226 227
    $1_BASENAME:=$$($1_PROGRAM)$(EXE_SUFFIX)
    $1_TARGET:=$$($1_OUTPUT_DIR)/$$($1_BASENAME)
228

229
  endif
230

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

235 236 237 238 239 240
  ifeq (,$$($1_LANG))
    $$(error You have to specify LANG for native compilation $1)
  endif
  ifeq (C,$$($1_LANG))
    ifeq ($$($1_LDEXE),)
      $1_LDEXE:=$(LDEXE)
241
    endif
242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299
    $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

300 301 302 303
  # Pickup extra OPENJDK_TARGET_OS_API, OPENJDK_TARGET_OS, and/or OPENJDK_TARGET_OS plus
  # OPENJDK_TARGET_CPU pair dependent variables for CFLAGS.
  $1_EXTRA_CFLAGS:=$$($1_CFLAGS_$(OPENJDK_TARGET_OS_API)) $$($1_CFLAGS_$(OPENJDK_TARGET_OS)) \
      $$($1_CFLAGS_$(OPENJDK_TARGET_OS)_$(OPENJDK_TARGET_CPU))
304 305 306 307 308
  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)
309
    $1_EXTRA_CFLAGS+=$$($1_CFLAGS_$(OPENJDK_TARGET_OS)_$(OPENJDK_TARGET_CPU)_debug)
310 311 312 313
  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)
314
    $1_EXTRA_CFLAGS+=$$($1_CFLAGS_$(OPENJDK_TARGET_OS)_$(OPENJDK_TARGET_CPU)_release)
315 316 317 318 319 320 321 322 323 324 325 326 327 328 329
  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

330 331 332 333 334 335 336
  ifeq ($$($1_CXXFLAGS),)
    $1_CXXFLAGS:=$$($1_CFLAGS)
  endif
  ifeq ($$(strip $$($1_EXTRA_CXXFLAGS)),)
    $1_EXTRA_CXXFLAGS:=$$($1_EXTRA_CFLAGS)
  endif

337 338 339 340 341 342 343 344 345 346 347 348
  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)
349
        endif
350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374
      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

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

379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395
  # 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)
396 397
		$(SED) 's%IMVERSION%$$(IMVERSIONVALUE)%g;s%PROGRAM%$$($1_PROGRAM)%g' $$< > $$@
    endif
398
  endif
399

400 401
  # mapfile doesnt seem to be implemented on macosx (yet??)
  ifneq ($(OPENJDK_TARGET_OS),macosx)
402
    ifneq ($(OPENJDK_TARGET_OS),windows)
403 404 405
      $1_REAL_MAPFILE:=$$($1_MAPFILE)
      ifneq (,$$($1_REORDER))
        $1_REAL_MAPFILE:=$$($1_OBJECT_DIR)/mapfile
406

407
        $$($1_REAL_MAPFILE) : $$($1_MAPFILE) $$($1_REORDER)
408 409
		$$(MKDIR) -p $$(@D)
		$$(CP) $$($1_MAPFILE) $$@.tmp
410
		$$(SED) -e 's=OUTPUTDIR=$$($1_OBJECT_DIR)=' $$($1_REORDER) >> $$@.tmp
411
		$$(MV) $$@.tmp $$@
412 413 414 415 416 417 418 419 420 421 422 423
      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

424 425
  $1_EXTRA_LDFLAGS += $(SYSROOT_LDFLAGS)

426 427 428 429 430 431
  $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"
432 433
    endif

434
    $1_EXTRA_LDFLAGS_SUFFIX += $(GLOBAL_LDFLAGS_SUFFIX)
435

436 437
    ifneq (,$$($1_DEBUG_SYMBOLS))
      ifeq ($(ENABLE_DEBUG_SYMBOLS), true)
438
        ifeq ($(OPENJDK_TARGET_OS), windows)
439 440
          $1_EXTRA_LDFLAGS+="-pdb:$$($1_OBJECT_DIR)/$$($1_LIBRARY).pdb" \
              "-map:$$($1_OBJECT_DIR)/$$($1_LIBRARY).map"
441 442
        endif

443 444 445
        ifneq ($$($1_OUTPUT_DIR),$$($1_OBJECT_DIR))
          $$($1_OUTPUT_DIR)/% : $$($1_OBJECT_DIR)/%
		$(CP) $$< $$@
446 447
        endif

448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471
        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
472
		$(TOUCH) $$@
473 474
          endif # !windows
        endif # !macosx
475 476

        ifeq ($(ZIP_DEBUGINFO_FILES), true)
477
ifneq ($(OPENJDK_TARGET_OS), macosx) # no MacOS X support yet
478 479 480 481 482 483 484 485 486 487 488 489
          $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
490
endif # no MacOS X support yet
491 492 493 494
        else
          ifeq ($(OPENJDK_TARGET_OS), windows)
            $1 += $$($1_OUTPUT_DIR)/$$($1_LIBRARY).map \
                $$($1_OUTPUT_DIR)/$$($1_LIBRARY).pdb
495
          else ifneq ($(OPENJDK_TARGET_OS), macosx) # MacOS X does not use .debuginfo files
496 497 498 499
            $1 += $$($1_OUTPUT_DIR)/$$(LIBRARY_PREFIX)$$($1_LIBRARY).debuginfo
          endif
        endif
      endif
500 501
    endif

502 503 504 505 506 507 508 509 510 511 512 513
    $$($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))
K
Merge  
kvn 已提交
514
	$(AR) $$($1_ARFLAGS) $(AR_OUT_OPTION)$$($1_TARGET) $$($1_EXPECTED_OBJS) \
515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530
	    $$($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
531

532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554
        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) $$<
555
            endif
556 557 558
		$(TOUCH) $$@
          endif # !windows
        endif # !macosx
559

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

564 565 566 567 568 569 570 571 572 573
          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
574
endif # no MacOS X support yet
575 576 577 578
        else
          ifeq ($(OPENJDK_TARGET_OS), windows)
            $1 += $$($1_OUTPUT_DIR)/$$($1_PROGRAM).map \
                $$($1_OUTPUT_DIR)/$$($1_PROGRAM).pdb
579
          else ifneq ($(OPENJDK_TARGET_OS), macosx) # MacOS X does not use .debuginfo files
580 581
            $1 += $$($1_OUTPUT_DIR)/$$($1_PROGRAM).debuginfo
          endif
582
        endif
583 584
      endif
    endif
585

586
    $1_EXTRA_LDFLAGS_SUFFIX += $(GLOBAL_LDFLAGS_SUFFIX)
587

588 589 590 591 592
    $$($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)
593
        ifneq (,$$($1_GEN_MANIFEST))
594
	  $(MT) -nologo -manifest $$($1_GEN_MANIFEST) -outputresource:$$@;#1
595
        endif
596 597 598
        # This only works if the openjdk_codesign identity is present on the system. Let
        # silently fail otherwise.
        ifneq (,$(CODESIGN))
599 600 601
          ifneq (,$$($1_CODESIGN))
	    $(CODESIGN) -s openjdk_codesign $$@
          endif
602
        endif
603
  endif
604
endef