NativeCompilation.gmk revision 1223:67395f7ca2db
1214501Srpaulo#
2214501Srpaulo# Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
3289549Srpaulo# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4214501Srpaulo#
5252726Srpaulo# This code is free software; you can redistribute it and/or modify it
6252726Srpaulo# under the terms of the GNU General Public License version 2 only, as
7214501Srpaulo# published by the Free Software Foundation.  Oracle designates this
8214501Srpaulo# particular file as subject to the "Classpath" exception as provided
9214501Srpaulo# by Oracle in the LICENSE file that accompanied this code.
10214501Srpaulo#
11214501Srpaulo# This code is distributed in the hope that it will be useful, but WITHOUT
12214501Srpaulo# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13337817Scy# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14214501Srpaulo# version 2 for more details (a copy is included in the LICENSE file that
15214501Srpaulo# accompanied this code).
16289549Srpaulo#
17252726Srpaulo# You should have received a copy of the GNU General Public License version
18351611Scy# 2 along with this work; if not, write to the Free Software Foundation,
19252726Srpaulo# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20289549Srpaulo#
21337817Scy# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22214501Srpaulo# or visit www.oracle.com if you need additional information or have any
23281806Srpaulo# questions.
24281806Srpaulo#
25281806Srpaulo
26281806Srpaulo# When you read this source. Remember that $(sort ...) has the side effect
27281806Srpaulo# of removing duplicates. It is actually this side effect that is
28281806Srpaulo# desired whenever sort is used below!
29281806Srpaulo
30281806Srpauloifndef _NATIVE_COMPILATION_GMK
31281806Srpaulo_NATIVE_COMPILATION_GMK := 1
32281806Srpaulo
33281806Srpauloifeq (,$(_MAKEBASE_GMK))
34281806Srpaulo  $(error You must include MakeBase.gmk prior to including NativeCompilation.gmk)
35281806Srpauloendif
36281806Srpaulo
37281806Srpauloifneq ($(TOOLCHAIN_TYPE), microsoft)
38281806Srpaulo  COMPILING_MSG=echo $(LOG_INFO) "Compiling $(notdir $1) (for $(notdir $2))"
39289549Srpaulo  LINKING_MSG=echo $(LOG_INFO) "Linking $1"
40289549Srpaulo  LINKING_EXE_MSG=echo $(LOG_INFO) "Linking executable $1"
41281806Srpaulo  ARCHIVING_MSG=echo $(LOG_INFO) "Archiving $1"
42281806Srpauloelse
43281806Srpaulo  COMPILING_MSG=
44281806Srpaulo  LINKING_MSG=
45337817Scy  LINKING_EXE_MSG=
46346981Scy  ARCHIVING_MSG=
47337817Scyendif
48337817Scy
49337817Scyifeq ($(OPENJDK_BUILD_OS_ENV), windows.cygwin)
50281806Srpaulo  UNIX_PATH_PREFIX := /cygdrive
51281806Srpauloelse ifeq ($(OPENJDK_BUILD_OS_ENV), windows.msys)
52281806Srpaulo  UNIX_PATH_PREFIX :=
53281806Srpauloendif
54281806Srpaulo
55281806Srpaulodefine add_native_source
56214501Srpaulo  # param 1 = BUILD_MYPACKAGE
57214501Srpaulo  # parma 2 = the source file name (..../alfa.c or .../beta.cpp)
58214501Srpaulo  # param 3 = the bin dir that stores all .o (.obj) and .d files.
59214501Srpaulo  # param 4 = the c flags to the compiler
60214501Srpaulo  # param 5 = the c compiler
61214501Srpaulo  # param 6 = the c++ flags to the compiler
62214501Srpaulo  # param 7 = the c++ compiler
63337817Scy  # param 8 = the flags to the assembler
64214501Srpaulo
65214501Srpaulo  ifneq (,$$(filter %.c,$2))
66214501Srpaulo    # Compile as a C file
67214501Srpaulo    $1_$2_FLAGS=$4 $$($1_$(notdir $2)_CFLAGS) -DTHIS_FILE='"$$(<F)"' -c
68214501Srpaulo    $1_$2_COMP=$5
69214501Srpaulo    $1_$2_DEP_FLAG:=$(C_FLAG_DEPS)
70214501Srpaulo  else ifneq (,$$(filter %.m,$2))
71214501Srpaulo    # Compile as a objective-c file
72214501Srpaulo    $1_$2_FLAGS=-x objective-c $4 $$($1_$(notdir $2)_CFLAGS) -DTHIS_FILE='"$$(<F)"' -c
73214501Srpaulo    $1_$2_COMP=$5
74214501Srpaulo    $1_$2_DEP_FLAG:=$(C_FLAG_DEPS)
75214501Srpaulo  else ifneq (,$$(filter %.s,$2))
76214501Srpaulo    # Compile as assembler file
77214501Srpaulo    $1_$2_FLAGS=$8 -DTHIS_FILE='"$$(<F)"'
78214501Srpaulo    $1_$2_COMP=$(AS)
79214501Srpaulo    $1_$2_DEP_FLAG:=
80214501Srpaulo  else
81214501Srpaulo    # Compile as a C++ file
82214501Srpaulo    $1_$2_FLAGS=$6 $$($1_$(notdir $2)_CXXFLAGS) -DTHIS_FILE='"$$(<F)"' -c
83214501Srpaulo    $1_$2_COMP=$7
84281806Srpaulo    $1_$2_DEP_FLAG:=$(CXX_FLAG_DEPS)
85281806Srpaulo  endif
86214501Srpaulo  # Generate the .o (.obj) file name and place it in the bin dir.
87214501Srpaulo  $1_$2_OBJ:=$3/$$(patsubst %.cpp,%$(OBJ_SUFFIX),$$(patsubst %.c,%$(OBJ_SUFFIX),$$(patsubst %.m,%$(OBJ_SUFFIX),$$(patsubst %.s,%$(OBJ_SUFFIX),$$(notdir $2)))))
88214501Srpaulo  # Only continue if this object file hasn't been processed already. This lets the first found
89289549Srpaulo  # source file override any other with the same name.
90214501Srpaulo  ifeq (,$$(findstring $$($1_$2_OBJ),$$($1_OBJS_SO_FAR)))
91252726Srpaulo    $1_OBJS_SO_FAR+=$$($1_$2_OBJ)
92252726Srpaulo    ifeq (,$$(filter %.s,$2))
93281806Srpaulo      # And this is the dependency file for this obj file.
94281806Srpaulo      $1_$2_DEP:=$$(patsubst %$(OBJ_SUFFIX),%.d,$$($1_$2_OBJ))
95214501Srpaulo      # Include previously generated dependency information. (if it exists)
96214501Srpaulo      -include $$($1_$2_DEP)
97214501Srpaulo
98214501Srpaulo      ifeq ($(TOOLCHAIN_TYPE), microsoft)
99214501Srpaulo        $1_$2_DEBUG_OUT_FLAGS:=-Fd$$(patsubst %$(OBJ_SUFFIX),%.pdb,$$($1_$2_OBJ)) \
100214501Srpaulo            -Fm$$(patsubst %$(OBJ_SUFFIX),%.map,$$($1_$2_OBJ))
101214501Srpaulo      endif
102214501Srpaulo    endif
103214501Srpaulo
104214501Srpaulo    $$($1_$2_OBJ) : $2
105214501Srpaulo        ifneq ($(TOOLCHAIN_TYPE), microsoft)
106214501Srpaulo	  $$(call COMPILING_MSG,$2,$$($1_TARGET))
107214501Srpaulo          # The Solaris studio compiler doesn't output the full path to the object file in the
108214501Srpaulo          # generated deps files. Fixing it with sed. If compiling assembly, don't try this.
109252726Srpaulo          ifeq ($(TOOLCHAIN_TYPE)$$(filter %.s,$2), solstudio)
110252726Srpaulo	    $$($1_$2_COMP) $$($1_$2_FLAGS) $$($1_$2_DEP_FLAG) $$($1_$2_DEP).tmp $(CC_OUT_OPTION)$$($1_$2_OBJ) $2
111252726Srpaulo	    $(SED) 's|^$$(@F):|$$@:|' $$($1_$2_DEP).tmp > $$($1_$2_DEP)
112252726Srpaulo          else
113337817Scy	    $$($1_$2_COMP) $$($1_$2_FLAGS) $$($1_$2_DEP_FLAG) $$($1_$2_DEP) $(CC_OUT_OPTION)$$($1_$2_OBJ) $2
114214501Srpaulo          endif
115214501Srpaulo        endif
116214501Srpaulo        # The Visual Studio compiler lacks a feature for generating make dependencies, but by
117214501Srpaulo        # setting -showIncludes, all included files are printed. These are filtered out and
118214501Srpaulo        # parsed into make dependences.
119214501Srpaulo        ifeq ($(TOOLCHAIN_TYPE), microsoft)
120214501Srpaulo	  ($$($1_$2_COMP) $$($1_$2_FLAGS) -showIncludes $$($1_$2_DEBUG_OUT_FLAGS) \
121214501Srpaulo	      $(CC_OUT_OPTION)$$($1_$2_OBJ) $2 ; echo $$$$? > $$($1_$2_DEP).exitvalue) \
122214501Srpaulo	      | $(TEE) $$($1_$2_DEP).raw | $(GREP) -v "^Note: including file:" \
123214501Srpaulo	      && exit `cat $$($1_$2_DEP).exitvalue`
124214501Srpaulo	  $(RM) $$($1_$2_DEP).exitvalue
125337817Scy	  ($(ECHO) $$@: \\ \
126214501Srpaulo	  && $(SED) -e '/^Note: including file:/!d' \
127346981Scy	      -e 's|Note: including file: *||' \
128289549Srpaulo	      -e 's|\\|/|g' \
129214501Srpaulo	      -e 's|^\([a-zA-Z]\):|$(UNIX_PATH_PREFIX)/\1|g' \
130214501Srpaulo	      -e '/$(subst /,\/,$(TOPDIR))/!d' \
131214501Srpaulo	      -e 's|$$$$| \\|g' \
132214501Srpaulo	      $$($1_$2_DEP).raw) > $$($1_$2_DEP)
133214501Srpaulo        endif
134214501Srpaulo  endif
135214501Srpauloendef
136214501Srpaulo
137214501Srpaulodefine SetupNativeCompilation
138346981Scy  # param 1 is for example BUILD_MYPACKAGE
139337817Scy  # param 2,3,4,5,6,7,8 are named args.
140337817Scy  #   SRC one or more directory roots to scan for C/C++ files.
141252726Srpaulo  #   LANG C or C++
142252726Srpaulo  #   CFLAGS the compiler flags to be used, used both for C and C++.
143337817Scy  #   CXXFLAGS the compiler flags to be used for c++, if set overrides CFLAGS.
144252726Srpaulo  #   LDFLAGS the linker flags to be used, used both for C and C++.
145337817Scy  #   LDFLAGS_SUFFIX the linker flags to be added last on the commandline
146337817Scy  #       typically the libraries linked to.
147252726Srpaulo  #   ARFLAGS the archiver flags to be used
148252726Srpaulo  #   OBJECT_DIR the directory where we store the object files
149214501Srpaulo  #   LIBRARY the resulting library file
150214501Srpaulo  #   PROGRAM the resulting exec file
151214501Srpaulo  #   INCLUDES only pick source from these directories
152346981Scy  #   EXCLUDES do not pick source from these directories
153214501Srpaulo  #   INCLUDE_FILES only compile exactly these files!
154214501Srpaulo  #   EXCLUDE_FILES with these names
155281806Srpaulo  #   VERSIONINFO_RESOURCE Input file for RC. Setting this implies that RC will be run
156346981Scy  #   RC_FLAGS flags for RC.
157214501Srpaulo  #   MAPFILE mapfile
158214501Srpaulo  #   REORDER reorder file
159214501Srpaulo  #   DEBUG_SYMBOLS add debug symbols (if configured on)
160214501Srpaulo  #   CC the compiler to use, default is $(CC)
161214501Srpaulo  #   LDEXE the linker to use for linking executables, default is $(LDEXE)
162214501Srpaulo  #   OPTIMIZATION sets optimization level to NONE, LOW, HIGH, HIGHEST
163214501Srpaulo  $(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))
164214501Srpaulo  $(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))
165214501Srpaulo  $(if $(27),$(error Internal makefile error: Too many arguments to SetupNativeCompilation, please update NativeCompilation.gmk))
166252726Srpaulo
167214501Srpaulo  ifneq (,$$($1_BIN))
168214501Srpaulo    $$(error BIN has been replaced with OBJECT_DIR)
169346981Scy  endif
170346981Scy
171214501Srpaulo  ifneq (,$$($1_LIB))
172214501Srpaulo    $$(error LIB has been replaced with LIBRARY)
173214501Srpaulo  endif
174214501Srpaulo
175214501Srpaulo  ifneq (,$$($1_EXE))
176281806Srpaulo    $$(error EXE has been replaced with PROGRAM)
177281806Srpaulo  endif
178214501Srpaulo
179281806Srpaulo  ifneq (,$$($1_LIBRARY))
180346981Scy    ifeq (,$$($1_OUTPUT_DIR))
181214501Srpaulo      $$(error LIBRARY requires OUTPUT_DIR)
182214501Srpaulo    endif
183252726Srpaulo
184252726Srpaulo    ifneq ($$($1_LIBRARY),$(basename $$($1_LIBRARY)))
185252726Srpaulo      $$(error directory of LIBRARY should be specified using OUTPUT_DIR)
186252726Srpaulo    endif
187252726Srpaulo
188214501Srpaulo    ifneq (,$(findstring $(SHARED_LIBRARY_SUFFIX),$$($1_LIBRARY)))
189214501Srpaulo      $$(error LIBRARY should be specified without SHARED_LIBRARY_SUFFIX: $(SHARED_LIBRARY_SUFFIX))
190252726Srpaulo    endif
191252726Srpaulo
192214501Srpaulo    ifneq (,$(findstring $(LIBRARY_PREFIX),$$($1_LIBRARY)))
193214501Srpaulo      $$(error LIBRARY should be specified without LIBRARY_PREFIX: $(LIBRARY_PREFIX))
194214501Srpaulo    endif
195214501Srpaulo
196214501Srpaulo    $1_BASENAME:=$(LIBRARY_PREFIX)$$($1_LIBRARY)$(SHARED_LIBRARY_SUFFIX)
197214501Srpaulo    $1_TARGET:=$$($1_OUTPUT_DIR)/$$($1_BASENAME)
198214501Srpaulo    $1_NOSUFFIX:=$(LIBRARY_PREFIX)$$($1_LIBRARY)
199252726Srpaulo  endif
200252726Srpaulo
201252726Srpaulo  ifneq (,$$($1_STATIC_LIBRARY))
202252726Srpaulo    ifeq (,$$($1_OUTPUT_DIR))
203252726Srpaulo      $$(error STATIC_LIBRARY requires OUTPUT_DIR)
204252726Srpaulo    endif
205214501Srpaulo
206214501Srpaulo    ifneq ($$($1_STATIC_LIBRARY),$(basename $$($1_STATIC_LIBRARY)))
207252726Srpaulo      $$(error directory of STATIC_LIBRARY should be specified using OUTPUT_DIR)
208252726Srpaulo    endif
209252726Srpaulo
210252726Srpaulo    ifneq (,$(findstring $(STATIC_LIBRARY_SUFFIX),$$($1_STATIC_LIBRARY)))
211252726Srpaulo      $$(error STATIC_LIBRARY should be specified without STATIC_LIBRARY_SUFFIX: $(STATIC_LIBRARY_SUFFIX))
212214501Srpaulo    endif
213346981Scy
214346981Scy    ifneq (,$(findstring $(LIBRARY_PREFIX),$$($1_STATIC_LIBRARY)))
215346981Scy      $$(error STATIC_LIBRARY should be specified without LIBRARY_PREFIX: $(LIBRARY_PREFIX))
216346981Scy    endif
217346981Scy
218346981Scy    $1_BASENAME:=$(LIBRARY_PREFIX)$$($1_STATIC_LIBRARY)$(STATIC_LIBRARY_SUFFIX)
219252726Srpaulo    $1_TARGET:=$$($1_OUTPUT_DIR)/$$($1_BASENAME)
220252726Srpaulo    $1_NOSUFFIX:=$(LIBRARY_PREFIX)$$($1_STATIC_LIBRARY)
221252726Srpaulo  endif
222252726Srpaulo
223252726Srpaulo  ifneq (,$$($1_PROGRAM))
224252726Srpaulo    ifeq (,$$($1_OUTPUT_DIR))
225252726Srpaulo      $$(error PROGRAM requires OUTPUT_DIR)
226252726Srpaulo    endif
227252726Srpaulo
228252726Srpaulo    ifneq ($$($1_PROGRAM),$(basename $$($1_PROGRAM)))
229252726Srpaulo      $$(error directory of PROGRAM should be specified using OUTPUT_DIR)
230252726Srpaulo    endif
231252726Srpaulo
232252726Srpaulo    ifneq (,$(findstring $(EXE_SUFFIX),$$($1_PROGRAM)))
233252726Srpaulo      $$(error PROGRAM should be specified without EXE_SUFFIX: $(EXE_SUFFIX))
234252726Srpaulo    endif
235252726Srpaulo
236337817Scy    $1_BASENAME:=$$($1_PROGRAM)$(EXE_SUFFIX)
237337817Scy    $1_TARGET:=$$($1_OUTPUT_DIR)/$$($1_BASENAME)
238337817Scy    $1_NOSUFFIX:=$$($1_PROGRAM)
239337817Scy  endif
240337817Scy
241337817Scy  ifeq (,$$($1_TARGET))
242346981Scy    $$(error Neither PROGRAM, LIBRARY nor STATIC_LIBRARY has been specified for SetupNativeCompilation)
243346981Scy  endif
244346981Scy
245346981Scy  ifeq (,$$($1_LANG))
246346981Scy    $$(error You have to specify LANG for native compilation $1)
247337817Scy  endif
248346981Scy  ifeq (C,$$($1_LANG))
249346981Scy    ifeq ($$($1_LDEXE),)
250346981Scy      $1_LDEXE:=$(LDEXE)
251346981Scy    endif
252346981Scy    $1_LD:=$(LD)
253346981Scy  else
254346981Scy    ifeq (C++,$$($1_LANG))
255346981Scy      $1_LD:=$(LDCXX)
256351611Scy      $1_LDEXE:=$(LDEXECXX)
257351611Scy    else
258351611Scy      $$(error Unknown native language $$($1_LANG) for $1)
259351611Scy    endif
260351611Scy  endif
261351611Scy
262351611Scy  ifeq ($$($1_CC),)
263351611Scy    $1_CC:=$(CC)
264351611Scy  endif
265351611Scy
266351611Scy  # Make sure the dirs exist.
267351611Scy  $$(eval $$(call MakeDir,$$($1_OBJECT_DIR) $$($1_OUTPUT_DIR)))
268214501Srpaulo  $$(foreach d,$$($1_SRC), $$(if $$(wildcard $$d),,$$(error SRC specified to SetupNativeCompilation $1 contains missing directory $$d)))
269214501Srpaulo
270214501Srpaulo  # Find all files in the source trees. Sort to remove duplicates.
271214501Srpaulo  $1_ALL_SRCS := $$(sort $$(call CacheFind,$$($1_SRC)))
272214501Srpaulo  # Extract the C/C++ files.
273214501Srpaulo  $1_EXCLUDE_FILES:=$$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$($1_EXCLUDE_FILES)))
274281806Srpaulo  $1_INCLUDE_FILES:=$$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$($1_INCLUDE_FILES)))
275252726Srpaulo  ifneq ($$($1_EXCLUDE_FILES),)
276214501Srpaulo    $1_EXCLUDE_FILES:=$$(addprefix %,$$($1_EXCLUDE_FILES))
277214501Srpaulo  endif
278214501Srpaulo  $1_SRCS := $$(filter-out $$($1_EXCLUDE_FILES),$$(filter %.s %.c %.cpp %.m,$$($1_ALL_SRCS)))
279214501Srpaulo  ifneq (,$$(strip $$($1_INCLUDE_FILES)))
280214501Srpaulo    $1_SRCS := $$(filter $$($1_INCLUDE_FILES),$$($1_SRCS))
281214501Srpaulo  endif
282214501Srpaulo  ifeq (,$$($1_SRCS))
283214501Srpaulo    $$(error No sources found for $1 when looking inside the dirs $$($1_SRC))
284214501Srpaulo  endif
285346981Scy  # There can be only a single bin dir root, no need to foreach over the roots.
286346981Scy  $1_BINS := $$(wildcard $$($1_OBJECT_DIR)/*$(OBJ_SUFFIX))
287214501Srpaulo  # Now we have a list of all c/c++ files to compile: $$($1_SRCS)
288214501Srpaulo  # and we have a list of all existing object files: $$($1_BINS)
289214501Srpaulo
290214501Srpaulo  # Prepend the source/bin path to the filter expressions. Then do the filtering.
291214501Srpaulo  ifneq ($$($1_INCLUDES),)
292214501Srpaulo    $1_SRC_INCLUDES := $$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$(addsuffix /%,$$($1_INCLUDES))))
293252726Srpaulo    $1_SRCS := $$(filter $$($1_SRC_INCLUDES),$$($1_SRCS))
294214501Srpaulo  endif
295337817Scy  ifneq ($$($1_EXCLUDES),)
296281806Srpaulo    $1_SRC_EXCLUDES := $$(addsuffix /%,$$($1_EXCLUDES))
297214501Srpaulo    $1_SRC_EXCLUDES += $$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$(addsuffix /%,$$($1_EXCLUDES))))
298214501Srpaulo    $1_SRCS := $$(filter-out $$($1_SRC_EXCLUDES),$$($1_SRCS))
299214501Srpaulo  endif
300214501Srpaulo
301252726Srpaulo  # Calculate the expected output from compiling the sources (sort to remove duplicates. Also provides
302252726Srpaulo  # a reproducable order on the input files to the linker).
303252726Srpaulo  $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))))))))
304351611Scy  # Are there too many object files on disk? Perhaps because some source file was removed?
305252726Srpaulo  $1_SUPERFLOUS_OBJS:=$$(sort $$(filter-out $$($1_EXPECTED_OBJS),$$($1_BINS)))
306252726Srpaulo  # Clean out the superfluous object files.
307252726Srpaulo  ifneq ($$($1_SUPERFLUOUS_OBJS),)
308337817Scy    $$(shell $(RM) -f $$($1_SUPERFLUOUS_OBJS))
309252726Srpaulo  endif
310252726Srpaulo
311252726Srpaulo  # Pickup extra OPENJDK_TARGET_OS_API and/or OPENJDK_TARGET_OS dependent variables for CFLAGS.
312214501Srpaulo  $1_EXTRA_CFLAGS:=$$($1_CFLAGS_$(OPENJDK_TARGET_OS_API)) $$($1_CFLAGS_$(OPENJDK_TARGET_OS))
313214501Srpaulo  ifneq ($(DEBUG_LEVEL),release)
314214501Srpaulo    # Pickup extra debug dependent variables for CFLAGS
315214501Srpaulo    $1_EXTRA_CFLAGS+=$$($1_CFLAGS_debug)
316214501Srpaulo    $1_EXTRA_CFLAGS+=$$($1_CFLAGS_$(OPENJDK_TARGET_OS_API)_debug)
317214501Srpaulo    $1_EXTRA_CFLAGS+=$$($1_CFLAGS_$(OPENJDK_TARGET_OS)_debug)
318214501Srpaulo  else
319214501Srpaulo    $1_EXTRA_CFLAGS+=$$($1_CFLAGS_release)
320214501Srpaulo    $1_EXTRA_CFLAGS+=$$($1_CFLAGS_$(OPENJDK_TARGET_OS_API)_release)
321214501Srpaulo    $1_EXTRA_CFLAGS+=$$($1_CFLAGS_$(OPENJDK_TARGET_OS)_release)
322214501Srpaulo  endif
323214501Srpaulo
324214501Srpaulo  # Pickup extra OPENJDK_TARGET_OS_API and/or OPENJDK_TARGET_OS dependent variables for CXXFLAGS.
325281806Srpaulo  $1_EXTRA_CXXFLAGS:=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS_API)) $$($1_CXXFLAGS_$(OPENJDK_TARGET_OS))
326281806Srpaulo  ifneq ($(DEBUG_LEVEL),release)
327214501Srpaulo    # Pickup extra debug dependent variables for CXXFLAGS
328214501Srpaulo    $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_debug)
329214501Srpaulo    $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS_API)_debug)
330214501Srpaulo    $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS)_debug)
331214501Srpaulo  else
332346981Scy    $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_release)
333214501Srpaulo    $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS_API)_release)
334214501Srpaulo    $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS)_release)
335214501Srpaulo  endif
336214501Srpaulo
337214501Srpaulo  ifneq (,$$($1_DEBUG_SYMBOLS))
338214501Srpaulo    ifeq ($(ENABLE_DEBUG_SYMBOLS), true)
339214501Srpaulo      ifdef OPENJDK
340214501Srpaulo        # Always add debug symbols
341214501Srpaulo        $1_EXTRA_CFLAGS+=$(CFLAGS_DEBUG_SYMBOLS)
342252726Srpaulo        $1_EXTRA_CXXFLAGS+=$(CXXFLAGS_DEBUG_SYMBOLS)
343281806Srpaulo      else
344214501Srpaulo        # Programs don't get the debug symbols added in the old build. It's not clear if
345214501Srpaulo        # this is intentional.
346214501Srpaulo        ifeq ($$($1_PROGRAM),)
347214501Srpaulo          $1_EXTRA_CFLAGS+=$(CFLAGS_DEBUG_SYMBOLS)
348214501Srpaulo          $1_EXTRA_CXXFLAGS+=$(CXXFLAGS_DEBUG_SYMBOLS)
349214501Srpaulo        endif
350214501Srpaulo      endif
351214501Srpaulo    endif
352281806Srpaulo  endif
353214501Srpaulo
354214501Srpaulo  ifeq ($$($1_CXXFLAGS),)
355214501Srpaulo    $1_CXXFLAGS:=$$($1_CFLAGS)
356214501Srpaulo  endif
357214501Srpaulo  ifeq ($$(strip $$($1_EXTRA_CXXFLAGS)),)
358346981Scy    $1_EXTRA_CXXFLAGS:=$$($1_EXTRA_CFLAGS)
359346981Scy  endif
360346981Scy
361252726Srpaulo  ifneq (,$$($1_REORDER))
362252726Srpaulo    $1_EXTRA_CFLAGS += $$(C_FLAG_REORDER)
363252726Srpaulo    $1_EXTRA_CXXFLAGS += $$(CXX_FLAG_REORDER)
364252726Srpaulo  endif
365252726Srpaulo
366214501Srpaulo  ifeq (NONE, $$($1_OPTIMIZATION))
367346981Scy    $1_EXTRA_CFLAGS += $(C_O_FLAG_NONE)
368214501Srpaulo    $1_EXTRA_CXXFLAGS += $(CXX_O_FLAG_NONE)
369214501Srpaulo  else ifeq (LOW, $$($1_OPTIMIZATION))
370346981Scy    $1_EXTRA_CFLAGS += $(C_O_FLAG_NORM)
371214501Srpaulo    $1_EXTRA_CXXFLAGS += $(CXX_O_FLAG_NORM)
372214501Srpaulo  else ifeq (HIGH, $$($1_OPTIMIZATION))
373214501Srpaulo    $1_EXTRA_CFLAGS += $(C_O_FLAG_HI)
374346981Scy    $1_EXTRA_CXXFLAGS += $(CXX_O_FLAG_HI)
375346981Scy  else ifeq (HIGHEST, $$($1_OPTIMIZATION))
376346981Scy    $1_EXTRA_CFLAGS += $(C_O_FLAG_HIGHEST)
377214501Srpaulo    $1_EXTRA_CXXFLAGS += $(CXX_O_FLAG_HIGHEST)
378214501Srpaulo  else ifneq (, $$($1_OPTIMIZATION))
379214501Srpaulo    $$(error Unknown value for OPTIMIZATION: $$($1_OPTIMIZATION))
380214501Srpaulo  endif
381346981Scy
382214501Srpaulo  # Add sys root specific cflags last
383214501Srpaulo  $1_EXTRA_CFLAGS += $(SYSROOT_CFLAGS)
384214501Srpaulo  $1_EXTRA_CXXFLAGS += $(SYSROOT_CFLAGS)
385346981Scy
386346981Scy  # Now call add_native_source for each source file we are going to compile.
387346981Scy  $$(foreach p,$$($1_SRCS), \
388346981Scy      $$(eval $$(call add_native_source,$1,$$p,$$($1_OBJECT_DIR), \
389346981Scy          $$($1_CFLAGS) $$($1_EXTRA_CFLAGS),$$($1_CC), \
390214501Srpaulo          $$($1_CXXFLAGS) $$($1_EXTRA_CXXFLAGS),$(CXX),$$($1_ASFLAGS))))
391214501Srpaulo
392214501Srpaulo  # On windows we need to create a resource file
393214501Srpaulo  ifeq ($(OPENJDK_TARGET_OS), windows)
394252726Srpaulo    ifneq (,$$($1_VERSIONINFO_RESOURCE))
395346981Scy      $1_RES:=$$($1_OBJECT_DIR)/$$($1_BASENAME).res
396346981Scy      $$($1_RES): $$($1_VERSIONINFO_RESOURCE)
397346981Scy		$(RC) $$($1_RC_FLAGS) $(CC_OUT_OPTION)$$@ $$($1_VERSIONINFO_RESOURCE)
398214501Srpaulo    endif
399214501Srpaulo    ifneq (,$$($1_MANIFEST))
400214501Srpaulo      $1_GEN_MANIFEST:=$$($1_OBJECT_DIR)/$$($1_PROGRAM).manifest
401214501Srpaulo      IMVERSIONVALUE:=$(JDK_MINOR_VERSION).$(JDK_MICRO_VERSION).$(JDK_UPDATE_VERSION).$(COOKED_BUILD_NUMBER)
402214501Srpaulo      $$($1_GEN_MANIFEST): $$($1_MANIFEST)
403214501Srpaulo		$(SED) 's%IMVERSION%$$(IMVERSIONVALUE)%g;s%PROGRAM%$$($1_PROGRAM)%g' $$< > $$@
404214501Srpaulo    endif
405214501Srpaulo  endif
406214501Srpaulo
407351611Scy  # mapfile doesnt seem to be implemented on macosx (yet??)
408214501Srpaulo  ifneq ($(OPENJDK_TARGET_OS),macosx)
409351611Scy    ifneq ($(OPENJDK_TARGET_OS),windows)
410214501Srpaulo      $1_REAL_MAPFILE:=$$($1_MAPFILE)
411351611Scy      ifneq (,$$($1_REORDER))
412346981Scy        $1_REAL_MAPFILE:=$$($1_OBJECT_DIR)/mapfile
413214501Srpaulo
414346981Scy        $$($1_REAL_MAPFILE) : $$($1_MAPFILE) $$($1_REORDER)
415346981Scy		$$(MKDIR) -p $$(@D)
416289549Srpaulo		$$(CP) $$($1_MAPFILE) $$@.tmp
417346981Scy		$$(SED) -e 's=OUTPUTDIR=$$($1_OBJECT_DIR)=' $$($1_REORDER) >> $$@.tmp
418281806Srpaulo		$$(MV) $$@.tmp $$@
419337817Scy      endif
420214501Srpaulo    endif
421281806Srpaulo  endif
422346981Scy
423214501Srpaulo  # Pickup extra OPENJDK_TARGET_OS_API and/or OPENJDK_TARGET_OS dependent variables
424214501Srpaulo  # for LDFLAGS and LDFLAGS_SUFFIX
425214501Srpaulo  $1_EXTRA_LDFLAGS:=$$($1_LDFLAGS_$(OPENJDK_TARGET_OS_API)) $$($1_LDFLAGS_$(OPENJDK_TARGET_OS))
426214501Srpaulo  $1_EXTRA_LDFLAGS_SUFFIX:=$$($1_LDFLAGS_SUFFIX_$(OPENJDK_TARGET_OS_API)) $$($1_LDFLAGS_SUFFIX_$(OPENJDK_TARGET_OS))
427214501Srpaulo  ifneq (,$$($1_REAL_MAPFILE))
428214501Srpaulo    $1_EXTRA_LDFLAGS += $(call SET_SHARED_LIBRARY_MAPFILE,$$($1_REAL_MAPFILE))
429214501Srpaulo  endif
430351611Scy
431351611Scy  $1_EXTRA_LDFLAGS += $(SYSROOT_LDFLAGS)
432214501Srpaulo
433351611Scy  # Need to make sure TARGET is first on list
434214501Srpaulo  $1 := $$($1_TARGET)
435252726Srpaulo  ifeq ($$($1_STATIC_LIBRARY),)
436252726Srpaulo    ifneq ($$($1_DEBUG_SYMBOLS),)
437214501Srpaulo      ifeq ($(ENABLE_DEBUG_SYMBOLS), true)
438214501Srpaulo        ifneq ($(OPENJDK_TARGET_OS), macosx) # no MacOS X support yet
439214501Srpaulo          ifneq ($$($1_OUTPUT_DIR),$$($1_OBJECT_DIR))
440281806Srpaulo            # The dependency on TARGET is needed on windows for debuginfo files
441214501Srpaulo            # to be rebuilt properly.
442214501Srpaulo            $$($1_OUTPUT_DIR)/% : $$($1_OBJECT_DIR)/% $$($1_TARGET)
443214501Srpaulo		$(CP) $$< $$@
444214501Srpaulo          endif
445214501Srpaulo
446214501Srpaulo          # Generate debuginfo files.
447214501Srpaulo          ifeq ($(OPENJDK_TARGET_OS), windows)
448214501Srpaulo            $1_EXTRA_LDFLAGS += "-pdb:$$($1_OBJECT_DIR)/$$($1_NOSUFFIX).pdb" \
449214501Srpaulo                "-map:$$($1_OBJECT_DIR)/$$($1_NOSUFFIX).map"
450337817Scy            $1_DEBUGINFO_FILES := $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).pdb \
451214501Srpaulo                $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).map
452214501Srpaulo
453214501Srpaulo          else ifeq ($(OPENJDK_TARGET_OS), solaris)
454214501Srpaulo            $1_DEBUGINFO_FILES := $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).debuginfo
455281806Srpaulo            # Setup the command line creating debuginfo files, to be run after linking.
456214501Srpaulo            # It cannot be run separately since it updates the original target file
457214501Srpaulo            #
458214501Srpaulo            # gobjcopy crashes on "empty" section headers with the SHF_ALLOC flag set.
459214501Srpaulo            # Use $(FIX_EMPTY_SEC_HDR_FLAGS) to clear the SHF_ALLOC flag (if set) from
460214501Srpaulo            # empty section headers until a fixed $(OBJCOPY) is available.
461214501Srpaulo            # An empty section header has sh_addr == 0 and sh_size == 0.
462214501Srpaulo            # This problem has only been seen on Solaris X64, but we call this tool
463214501Srpaulo            # on all Solaris builds just in case.
464214501Srpaulo            #
465214501Srpaulo            # $(OBJCOPY) --add-gnu-debuglink=... corrupts SUNW_* sections.
466252726Srpaulo            # Use $(ADD_GNU_DEBUGLINK) until a fixed $(OBJCOPY) is available.
467214501Srpaulo            $1_CREATE_DEBUGINFO_CMDS := \
468214501Srpaulo                $(FIX_EMPTY_SEC_HDR_FLAGS) $(LOG_INFO) $$($1_TARGET) $$(NEWLINE) \
469214501Srpaulo                $(OBJCOPY) --only-keep-debug $$($1_TARGET) $$($1_DEBUGINFO_FILES) $$(NEWLINE) \
470214501Srpaulo                $(CD) $$($1_OUTPUT_DIR) && \
471281806Srpaulo                    $(ADD_GNU_DEBUGLINK) $(LOG_INFO) $$($1_DEBUGINFO_FILES) $$($1_TARGET)
472214501Srpaulo            $1_DEBUGINFO_EXTRA_DEPS := $(FIX_EMPTY_SEC_HDR_FLAGS) $(ADD_GNU_DEBUGLINK)
473214501Srpaulo
474214501Srpaulo          else ifeq ($(OPENJDK_TARGET_OS), linux)
475214501Srpaulo            $1_DEBUGINFO_FILES := $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).debuginfo
476214501Srpaulo            # Setup the command line creating debuginfo files, to be run after linking.
477214501Srpaulo            # It cannot be run separately since it updates the original target file
478214501Srpaulo            $1_CREATE_DEBUGINFO_CMDS := \
479214501Srpaulo                $(OBJCOPY) --only-keep-debug $$($1_TARGET) $$($1_DEBUGINFO_FILES) $$(NEWLINE) \
480252726Srpaulo                $(CD) $$($1_OUTPUT_DIR) && \
481214501Srpaulo                    $(OBJCOPY) --add-gnu-debuglink=$$($1_DEBUGINFO_FILES) $$($1_TARGET)
482214501Srpaulo
483214501Srpaulo          endif # No MacOS X support
484214501Srpaulo
485214501Srpaulo          # This dependency dance ensures that debug info files get rebuilt
486214501Srpaulo          # properly if deleted.
487214501Srpaulo          $$($1_TARGET): $$($1_DEBUGINFO_FILES)
488346981Scy          $$($1_DEBUGINFO_FILES): $$($1_EXPECTED_OBJS)
489281806Srpaulo
490214501Srpaulo          ifeq ($(ZIP_DEBUGINFO_FILES), true)
491214501Srpaulo            $1_DEBUGINFO_ZIP := $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).diz
492346981Scy            $1 += $$(subst $$($1_OBJECT_DIR),$$($1_OUTPUT_DIR),$$($1_DEBUGINFO_ZIP))
493214501Srpaulo
494214501Srpaulo            # The dependency on TARGET is needed for debuginfo files
495214501Srpaulo            # to be rebuilt properly.
496214501Srpaulo            $$($1_DEBUGINFO_ZIP): $$($1_DEBUGINFO_FILES) $$($1_TARGET)
497214501Srpaulo		$(CD) $$($1_OBJECT_DIR) \
498214501Srpaulo		&& $(ZIP) -q $$@ $$(notdir $$($1_DEBUGINFO_FILES))
499252726Srpaulo
500281806Srpaulo          else
501252726Srpaulo            $1 += $$(subst $$($1_OBJECT_DIR),$$($1_OUTPUT_DIR),$$($1_DEBUGINFO_FILES))
502252726Srpaulo          endif
503252726Srpaulo        endif
504252726Srpaulo      endif # !MacOS X
505214501Srpaulo    endif # $1_DEBUG_SYMBOLS
506252726Srpaulo  endif # !STATIC_LIBRARY
507281806Srpaulo
508252726Srpaulo  ifneq (,$$($1_LIBRARY))
509252726Srpaulo    # Generating a dynamic library.
510252726Srpaulo    $1_EXTRA_LDFLAGS += $$(call SET_SHARED_LIBRARY_NAME,$$($1_BASENAME))
511252726Srpaulo    ifeq ($(OPENJDK_TARGET_OS), windows)
512252726Srpaulo      $1_EXTRA_LDFLAGS += "-implib:$$($1_OBJECT_DIR)/$$($1_LIBRARY).lib"
513252726Srpaulo    endif
514252726Srpaulo
515281806Srpaulo    $1_EXTRA_LDFLAGS_SUFFIX += $(GLOBAL_LDFLAGS_SUFFIX)
516281806Srpaulo
517281806Srpaulo    $$($1_TARGET): $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_REAL_MAPFILE) \
518281806Srpaulo        $$($1_DEBUGINFO_EXTRA_DEPS)
519281806Srpaulo		$$(call LINKING_MSG,$$($1_BASENAME))
520281806Srpaulo		$$($1_LD) $$($1_LDFLAGS) $$($1_EXTRA_LDFLAGS) $(LD_OUT_OPTION)$$@ \
521252726Srpaulo		    $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_LDFLAGS_SUFFIX) \
522252726Srpaulo		    $$($1_EXTRA_LDFLAGS_SUFFIX)
523252726Srpaulo		$$($1_CREATE_DEBUGINFO_CMDS)
524252726Srpaulo                # Touch target to make sure it has a later time stamp than the debug
525252726Srpaulo                # symbol files to avoid unnecessary relinking on rebuild.
526252726Srpaulo                ifeq ($(OPENJDK_TARGET_OS), windows)
527252726Srpaulo		  $(TOUCH) $$@
528252726Srpaulo                endif
529252726Srpaulo
530252726Srpaulo  endif
531252726Srpaulo
532252726Srpaulo  ifneq (,$$($1_STATIC_LIBRARY))
533252726Srpaulo    # Generating a static library, ie object file archive.
534252726Srpaulo    $$($1_TARGET): $$($1_EXPECTED_OBJS) $$($1_RES)
535346981Scy	$$(call ARCHIVING_MSG,$$($1_LIBRARY))
536252726Srpaulo	$(AR) $$($1_ARFLAGS) $(AR_OUT_OPTION)$$($1_TARGET) $$($1_EXPECTED_OBJS) \
537252726Srpaulo	    $$($1_RES) $$($1_LDFLAGS_SUFFIX) $$($1_EXTRA_LDFLAGS_SUFFIX)
538252726Srpaulo  endif
539252726Srpaulo
540252726Srpaulo  ifneq (,$$($1_PROGRAM))
541252726Srpaulo    # A executable binary has been specified, setup the target for it.
542252726Srpaulo    $1_EXTRA_LDFLAGS_SUFFIX += $(GLOBAL_LDFLAGS_SUFFIX)
543252726Srpaulo
544252726Srpaulo    $$($1_TARGET): $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_GEN_MANIFEST) \
545252726Srpaulo        $$($1_DEBUGINFO_EXTRA_DEPS)
546252726Srpaulo		$$(call LINKING_EXE_MSG,$$($1_BASENAME))
547252726Srpaulo		$$($1_LDEXE) $$($1_LDFLAGS) $$($1_EXTRA_LDFLAGS) $(EXE_OUT_OPTION)$$($1_TARGET) \
548252726Srpaulo		    $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_LDFLAGS_SUFFIX) \
549252726Srpaulo		    $$($1_EXTRA_LDFLAGS_SUFFIX)
550252726Srpaulo                ifneq (,$$($1_GEN_MANIFEST))
551252726Srpaulo		  $(MT) -nologo -manifest $$($1_GEN_MANIFEST) -outputresource:$$@;#1
552252726Srpaulo                endif
553252726Srpaulo                # This only works if the openjdk_codesign identity is present on the system. Let
554252726Srpaulo                # silently fail otherwise.
555252726Srpaulo                ifneq (,$(CODESIGN))
556252726Srpaulo                  ifneq (,$$($1_CODESIGN))
557252726Srpaulo		    $(CODESIGN) -s openjdk_codesign $$@
558346981Scy                  endif
559346981Scy                endif
560346981Scy		$$($1_CREATE_DEBUGINFO_CMDS)
561346981Scy                # Touch target to make sure it has a later time stamp than the debug
562252726Srpaulo                # symbol files to avoid unnecessary relinking on rebuild.
563252726Srpaulo                ifeq ($(OPENJDK_TARGET_OS), windows)
564252726Srpaulo		  $(TOUCH) $$@
565252726Srpaulo                endif
566252726Srpaulo
567252726Srpaulo  endif
568252726Srpauloendef
569252726Srpaulo
570252726Srpauloendif # _NATIVE_COMPILATION_GMK
571252726Srpaulo