NativeCompilation.gmk revision 1480:cfd05cc6c27b
1226633Sdim# 2218887Sdim# Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. 3218887Sdim# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4218887Sdim# 5218887Sdim# This code is free software; you can redistribute it and/or modify it 6218887Sdim# under the terms of the GNU General Public License version 2 only, as 7218887Sdim# published by the Free Software Foundation. Oracle designates this 8218887Sdim# particular file as subject to the "Classpath" exception as provided 9218887Sdim# by Oracle in the LICENSE file that accompanied this code. 10218887Sdim# 11218887Sdim# This code is distributed in the hope that it will be useful, but WITHOUT 12218887Sdim# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13218887Sdim# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14218887Sdim# version 2 for more details (a copy is included in the LICENSE file that 15218887Sdim# accompanied this code). 16234353Sdim# 17249423Sdim# You should have received a copy of the GNU General Public License version 18249423Sdim# 2 along with this work; if not, write to the Free Software Foundation, 19221345Sdim# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20218887Sdim# 21219077Sdim# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22226633Sdim# or visit www.oracle.com if you need additional information or have any 23249423Sdim# questions. 24234353Sdim# 25218887Sdim 26249423Sdim# When you read this source. Remember that $(sort ...) has the side effect 27218887Sdim# of removing duplicates. It is actually this side effect that is 28218887Sdim# desired whenever sort is used below! 29218887Sdim 30218887Sdimifndef _NATIVE_COMPILATION_GMK 31218887Sdim_NATIVE_COMPILATION_GMK := 1 32221345Sdim 33219077Sdimifeq (,$(_MAKEBASE_GMK)) 34219077Sdim $(error You must include MakeBase.gmk prior to including NativeCompilation.gmk) 35219077Sdimendif 36219077Sdim 37219077Sdim################################################################################ 38234353Sdim# Define a native toolchain configuration that can be used by 39234353Sdim# SetupNativeCompilation calls 40234353Sdim# 41234353Sdim# Parameter 1 is the name of the toolchain definition 42234353Sdim# 43234353Sdim# Remaining parameters are named arguments: 44224145Sdim# EXTENDS - Optional parent definition to get defaults from 45224145Sdim# CC - The C compiler 46218887Sdim# CXX - The C++ compiler 47234353Sdim# LD - The Linker 48234353Sdim# AR - Static linker 49234353Sdim# AS - Assembler 50234353Sdim# MT - Windows MT tool 51234353Sdim# RC - Windows RC tool 52234353Sdim# SYSROOT_CFLAGS - Compiler flags for using the specific sysroot 53234353Sdim# SYSROOT_LDFLAGS - Linker flags for using the specific sysroot 54234353SdimDefineNativeToolchain = $(NamedParamsMacroTemplate) 55234353Sdimdefine DefineNativeToolchainBody 56234353Sdim # If extending another definition, get default values from that, 57234353Sdim # otherwise, nothing more needs to be done as variable assignments 58218887Sdim # already happened in NamedParamsMacroTemplate. 59218887Sdim ifneq ($$($1_EXTENDS), ) 60219077Sdim $$(call SetIfEmpty, $1_CC, $$($$($1_EXTENDS)_CC)) 61219077Sdim $$(call SetIfEmpty, $1_CXX, $$($$($1_EXTENDS)_CXX)) 62234353Sdim $$(call SetIfEmpty, $1_LD, $$($$($1_EXTENDS)_LD)) 63219077Sdim $$(call SetIfEmpty, $1_AR, $$($$($1_EXTENDS)_AR)) 64234353Sdim $$(call SetIfEmpty, $1_AS, $$($$($1_EXTENDS)_AS)) 65218887Sdim $$(call SetIfEmpty, $1_MT, $$($$($1_EXTENDS)_MT)) 66234353Sdim $$(call SetIfEmpty, $1_RC, $$($$($1_EXTENDS)_RC)) 67234353Sdim $$(call SetIfEmpty, $1_SYSROOT_CFLAGS, $$($$($1_EXTENDS)_SYSROOT_CFLAGS)) 68249423Sdim $$(call SetIfEmpty, $1_SYSROOT_LDFLAGS, $$($$($1_EXTENDS)_SYSROOT_LDFLAGS)) 69226633Sdim endif 70234353Sdimendef 71239462Sdim 72218887Sdim# Create a default toolchain with the main compiler and linker 73219077Sdim$(eval $(call DefineNativeToolchain, TOOLCHAIN_DEFAULT, \ 74219077Sdim CC := $(CC), \ 75218887Sdim CXX := $(CXX), \ 76219077Sdim LD := $(LD), \ 77221345Sdim AR := $(AR), \ 78219077Sdim AS := $(AS), \ 79219077Sdim MT := $(MT), \ 80221345Sdim RC := $(RC), \ 81234353Sdim SYSROOT_CFLAGS := $(SYSROOT_CFLAGS), \ 82226633Sdim SYSROOT_LDFLAGS := $(SYSROOT_LDFLAGS), \ 83226633Sdim)) 84226633Sdim 85221345Sdim# Create a toolchain where linking is done with the C++ linker 86221345Sdim$(eval $(call DefineNativeToolchain, TOOLCHAIN_LINK_CXX, \ 87218887Sdim EXTENDS := TOOLCHAIN_DEFAULT, \ 88219077Sdim LD := $(LDCXX), \ 89218887Sdim)) 90219077Sdim 91219077Sdim# Create a toolchain with the BUILD compiler, used for build tools that 92226633Sdim# are to be run during the build. 93226633Sdim# The BUILD_SYSROOT_*FLAGS variables are empty for now. 94219077Sdim$(eval $(call DefineNativeToolchain, TOOLCHAIN_BUILD, \ 95218887Sdim EXTENDS := TOOLCHAIN_DEFAULT, \ 96219077Sdim CC := $(BUILD_CC), \ 97219077Sdim LD := $(BUILD_LD), \ 98219077Sdim SYSROOT_CFLAGS := $(BUILD_SYSROOT_CFLAGS), \ 99226633Sdim SYSROOT_LDFLAGS := $(BUILD_SYSROOT_LDFLAGS), \ 100226633Sdim)) 101226633Sdim 102226633Sdim################################################################################ 103226633Sdim 104218887Sdim# Extensions of files handled by this macro. 105221345SdimNATIVE_SOURCE_EXTENSIONS := %.s %.c %.cpp %.m %.mm 106221345Sdim 107221345Sdim# Replaces native source extensions with the object file extension in a string. 108221345Sdim# Param 1: the string containing source file names with extensions 109221345Sdim# The surrounding strip is needed to keep additional whitespace out 110221345Sdimdefine replace_with_obj_extension 111223017Sdim$(strip \ 112226633Sdim $(foreach extension, $(NATIVE_SOURCE_EXTENSIONS), \ 113226633Sdim $(patsubst $(extension),%$(OBJ_SUFFIX),$(filter $(extension),$1))) \ 114226633Sdim) 115226633Sdimendef 116221345Sdim 117251662Sdimifeq ($(OPENJDK_BUILD_OS_ENV), windows.cygwin) 118251662Sdim UNIX_PATH_PREFIX := /cygdrive 119218887Sdimelse ifeq ($(OPENJDK_BUILD_OS_ENV), windows.msys) 120234353Sdim UNIX_PATH_PREFIX := 121219077Sdimendif 122234353Sdim 123218887Sdim# This pattern is used to transform the output of the microsoft CL compiler 124234353Sdim# into a make syntax dependency file (.d) 125226633SdimWINDOWS_SHOWINCLUDE_SED_PATTERN := \ 126226633Sdim -e '/^Note: including file:/!d' \ 127219077Sdim -e 's|Note: including file: *||' \ 128234353Sdim -e 's|\\|/|g' \ 129226633Sdim -e 's|^\([a-zA-Z]\):|$(UNIX_PATH_PREFIX)/\1|g' \ 130226633Sdim -e '\|$(TOPDIR)|I !d' \ 131224145Sdim -e 's|$$$$| \\|g' \ 132226633Sdim # 133234353Sdim 134226633Sdim# This pattern is used to transform a dependency file (.d) to a list 135226633Sdim# of make targets for dependent files (.d.targets) 136224145SdimDEPENDENCY_TARGET_SED_PATTERN := \ 137218887Sdim -e 's/\#.*//' \ 138221345Sdim -e 's/^[^:]*: *//' \ 139234353Sdim -e 's/ *\\$$$$//' \ 140221345Sdim -e 's/^[ ]*//' \ 141221345Sdim -e '/^$$$$/ d' \ 142221345Sdim -e 's/$$$$/ :/' \ 143234353Sdim # 144263508Sdim 145263508Sdimdefine add_native_source 146263508Sdim # param 1 = BUILD_MYPACKAGE 147218887Sdim # parma 2 = the source file name (..../alfa.c or .../beta.cpp) 148226633Sdim # param 3 = the bin dir that stores all .o (.obj) and .d files. 149219077Sdim # param 4 = the c flags to the compiler 150218887Sdim # param 5 = the c compiler 151218887Sdim # param 6 = the c++ flags to the compiler 152234353Sdim # param 7 = the c++ compiler 153234353Sdim # param 8 = the flags to the assembler 154226633Sdim 155226633Sdim ifneq (,$$(filter %.c,$2)) 156234353Sdim # Compile as a C file 157234353Sdim $1_$2_FLAGS=$(CFLAGS_CCACHE) $4 $$($1_$(notdir $2)_CFLAGS) -DTHIS_FILE='"$$(<F)"' -c 158226633Sdim $1_$2_COMP=$5 159226633Sdim $1_$2_DEP_FLAG:=$(C_FLAG_DEPS) 160226633Sdim else ifneq (,$$(filter %.m,$2)) 161234353Sdim # Compile as an Objective-C file 162234353Sdim $1_$2_FLAGS=-x objective-c $(CFLAGS_CCACHE) $4 $$($1_$(notdir $2)_CFLAGS) -DTHIS_FILE='"$$(<F)"' -c 163226633Sdim $1_$2_COMP=$5 164226633Sdim $1_$2_DEP_FLAG:=$(C_FLAG_DEPS) 165226633Sdim else ifneq (,$$(filter %.s,$2)) 166226633Sdim # Compile as assembler file 167226633Sdim $1_$2_FLAGS=$8 -DTHIS_FILE='"$$(<F)"' 168226633Sdim $1_$2_COMP=$(AS) 169226633Sdim $1_$2_DEP_FLAG:= 170234353Sdim else ifneq (,$$(filter %.cpp,$2)$$(filter %.mm,$2)) 171234353Sdim # Compile as a C++ or Objective-C++ file 172226633Sdim $1_$2_FLAGS=$(CFLAGS_CCACHE) $6 $$($1_$(notdir $2)_CXXFLAGS) -DTHIS_FILE='"$$(<F)"' -c 173226633Sdim $1_$2_COMP=$7 174226633Sdim $1_$2_DEP_FLAG:=$(CXX_FLAG_DEPS) 175226633Sdim else 176224145Sdim $$(error Internal error in NativeCompilation.gmk: no compiler for file $2) 177224145Sdim endif 178224145Sdim # Generate the .o (.obj) file name and place it in the bin dir. 179224145Sdim $1_$2_OBJ := $3/$$(call replace_with_obj_extension, $$(notdir $2)) 180234353Sdim # Only continue if this object file hasn't been processed already. This lets the first found 181234353Sdim # source file override any other with the same name. 182226633Sdim ifeq (,$$(findstring $$($1_$2_OBJ),$$($1_ALL_OBJS))) 183226633Sdim $1_ALL_OBJS+=$$($1_$2_OBJ) 184226633Sdim ifeq (,$$(filter %.s,$2)) 185226633Sdim # And this is the dependency file for this obj file. 186234353Sdim $1_$2_DEP:=$$(patsubst %$(OBJ_SUFFIX),%.d,$$($1_$2_OBJ)) 187226633Sdim # The dependency target file lists all dependencies as empty targets 188226633Sdim # to avoid make error "No rule to make target" for removed files 189226633Sdim $1_$2_DEP_TARGETS:=$$(patsubst %$(OBJ_SUFFIX),%.d.targets,$$($1_$2_OBJ)) 190234353Sdim 191234353Sdim # Include previously generated dependency information. (if it exists) 192226633Sdim -include $$($1_$2_DEP) 193226633Sdim -include $$($1_$2_DEP_TARGETS) 194218887Sdim 195218887Sdim ifeq ($(TOOLCHAIN_TYPE), microsoft) 196218887Sdim $1_$2_DEBUG_OUT_FLAGS:=-Fd$$(patsubst %$(OBJ_SUFFIX),%.pdb,$$($1_$2_OBJ)) \ 197218887Sdim -Fm$$(patsubst %$(OBJ_SUFFIX),%.map,$$($1_$2_OBJ)) 198243830Sdim endif 199218887Sdim endif 200218887Sdim 201218887Sdim $$($1_$2_OBJ) : $2 $$($1_COMPILE_VARDEPS_FILE) | $$($1_BUILD_INFO) 202218887Sdim $(ECHO) $(LOG_INFO) "Compiling $$(notdir $2) (for $$(notdir $$($1_TARGET)))" 203218887Sdim ifneq ($(TOOLCHAIN_TYPE), microsoft) 204234353Sdim # The Solaris studio compiler doesn't output the full path to the object file in the 205234353Sdim # generated deps files. Fixing it with sed. If compiling assembly, don't try this. 206218887Sdim ifeq ($(TOOLCHAIN_TYPE)$$(filter %.s,$2), solstudio) 207249423Sdim $$($1_$2_COMP) $$($1_$2_FLAGS) $$($1_$2_DEP_FLAG) $$($1_$2_DEP).tmp $(CC_OUT_OPTION)$$($1_$2_OBJ) $2 208218887Sdim $(SED) 's|^$$(@F):|$$@:|' $$($1_$2_DEP).tmp > $$($1_$2_DEP) 209234353Sdim else 210218887Sdim $$($1_$2_COMP) $$($1_$2_FLAGS) $$($1_$2_DEP_FLAG) $$($1_$2_DEP) $(CC_OUT_OPTION)$$($1_$2_OBJ) $2 211218887Sdim endif 212218887Sdim endif 213218887Sdim # The Visual Studio compiler lacks a feature for generating make dependencies, but by 214218887Sdim # setting -showIncludes, all included files are printed. These are filtered out and 215218887Sdim # parsed into make dependences. 216234353Sdim ifeq ($(TOOLCHAIN_TYPE), microsoft) 217234353Sdim ($$($1_$2_COMP) $$($1_$2_FLAGS) -showIncludes $$($1_$2_DEBUG_OUT_FLAGS) \ 218219077Sdim $(CC_OUT_OPTION)$$($1_$2_OBJ) $2 ; echo $$$$? > $$($1_$2_DEP).exitvalue) \ 219218887Sdim | $(TEE) $$($1_$2_DEP).raw | $(GREP) -v -e "^Note: including file:" \ 220218887Sdim -e "^$(notdir $2)$$$$" || test "$$$$?" = "1" ; \ 221218887Sdim exit `cat $$($1_$2_DEP).exitvalue` 222218887Sdim $(RM) $$($1_$2_DEP).exitvalue 223234353Sdim ($(ECHO) $$@: \\ \ 224218887Sdim && $(SED) $(WINDOWS_SHOWINCLUDE_SED_PATTERN) $$($1_$2_DEP).raw) | $(SORT) -u > $$($1_$2_DEP) 225218887Sdim endif 226218887Sdim # Create a dependency target file from the dependency file. 227234353Sdim # Solution suggested by http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/ 228234353Sdim ifneq ($$($1_$2_DEP),) 229234353Sdim $(SED) $(DEPENDENCY_TARGET_SED_PATTERN) $$($1_$2_DEP) > $$($1_$2_DEP_TARGETS) 230218887Sdim endif 231218887Sdim endif 232218887Sdimendef 233218887Sdim 234218887Sdim# Setup make rules for creating a native binary (a shared library or an 235263508Sdim# executable). 236219077Sdim# 237218887Sdim# Parameter 1 is the name of the rule. This name is used as variable prefix, 238234353Sdim# and the targets generated are listed in a variable by that name. 239224145Sdim# 240224145Sdim# Remaining parameters are named arguments. These include: 241224145Sdim# TOOLCHAIN Name of toolchain setup to use. Defaults to TOOLCHAIN_DEFAULT. 242224145Sdim# SRC one or more directory roots to scan for C/C++ files. 243218887Sdim# CFLAGS the compiler flags to be used, used both for C and C++. 244219077Sdim# CXXFLAGS the compiler flags to be used for c++, if set overrides CFLAGS. 245226633Sdim# LDFLAGS the linker flags to be used, used both for C and C++. 246218887Sdim# LDFLAGS_SUFFIX the linker flags to be added last on the commandline 247218887Sdim# typically the libraries linked to. 248243830Sdim# ARFLAGS the archiver flags to be used 249243830Sdim# OBJECT_DIR the directory where we store the object files 250218887Sdim# LIBRARY the resulting library file 251218887Sdim# PROGRAM the resulting exec file 252218887Sdim# INCLUDES only pick source from these directories 253218887Sdim# EXCLUDES do not pick source from these directories 254218887Sdim# INCLUDE_FILES only compile exactly these files! 255218887Sdim# EXCLUDE_FILES with these names 256218887Sdim# EXTRA_FILES List of extra files not in any of the SRC dirs 257218887Sdim# VERSIONINFO_RESOURCE Input file for RC. Setting this implies that RC will be run 258218887Sdim# RC_FLAGS flags for RC. 259234353Sdim# MAPFILE mapfile 260234353Sdim# REORDER reorder file 261218887Sdim# DEBUG_SYMBOLS add debug symbols (if configured on) 262224145Sdim# CC the compiler to use, default is $(CC) 263218887Sdim# LD the linker to use, default is $(LD) 264218887Sdim# OPTIMIZATION sets optimization level to NONE, LOW, HIGH, HIGHEST 265218887Sdim# DISABLED_WARNINGS_<toolchain> Disable the given warnings for the specified toolchain 266218887SdimSetupNativeCompilation = $(NamedParamsMacroTemplate) 267218887Sdimdefine SetupNativeCompilationBody 268218887Sdim 269218887Sdim ifneq (,$$($1_BIN)) 270218887Sdim $$(error BIN has been replaced with OBJECT_DIR) 271218887Sdim endif 272218887Sdim 273218887Sdim ifneq (,$$($1_LIB)) 274218887Sdim $$(error LIB has been replaced with LIBRARY) 275218887Sdim endif 276218887Sdim 277218887Sdim ifneq (,$$($1_EXE)) 278218887Sdim $$(error EXE has been replaced with PROGRAM) 279218887Sdim endif 280218887Sdim 281218887Sdim ifneq (,$$($1_LIBRARY)) 282224145Sdim ifeq (,$$($1_OUTPUT_DIR)) 283224145Sdim $$(error LIBRARY requires OUTPUT_DIR) 284249423Sdim endif 285218887Sdim 286218887Sdim ifneq ($$($1_LIBRARY),$(basename $$($1_LIBRARY))) 287249423Sdim $$(error directory of LIBRARY should be specified using OUTPUT_DIR) 288218887Sdim endif 289234353Sdim 290234353Sdim ifneq (,$(findstring $(SHARED_LIBRARY_SUFFIX),$$($1_LIBRARY))) 291218887Sdim $$(error LIBRARY should be specified without SHARED_LIBRARY_SUFFIX: $(SHARED_LIBRARY_SUFFIX)) 292218887Sdim endif 293218887Sdim 294218887Sdim ifneq (,$(findstring $(LIBRARY_PREFIX),$$($1_LIBRARY))) 295218887Sdim $$(error LIBRARY should be specified without LIBRARY_PREFIX: $(LIBRARY_PREFIX)) 296224145Sdim endif 297224145Sdim 298224145Sdim ifeq ($$($1_SUFFIX), ) 299224145Sdim $1_SUFFIX := $(SHARED_LIBRARY_SUFFIX) 300224145Sdim endif 301224145Sdim 302224145Sdim $1_BASENAME:=$(LIBRARY_PREFIX)$$($1_LIBRARY)$$($1_SUFFIX) 303226633Sdim $1_TARGET:=$$($1_OUTPUT_DIR)/$$($1_BASENAME) 304224145Sdim $1_NOSUFFIX:=$(LIBRARY_PREFIX)$$($1_LIBRARY) 305226633Sdim endif 306218887Sdim 307224145Sdim ifneq (,$$($1_STATIC_LIBRARY)) 308224145Sdim ifeq (,$$($1_OUTPUT_DIR)) 309224145Sdim $$(error STATIC_LIBRARY requires OUTPUT_DIR) 310234353Sdim endif 311224145Sdim 312249423Sdim ifneq ($$($1_STATIC_LIBRARY),$(basename $$($1_STATIC_LIBRARY))) 313224145Sdim $$(error directory of STATIC_LIBRARY should be specified using OUTPUT_DIR) 314224145Sdim endif 315226633Sdim 316218887Sdim ifneq (,$(findstring $(STATIC_LIBRARY_SUFFIX),$$($1_STATIC_LIBRARY))) 317218887Sdim $$(error STATIC_LIBRARY should be specified without STATIC_LIBRARY_SUFFIX: $(STATIC_LIBRARY_SUFFIX)) 318218887Sdim endif 319218887Sdim 320218887Sdim ifneq (,$(findstring $(LIBRARY_PREFIX),$$($1_STATIC_LIBRARY))) 321218887Sdim $$(error STATIC_LIBRARY should be specified without LIBRARY_PREFIX: $(LIBRARY_PREFIX)) 322218887Sdim endif 323243830Sdim 324218887Sdim ifeq ($$($1_SUFFIX), ) 325218887Sdim $1_SUFFIX := $(STATIC_LIBRARY_SUFFIX) 326218887Sdim endif 327218887Sdim 328218887Sdim $1_BASENAME:=$(LIBRARY_PREFIX)$$($1_STATIC_LIBRARY)$$($1_SUFFIX) 329218887Sdim $1_TARGET:=$$($1_OUTPUT_DIR)/$$($1_BASENAME) 330218887Sdim $1_NOSUFFIX:=$(LIBRARY_PREFIX)$$($1_STATIC_LIBRARY) 331218887Sdim endif 332234353Sdim 333234353Sdim ifneq (,$$($1_PROGRAM)) 334218887Sdim ifeq (,$$($1_OUTPUT_DIR)) 335218887Sdim $$(error PROGRAM requires OUTPUT_DIR) 336218887Sdim endif 337224145Sdim 338224145Sdim ifneq ($$($1_PROGRAM),$(basename $$($1_PROGRAM))) 339224145Sdim $$(error directory of PROGRAM should be specified using OUTPUT_DIR) 340218887Sdim endif 341218887Sdim 342218887Sdim ifneq (,$(findstring $(EXE_SUFFIX),$$($1_PROGRAM))) 343218887Sdim $$(error PROGRAM should be specified without EXE_SUFFIX: $(EXE_SUFFIX)) 344218887Sdim endif 345224145Sdim 346234353Sdim ifeq ($$($1_SUFFIX), ) 347218887Sdim $1_SUFFIX := $(EXE_SUFFIX) 348218887Sdim endif 349218887Sdim 350218887Sdim $1_BASENAME:=$$($1_PROGRAM)$$($1_SUFFIX) 351218887Sdim $1_TARGET:=$$($1_OUTPUT_DIR)/$$($1_BASENAME) 352234353Sdim $1_NOSUFFIX:=$$($1_PROGRAM) 353218887Sdim endif 354218887Sdim 355218887Sdim ifeq (,$$($1_TARGET)) 356218887Sdim $$(error Neither PROGRAM, LIBRARY nor STATIC_LIBRARY has been specified for SetupNativeCompilation) 357234353Sdim endif 358234353Sdim 359234353Sdim # Setup the toolchain to be used 360234353Sdim $$(call SetIfEmpty, $1_TOOLCHAIN, TOOLCHAIN_DEFAULT) 361218887Sdim $$(call SetIfEmpty, $1_CC, $$($$($1_TOOLCHAIN)_CC)) 362224145Sdim $$(call SetIfEmpty, $1_CXX, $$($$($1_TOOLCHAIN)_CXX)) 363224145Sdim $$(call SetIfEmpty, $1_LD, $$($$($1_TOOLCHAIN)_LD)) 364234353Sdim $$(call SetIfEmpty, $1_AR, $$($$($1_TOOLCHAIN)_AR)) 365249423Sdim $$(call SetIfEmpty, $1_AS, $$($$($1_TOOLCHAIN)_AS)) 366218887Sdim $$(call SetIfEmpty, $1_MT, $$($$($1_TOOLCHAIN)_MT)) 367218887Sdim $$(call SetIfEmpty, $1_RC, $$($$($1_TOOLCHAIN)_RC)) 368218887Sdim $$(call SetIfEmpty, $1_SYSROOT_CFLAGS, $$($$($1_TOOLCHAIN)_SYSROOT_CFLAGS)) 369218887Sdim $$(call SetIfEmpty, $1_SYSROOT_LDFLAGS, $$($$($1_TOOLCHAIN)_SYSROOT_LDFLAGS)) 370249423Sdim 371249423Sdim ifneq ($$($1_MANIFEST), ) 372249423Sdim ifeq ($$($1_MANIFEST_VERSION), ) 373218887Sdim $$(error If MANIFEST is provided, then MANIFEST_VERSION is required in $1) 374221345Sdim endif 375218887Sdim endif 376249423Sdim 377224145Sdim # Make sure the dirs exist. 378224145Sdim $$(call MakeDir,$$($1_OBJECT_DIR) $$($1_OUTPUT_DIR)) 379218887Sdim $$(foreach d,$$($1_SRC), $$(if $$(wildcard $$d),, \ 380218887Sdim $$(error SRC specified to SetupNativeCompilation $1 contains missing directory $$d))) 381224145Sdim 382218887Sdim # Find all files in the source trees. Sort to remove duplicates. 383218887Sdim $1_ALL_SRCS := $$(sort $$(call CacheFind,$$($1_SRC))) 384218887Sdim # Extract the C/C++ files. 385218887Sdim $1_EXCLUDE_FILES:=$$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$($1_EXCLUDE_FILES))) 386218887Sdim $1_INCLUDE_FILES:=$$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$($1_INCLUDE_FILES))) 387218887Sdim ifneq ($$($1_EXCLUDE_FILES),) 388218887Sdim $1_EXCLUDE_FILES:=$$(addprefix %,$$($1_EXCLUDE_FILES)) 389218887Sdim endif 390234353Sdim $1_SRCS := $$(filter-out $$($1_EXCLUDE_FILES),$$(filter $$(NATIVE_SOURCE_EXTENSIONS),$$($1_ALL_SRCS))) 391218887Sdim ifneq (,$$(strip $$($1_INCLUDE_FILES))) 392218887Sdim $1_SRCS := $$(filter $$($1_INCLUDE_FILES),$$($1_SRCS)) 393218887Sdim endif 394218887Sdim ifeq (,$$($1_SRCS)) 395218887Sdim $$(error No sources found for $1 when looking inside the dirs $$($1_SRC)) 396249423Sdim endif 397224145Sdim # There can be only a single bin dir root, no need to foreach over the roots. 398224145Sdim $1_BINS := $$(wildcard $$($1_OBJECT_DIR)/*$(OBJ_SUFFIX)) 399218887Sdim # Now we have a list of all c/c++ files to compile: $$($1_SRCS) 400218887Sdim # and we have a list of all existing object files: $$($1_BINS) 401224145Sdim 402218887Sdim # Prepend the source/bin path to the filter expressions. Then do the filtering. 403218887Sdim ifneq ($$($1_INCLUDES),) 404218887Sdim $1_SRC_INCLUDES := $$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$(addsuffix /%,$$($1_INCLUDES)))) 405218887Sdim $1_SRCS := $$(filter $$($1_SRC_INCLUDES),$$($1_SRCS)) 406218887Sdim endif 407218887Sdim ifneq ($$($1_EXCLUDES),) 408218887Sdim $1_SRC_EXCLUDES := $$(addsuffix /%,$$($1_EXCLUDES)) 409234353Sdim $1_SRC_EXCLUDES += $$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$(addsuffix /%,$$($1_EXCLUDES)))) 410234353Sdim $1_SRCS := $$(filter-out $$($1_SRC_EXCLUDES),$$($1_SRCS)) 411218887Sdim endif 412218887Sdim 413219077Sdim $1_SRCS += $$($1_EXTRA_FILES) 414234353Sdim 415234353Sdim # Calculate the expected output from compiling the sources (sort to remove duplicates. Also provides 416234353Sdim # a reproducable order on the input files to the linker). 417218887Sdim $1_EXPECTED_OBJS_FILENAMES := $$(call replace_with_obj_extension, $$(notdir $$($1_SRCS))) 418218887Sdim $1_EXPECTED_OBJS:=$$(sort $$(addprefix $$($1_OBJECT_DIR)/,$$($1_EXPECTED_OBJS_FILENAMES))) 419218887Sdim # Are there too many object files on disk? Perhaps because some source file was removed? 420218887Sdim $1_SUPERFLOUS_OBJS:=$$(sort $$(filter-out $$($1_EXPECTED_OBJS),$$($1_BINS))) 421218887Sdim # Clean out the superfluous object files. 422218887Sdim ifneq ($$($1_SUPERFLUOUS_OBJS),) 423218887Sdim $$(shell $(RM) -f $$($1_SUPERFLUOUS_OBJS)) 424218887Sdim endif 425234353Sdim 426218887Sdim # Pickup extra OPENJDK_TARGET_OS_TYPE and/or OPENJDK_TARGET_OS dependent variables for CFLAGS. 427218887Sdim $1_EXTRA_CFLAGS:=$$($1_CFLAGS_$(OPENJDK_TARGET_OS_TYPE)) $$($1_CFLAGS_$(OPENJDK_TARGET_OS)) 428234353Sdim ifneq ($(DEBUG_LEVEL),release) 429234353Sdim # Pickup extra debug dependent variables for CFLAGS 430234353Sdim $1_EXTRA_CFLAGS+=$$($1_CFLAGS_debug) 431218887Sdim $1_EXTRA_CFLAGS+=$$($1_CFLAGS_$(OPENJDK_TARGET_OS_TYPE)_debug) 432249423Sdim $1_EXTRA_CFLAGS+=$$($1_CFLAGS_$(OPENJDK_TARGET_OS)_debug) 433218887Sdim else 434218887Sdim $1_EXTRA_CFLAGS+=$$($1_CFLAGS_release) 435218887Sdim $1_EXTRA_CFLAGS+=$$($1_CFLAGS_$(OPENJDK_TARGET_OS_TYPE)_release) 436249423Sdim $1_EXTRA_CFLAGS+=$$($1_CFLAGS_$(OPENJDK_TARGET_OS)_release) 437218887Sdim endif 438218887Sdim 439218887Sdim # Pickup extra OPENJDK_TARGET_OS_TYPE and/or OPENJDK_TARGET_OS dependent variables for CXXFLAGS. 440218887Sdim $1_EXTRA_CXXFLAGS:=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS_TYPE)) $$($1_CXXFLAGS_$(OPENJDK_TARGET_OS)) 441218887Sdim ifneq ($(DEBUG_LEVEL),release) 442218887Sdim # Pickup extra debug dependent variables for CXXFLAGS 443218887Sdim $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_debug) 444218887Sdim $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS_TYPE)_debug) 445218887Sdim $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS)_debug) 446218887Sdim else 447218887Sdim $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_release) 448218887Sdim $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS_TYPE)_release) 449218887Sdim $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS)_release) 450218887Sdim endif 451218887Sdim 452218887Sdim ifeq ($$($1_DEBUG_SYMBOLS), true) 453218887Sdim ifeq ($(ENABLE_DEBUG_SYMBOLS), true) 454218887Sdim ifdef OPENJDK 455218887Sdim # Always add debug symbols 456224145Sdim $1_EXTRA_CFLAGS+=$(CFLAGS_DEBUG_SYMBOLS) 457218887Sdim $1_EXTRA_CXXFLAGS+=$(CXXFLAGS_DEBUG_SYMBOLS) 458218887Sdim else 459249423Sdim # Programs don't get the debug symbols added in the old build. It's not clear if 460249423Sdim # this is intentional. 461218887Sdim ifeq ($$($1_PROGRAM),) 462218887Sdim $1_EXTRA_CFLAGS+=$(CFLAGS_DEBUG_SYMBOLS) 463218887Sdim $1_EXTRA_CXXFLAGS+=$(CXXFLAGS_DEBUG_SYMBOLS) 464218887Sdim endif 465218887Sdim endif 466218887Sdim endif 467218887Sdim endif 468218887Sdim 469218887Sdim # If no C++ flags are explicitly set, default to using the C flags. 470218887Sdim # After that, we can set additional C++ flags that should not interfere 471249423Sdim # with the mechanism for copying the C flags by default. 472218887Sdim ifeq ($$($1_CXXFLAGS),) 473218887Sdim $1_CXXFLAGS:=$$($1_CFLAGS) 474249423Sdim endif 475218887Sdim ifeq ($$(strip $$($1_EXTRA_CXXFLAGS)),) 476218887Sdim $1_EXTRA_CXXFLAGS:=$$($1_EXTRA_CFLAGS) 477218887Sdim endif 478218887Sdim 479234353Sdim ifneq (,$$($1_REORDER)) 480249423Sdim $1_EXTRA_CFLAGS += $$(C_FLAG_REORDER) 481218887Sdim $1_EXTRA_CXXFLAGS += $$(CXX_FLAG_REORDER) 482218887Sdim endif 483218887Sdim 484218887Sdim # Pick up disabled warnings, if possible on this platform. 485218887Sdim ifneq ($(DISABLE_WARNING_PREFIX),) 486224145Sdim $1_EXTRA_CFLAGS += $$(addprefix $(DISABLE_WARNING_PREFIX), $$($1_DISABLED_WARNINGS_$(TOOLCHAIN_TYPE))) 487218887Sdim $1_EXTRA_CXXFLAGS += $$(addprefix $(DISABLE_WARNING_PREFIX), $$($1_DISABLED_WARNINGS_$(TOOLCHAIN_TYPE))) 488224145Sdim endif 489224145Sdim 490249423Sdim # Check if warnings should be considered errors. 491218887Sdim # Pick first binary and toolchain specific, then binary specific, then general setting. 492218887Sdim ifeq ($$($1_WARNINGS_AS_ERRORS_$(TOOLCHAIN_TYPE)),) 493218887Sdim ifeq ($$($1_WARNINGS_AS_ERRORS),) 494218887Sdim $1_WARNINGS_AS_ERRORS_$(TOOLCHAIN_TYPE) := $$(WARNINGS_AS_ERRORS) 495218887Sdim else 496218887Sdim $1_WARNINGS_AS_ERRORS_$(TOOLCHAIN_TYPE) := $$($1_WARNINGS_AS_ERRORS) 497249423Sdim endif 498218887Sdim endif 499218887Sdim 500218887Sdim ifeq ($$($1_WARNINGS_AS_ERRORS_$(TOOLCHAIN_TYPE)), true) 501218887Sdim $1_EXTRA_CFLAGS += $(CFLAGS_WARNINGS_ARE_ERRORS) 502218887Sdim $1_EXTRA_CXXFLAGS += $(CFLAGS_WARNINGS_ARE_ERRORS) 503218887Sdim endif 504249423Sdim 505249423Sdim ifeq (NONE, $$($1_OPTIMIZATION)) 506218887Sdim $1_EXTRA_CFLAGS += $(C_O_FLAG_NONE) 507218887Sdim $1_EXTRA_CXXFLAGS += $(CXX_O_FLAG_NONE) 508218887Sdim else ifeq (LOW, $$($1_OPTIMIZATION)) 509218887Sdim $1_EXTRA_CFLAGS += $(C_O_FLAG_NORM) 510218887Sdim $1_EXTRA_CXXFLAGS += $(CXX_O_FLAG_NORM) 511218887Sdim else ifeq (HIGH, $$($1_OPTIMIZATION)) 512218887Sdim $1_EXTRA_CFLAGS += $(C_O_FLAG_HI) 513218887Sdim $1_EXTRA_CXXFLAGS += $(CXX_O_FLAG_HI) 514218887Sdim else ifeq (HIGHEST, $$($1_OPTIMIZATION)) 515218887Sdim $1_EXTRA_CFLAGS += $(C_O_FLAG_HIGHEST) 516218887Sdim $1_EXTRA_CXXFLAGS += $(CXX_O_FLAG_HIGHEST) 517218887Sdim else ifneq (, $$($1_OPTIMIZATION)) 518218887Sdim $$(error Unknown value for OPTIMIZATION: $$($1_OPTIMIZATION)) 519218887Sdim endif 520218887Sdim 521218887Sdim $1_BUILD_INFO := $$($1_OBJECT_DIR)/_build-info.marker 522234353Sdim 523219077Sdim # Track variable changes for all variables that affect the compilation command 524218887Sdim # lines for all object files in this setup. This includes at least all the 525218887Sdim # variables used in the call to add_native_source below. 526218887Sdim $1_COMPILE_VARDEPS := $$($1_CFLAGS) $$($1_EXTRA_CFLAGS) $$($1_SYSROOT_CFLAGS) \ 527218887Sdim $$($1_CXXFLAGS) $$($1_EXTRA_CXXFLAGS) \ 528218887Sdim $$($1_CC) $$($1_CXX) $$($1_AS) $$($1_ASFLAGS) \ 529263508Sdim $$(foreach s, $$($1_SRCS), \ 530218887Sdim $$($1_$$(notdir $$s)_CFLAGS) $$($1_$$(notdir $$s)_CXXFLAGS)) 531218887Sdim $1_COMPILE_VARDEPS_FILE := $$(call DependOnVariable, $1_COMPILE_VARDEPS, \ 532226633Sdim $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).comp.vardeps) 533226633Sdim 534218887Sdim # Now call add_native_source for each source file we are going to compile. 535218887Sdim $$(foreach p,$$($1_SRCS), \ 536218887Sdim $$(eval $$(call add_native_source,$1,$$p,$$($1_OBJECT_DIR), \ 537218887Sdim $$($1_CFLAGS) $$($1_EXTRA_CFLAGS) $$($1_SYSROOT_CFLAGS), \ 538243830Sdim $$($1_CC), \ 539218887Sdim $$($1_CXXFLAGS) $$($1_EXTRA_CXXFLAGS) $$($1_SYSROOT_CFLAGS), \ 540218887Sdim $$($1_CXX), $$($1_ASFLAGS)))) 541234353Sdim 542234353Sdim # Setup rule for printing progress info when compiling source files. 543224145Sdim # This is a rough heuristic and may not always print accurate information. 544224145Sdim $$($1_BUILD_INFO): $$($1_SRCS) $$($1_COMPILE_VARDEPS_FILE) 545234353Sdim ifeq ($$(wildcard $$($1_TARGET)),) 546234353Sdim $(ECHO) 'Creating $$($1_BASENAME) from $$(words $$(filter-out %.vardeps, $$?)) file(s)' 547234353Sdim else 548234353Sdim $(ECHO) $$(strip 'Updating $$($1_BASENAME)' \ 549224145Sdim $$(if $$(filter-out %.vardeps, $$?), \ 550224145Sdim 'from $$(words $$(filter-out %.vardeps, $$?)) file(s)') \ 551224145Sdim $$(if $$(filter %.vardeps, $$?), 'due to makefile changes')) 552224145Sdim endif 553224145Sdim $(TOUCH) $$@ 554224145Sdim 555224145Sdim # On windows we need to create a resource file 556224145Sdim ifeq ($(OPENJDK_TARGET_OS), windows) 557224145Sdim ifneq (,$$($1_VERSIONINFO_RESOURCE)) 558224145Sdim $1_RES:=$$($1_OBJECT_DIR)/$$($1_BASENAME).res 559224145Sdim $1_RES_DEP:=$$($1_RES).d 560234353Sdim $1_RES_DEP_TARGETS:=$$($1_RES).d.targets 561249423Sdim -include $$($1_RES_DEP) 562234353Sdim -include $$($1_RES_DEP_TARGETS) 563234353Sdim 564234353Sdim $1_RES_VARDEPS := $$($1_RC) $$($1_RC_FLAGS) 565224145Sdim $1_RES_VARDEPS_FILE := $$(call DependOnVariable, $1_RES_VARDEPS, \ 566224145Sdim $$($1_RES).vardeps) 567224145Sdim 568224145Sdim $$($1_RES): $$($1_VERSIONINFO_RESOURCE) $$($1_RES_VARDEPS_FILE) 569224145Sdim $(ECHO) $(LOG_INFO) "Compiling resource $$(notdir $$($1_VERSIONINFO_RESOURCE)) (for $$(notdir $$($1_TARGET)))" 570224145Sdim $$($1_RC) $$($1_RC_FLAGS) $$($1_SYSROOT_CFLAGS) $(CC_OUT_OPTION)$$@ \ 571224145Sdim $$($1_VERSIONINFO_RESOURCE) 572249423Sdim # Windows RC compiler does not support -showIncludes, so we mis-use CL for this. 573224145Sdim $$($1_CC) $$($1_RC_FLAGS) $$($1_SYSROOT_CFLAGS) -showIncludes -nologo -TC \ 574224145Sdim $(CC_OUT_OPTION)$$($1_RES_DEP).obj $$($1_VERSIONINFO_RESOURCE) > $$($1_RES_DEP).raw 2>&1 || exit 0 575224145Sdim ($(ECHO) $$($1_RES): \\ \ 576224145Sdim && $(SED) $(WINDOWS_SHOWINCLUDE_SED_PATTERN) $$($1_RES_DEP).raw) > $$($1_RES_DEP) 577224145Sdim $(SED) $(DEPENDENCY_TARGET_SED_PATTERN) $$($1_RES_DEP) > $$($1_RES_DEP_TARGETS) 578234353Sdim endif 579224145Sdim endif 580249423Sdim 581224145Sdim # mapfile doesnt seem to be implemented on macosx (yet??) 582224145Sdim ifneq ($(OPENJDK_TARGET_OS),macosx) 583224145Sdim ifneq ($(OPENJDK_TARGET_OS),windows) 584224145Sdim $1_REAL_MAPFILE:=$$($1_MAPFILE) 585224145Sdim ifneq (,$$($1_REORDER)) 586224145Sdim $1_REAL_MAPFILE:=$$($1_OBJECT_DIR)/mapfile 587224145Sdim 588224145Sdim $$($1_REAL_MAPFILE) : $$($1_MAPFILE) $$($1_REORDER) 589224145Sdim $$(MKDIR) -p $$(@D) 590224145Sdim $$(CP) $$($1_MAPFILE) $$@.tmp 591224145Sdim $$(SED) -e 's=OUTPUTDIR=$$($1_OBJECT_DIR)=' $$($1_REORDER) >> $$@.tmp 592224145Sdim $$(MV) $$@.tmp $$@ 593224145Sdim endif 594224145Sdim endif 595224145Sdim endif 596224145Sdim 597224145Sdim # Pickup extra OPENJDK_TARGET_OS_TYPE and/or OPENJDK_TARGET_OS dependent variables 598224145Sdim # for LDFLAGS and LDFLAGS_SUFFIX 599224145Sdim $1_EXTRA_LDFLAGS:=$$($1_LDFLAGS_$(OPENJDK_TARGET_OS_TYPE)) $$($1_LDFLAGS_$(OPENJDK_TARGET_OS)) 600224145Sdim $1_EXTRA_LDFLAGS_SUFFIX:=$$($1_LDFLAGS_SUFFIX_$(OPENJDK_TARGET_OS_TYPE)) $$($1_LDFLAGS_SUFFIX_$(OPENJDK_TARGET_OS)) 601243830Sdim ifneq (,$$($1_REAL_MAPFILE)) 602224145Sdim $1_EXTRA_LDFLAGS += $(call SET_SHARED_LIBRARY_MAPFILE,$$($1_REAL_MAPFILE)) 603224145Sdim endif 604224145Sdim 605224145Sdim # Need to make sure TARGET is first on list 606224145Sdim $1 := $$($1_TARGET) 607224145Sdim ifeq ($$($1_STATIC_LIBRARY),) 608224145Sdim ifeq ($$($1_DEBUG_SYMBOLS), true) 609224145Sdim ifeq ($(ENABLE_DEBUG_SYMBOLS), true) 610224145Sdim ifneq ($(OPENJDK_TARGET_OS), macosx) # no MacOS X support yet 611224145Sdim ifneq ($$($1_OUTPUT_DIR),$$($1_OBJECT_DIR)) 612224145Sdim # The dependency on TARGET is needed on windows for debuginfo files 613224145Sdim # to be rebuilt properly. 614234353Sdim $$($1_OUTPUT_DIR)/% : $$($1_OBJECT_DIR)/% $$($1_TARGET) 615218887Sdim $(CP) $$< $$@ 616218887Sdim endif 617218887Sdim 618218887Sdim # Generate debuginfo files. 619218887Sdim ifeq ($(OPENJDK_TARGET_OS), windows) 620218887Sdim $1_EXTRA_LDFLAGS += "-pdb:$$($1_OBJECT_DIR)/$$($1_NOSUFFIX).pdb" \ 621218887Sdim "-map:$$($1_OBJECT_DIR)/$$($1_NOSUFFIX).map" 622218887Sdim $1_DEBUGINFO_FILES := $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).pdb \ 623218887Sdim $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).map 624218887Sdim 625218887Sdim else ifeq ($(OPENJDK_TARGET_OS), solaris) 626218887Sdim $1_DEBUGINFO_FILES := $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).debuginfo 627218887Sdim # Setup the command line creating debuginfo files, to be run after linking. 628218887Sdim # It cannot be run separately since it updates the original target file 629218887Sdim # 630218887Sdim # gobjcopy crashes on "empty" section headers with the SHF_ALLOC flag set. 631218887Sdim # Use $(FIX_EMPTY_SEC_HDR_FLAGS) to clear the SHF_ALLOC flag (if set) from 632224145Sdim # empty section headers until a fixed $(OBJCOPY) is available. 633224145Sdim # An empty section header has sh_addr == 0 and sh_size == 0. 634218887Sdim # This problem has only been seen on Solaris X64, but we call this tool 635218887Sdim # on all Solaris builds just in case. 636218887Sdim # 637218887Sdim # $(OBJCOPY) --add-gnu-debuglink=... corrupts SUNW_* sections. 638218887Sdim # Use $(ADD_GNU_DEBUGLINK) until a fixed $(OBJCOPY) is available. 639218887Sdim $1_CREATE_DEBUGINFO_CMDS := \ 640218887Sdim $(FIX_EMPTY_SEC_HDR_FLAGS) $(LOG_INFO) $$($1_TARGET) $$(NEWLINE) \ 641218887Sdim $(OBJCOPY) --only-keep-debug $$($1_TARGET) $$($1_DEBUGINFO_FILES) $$(NEWLINE) \ 642218887Sdim $(CD) $$($1_OUTPUT_DIR) && \ 643218887Sdim $(ADD_GNU_DEBUGLINK) $(LOG_INFO) $$($1_DEBUGINFO_FILES) $$($1_TARGET) 644218887Sdim $1_DEBUGINFO_EXTRA_DEPS := $(FIX_EMPTY_SEC_HDR_FLAGS) $(ADD_GNU_DEBUGLINK) 645218887Sdim 646218887Sdim else ifeq ($(OPENJDK_TARGET_OS), linux) 647224145Sdim $1_DEBUGINFO_FILES := $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).debuginfo 648224145Sdim # Setup the command line creating debuginfo files, to be run after linking. 649224145Sdim # It cannot be run separately since it updates the original target file 650224145Sdim $1_CREATE_DEBUGINFO_CMDS := \ 651224145Sdim $(OBJCOPY) --only-keep-debug $$($1_TARGET) $$($1_DEBUGINFO_FILES) $$(NEWLINE) \ 652218887Sdim $(CD) $$($1_OUTPUT_DIR) && \ 653218887Sdim $(OBJCOPY) --add-gnu-debuglink=$$($1_DEBUGINFO_FILES) $$($1_TARGET) 654218887Sdim 655234353Sdim endif # No MacOS X support 656218887Sdim 657224145Sdim # This dependency dance ensures that debug info files get rebuilt 658224145Sdim # properly if deleted. 659224145Sdim $$($1_TARGET): $$($1_DEBUGINFO_FILES) 660224145Sdim $$($1_DEBUGINFO_FILES): $$($1_EXPECTED_OBJS) 661224145Sdim 662224145Sdim ifeq ($(ZIP_DEBUGINFO_FILES), true) 663224145Sdim $1_DEBUGINFO_ZIP := $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).diz 664224145Sdim $1 += $$(subst $$($1_OBJECT_DIR),$$($1_OUTPUT_DIR),$$($1_DEBUGINFO_ZIP)) 665263508Sdim 666218887Sdim # The dependency on TARGET is needed for debuginfo files 667218887Sdim # to be rebuilt properly. 668218887Sdim $$($1_DEBUGINFO_ZIP): $$($1_DEBUGINFO_FILES) $$($1_TARGET) 669219077Sdim $(CD) $$($1_OBJECT_DIR) \ 670243830Sdim && $(ZIP) -q $$@ $$(notdir $$($1_DEBUGINFO_FILES)) 671243830Sdim 672224145Sdim else 673263508Sdim $1 += $$(subst $$($1_OBJECT_DIR),$$($1_OUTPUT_DIR),$$($1_DEBUGINFO_FILES)) 674263508Sdim endif 675263508Sdim endif 676263508Sdim endif # !MacOS X 677263508Sdim endif # $1_DEBUG_SYMBOLS 678263508Sdim endif # !STATIC_LIBRARY 679263508Sdim 680263508Sdim ifneq (,$$($1_LIBRARY)) 681263508Sdim # Generating a dynamic library. 682263508Sdim $1_EXTRA_LDFLAGS += $$(call SET_SHARED_LIBRARY_NAME,$$($1_BASENAME)) 683263508Sdim ifeq ($(OPENJDK_TARGET_OS), windows) 684263508Sdim $1_EXTRA_LDFLAGS += "-implib:$$($1_OBJECT_DIR)/$$($1_LIBRARY).lib" 685263508Sdim endif 686224145Sdim 687263508Sdim $1_EXTRA_LDFLAGS_SUFFIX += $(GLOBAL_LDFLAGS_SUFFIX) 688224145Sdim 689218887Sdim $1_VARDEPS := $$($1_LD) $$($1_SYSROOT_LDFLAGS) $$($1_LDFLAGS) $$($1_EXTRA_LDFLAGS) \ 690218887Sdim $$($1_LDFLAGS_SUFFIX) $$($1_EXTRA_LDFLAGS_SUFFIX) $$($1_CREATE_DEBUGINFO_CMDS) 691218887Sdim $1_VARDEPS_FILE := $$(call DependOnVariable, $1_VARDEPS, \ 692234353Sdim $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).vardeps) 693224145Sdim 694224145Sdim $$($1_TARGET): $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_REAL_MAPFILE) \ 695218887Sdim $$($1_DEBUGINFO_EXTRA_DEPS) $$($1_VARDEPS_FILE) 696218887Sdim $(ECHO) $(LOG_INFO) "Linking $$($1_BASENAME)" 697218887Sdim $$($1_LD) $$($1_LDFLAGS) $$($1_EXTRA_LDFLAGS) $$($1_SYSROOT_LDFLAGS) \ 698218887Sdim $(LD_OUT_OPTION)$$@ \ 699218887Sdim $$($1_EXPECTED_OBJS) $$($1_RES) \ 700249423Sdim $$($1_LDFLAGS_SUFFIX) $$($1_EXTRA_LDFLAGS_SUFFIX) 701234353Sdim $$($1_CREATE_DEBUGINFO_CMDS) 702234353Sdim # Touch target to make sure it has a later time stamp than the debug 703234353Sdim # symbol files to avoid unnecessary relinking on rebuild. 704234353Sdim ifeq ($(OPENJDK_TARGET_OS), windows) 705218887Sdim $(TOUCH) $$@ 706263508Sdim endif 707219077Sdim 708218887Sdim endif 709234353Sdim 710218887Sdim ifneq (,$$($1_STATIC_LIBRARY)) 711224145Sdim $1_VARDEPS := $$($1_AR) $$($1_ARFLAGS) $$($1_LDFLAGS_SUFFIX) \ 712224145Sdim $$($1_EXTRA_LDFLAGS_SUFFIX) 713224145Sdim $1_VARDEPS_FILE := $$(call DependOnVariable, $1_VARDEPS, \ 714218887Sdim $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).vardeps) 715218887Sdim 716218887Sdim # Generating a static library, ie object file archive. 717226633Sdim $$($1_TARGET): $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_VARDEPS_FILE) 718218887Sdim $(ECHO) $(LOG_INFO) "Archiving $$($1_STATIC_LIBRARY)" 719218887Sdim $$($1_AR) $$($1_ARFLAGS) $(AR_OUT_OPTION)$$($1_TARGET) $$($1_EXPECTED_OBJS) \ 720218887Sdim $$($1_RES) $$($1_LDFLAGS_SUFFIX) $$($1_EXTRA_LDFLAGS_SUFFIX) 721243830Sdim endif 722218887Sdim 723234353Sdim ifneq (,$$($1_PROGRAM)) 724218887Sdim # A executable binary has been specified, setup the target for it. 725218887Sdim $1_EXTRA_LDFLAGS_SUFFIX += $(GLOBAL_LDFLAGS_SUFFIX) 726218887Sdim 727218887Sdim $1_VARDEPS := $$($1_LD) $$($1_SYSROOT_LDFLAGS) $$($1_LDFLAGS) $$($1_EXTRA_LDFLAGS) \ 728218887Sdim $$($1_LDFLAGS_SUFFIX) $$($1_EXTRA_LDFLAGS_SUFFIX) $$($1_MT) \ 729218887Sdim $$($1_CODESIGN) $$($1_CREATE_DEBUGINFO_CMDS) $$($1_MANIFEST_VERSION) 730218887Sdim $1_VARDEPS_FILE := $$(call DependOnVariable, $1_VARDEPS, \ 731218887Sdim $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).vardeps) 732218887Sdim 733218887Sdim $$($1_TARGET): $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_MANIFEST) \ 734218887Sdim $$($1_DEBUGINFO_EXTRA_DEPS) $$($1_VARDEPS_FILE) 735218887Sdim $(ECHO) $(LOG_INFO) "Linking executable $$($1_BASENAME)" 736218887Sdim $$($1_LD) $$($1_LDFLAGS) $$($1_EXTRA_LDFLAGS) $$($1_SYSROOT_LDFLAGS) \ 737218887Sdim $(EXE_OUT_OPTION)$$($1_TARGET) \ 738218887Sdim $$($1_EXPECTED_OBJS) $$($1_RES) \ 739218887Sdim $$($1_LDFLAGS_SUFFIX) $$($1_EXTRA_LDFLAGS_SUFFIX) 740218887Sdim ifeq ($(OPENJDK_TARGET_OS), windows) 741218887Sdim ifneq ($$($1_MANIFEST), ) 742218887Sdim $$($1_MT) -nologo -manifest $$($1_MANIFEST) -identity:"$$($1_PROGRAM).exe, version=$$($1_MANIFEST_VERSION)" -outputresource:$$@;#1 743218887Sdim endif 744218887Sdim endif 745218887Sdim # This only works if the openjdk_codesign identity is present on the system. Let 746218887Sdim # silently fail otherwise. 747218887Sdim ifneq (,$(CODESIGN)) 748218887Sdim ifneq (,$$($1_CODESIGN)) 749224145Sdim $(CODESIGN) -s openjdk_codesign $$@ 750218887Sdim endif 751218887Sdim endif 752218887Sdim $$($1_CREATE_DEBUGINFO_CMDS) 753218887Sdim # Touch target to make sure it has a later time stamp than the debug 754218887Sdim # symbol files to avoid unnecessary relinking on rebuild. 755218887Sdim ifeq ($(OPENJDK_TARGET_OS), windows) 756218887Sdim $(TOUCH) $$@ 757218887Sdim endif 758218887Sdim 759218887Sdim endif 760218887Sdimendef 761234353Sdim 762234353Sdimendif # _NATIVE_COMPILATION_GMK 763234353Sdim