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