NativeCompilation.gmk revision 952:8c50ba0ba497
1168404Spjd#
2168404Spjd# Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
3168404Spjd# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4168404Spjd#
5168404Spjd# This code is free software; you can redistribute it and/or modify it
6168404Spjd# under the terms of the GNU General Public License version 2 only, as
7168404Spjd# published by the Free Software Foundation.  Oracle designates this
8168404Spjd# particular file as subject to the "Classpath" exception as provided
9168404Spjd# by Oracle in the LICENSE file that accompanied this code.
10168404Spjd#
11168404Spjd# This code is distributed in the hope that it will be useful, but WITHOUT
12168404Spjd# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13168404Spjd# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14168404Spjd# version 2 for more details (a copy is included in the LICENSE file that
15168404Spjd# accompanied this code).
16168404Spjd#
17168404Spjd# You should have received a copy of the GNU General Public License version
18168404Spjd# 2 along with this work; if not, write to the Free Software Foundation,
19168404Spjd# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20168404Spjd#
21168404Spjd# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22219089Spjd# or visit www.oracle.com if you need additional information or have any
23221263Smm# questions.
24286708Smav#
25264835Sdelphij
26235222Smm# When you read this source. Remember that $(sort ...) has the side effect
27272810Sdelphij# of removing duplicates. It is actually this side effect that is
28296516Smav# desired whenever sort is used below!
29296519Smav
30221263Smmifeq (,$(_MAKEBASE_GMK))
31168404Spjd  $(error You must include MakeBase.gmk prior to including NativeCompilation.gmk)
32168404Spjdendif
33168404Spjd
34168404Spjdifeq ($(COMPILER_TYPE),CC)
35168404Spjd  COMPILING_MSG=echo $(LOG_INFO) "Compiling $(notdir $1) (for $(notdir $2))"
36168404Spjd  LINKING_MSG=echo $(LOG_INFO) "Linking $1"
37168404Spjd  LINKING_EXE_MSG=echo $(LOG_INFO) "Linking executable $1"
38168404Spjd  ARCHIVING_MSG=echo $(LOG_INFO) "Archiving $1"
39168404Spjdelse
40168404Spjd  COMPILING_MSG=
41168404Spjd  LINKING_MSG=
42219089Spjd  LINKING_EXE_MSG=
43168404Spjd  ARCHIVING_MSG=
44168404Spjdendif
45168404Spjd
46168404Spjddefine add_native_source
47168404Spjd  # param 1 = BUILD_MYPACKAGE
48219089Spjd  # parma 2 = the source file name (..../alfa.c or .../beta.cpp)
49219089Spjd  # param 3 = the bin dir that stores all .o (.obj) and .d files.
50219089Spjd  # param 4 = the c flags to the compiler
51219089Spjd  # param 5 = the c compiler
52219089Spjd  # param 6 = the c++ flags to the compiler
53248571Smm  # param 7 = the c++ compiler
54248571Smm  # param 8 = the flags to the assembler
55268075Sdelphij
56260183Sdelphij  ifneq (,$$(filter %.c,$2))
57268075Sdelphij    # Compile as a C file
58286705Smav    $1_$2_FLAGS=$4 $$($1_$(notdir $2)_CFLAGS) -DTHIS_FILE='"$$(<F)"' -c
59168404Spjd    $1_$2_COMP=$5
60268075Sdelphij    $1_$2_DEP_FLAG:=$(C_FLAG_DEPS)
61268075Sdelphij  else ifneq (,$$(filter %.m,$2))
62268075Sdelphij    # Compile as a objective-c file
63268075Sdelphij    $1_$2_FLAGS=-x objective-c $4 $$($1_$(notdir $2)_CFLAGS) -DTHIS_FILE='"$$(<F)"' -c
64268075Sdelphij    $1_$2_COMP=$5
65228103Smm    $1_$2_DEP_FLAG:=$(C_FLAG_DEPS)
66228103Smm  else ifneq (,$$(filter %.s,$2))
67286705Smav    # Compile as assembler file
68286705Smav    $1_$2_FLAGS=$8 -DTHIS_FILE='"$$(<F)"'
69296516Smav    $1_$2_COMP=$(AS)
70296516Smav    $1_$2_DEP_FLAG:=
71228103Smm  else
72296516Smav    # Compile as a C++ file
73296516Smav    $1_$2_FLAGS=$6 $$($1_$(notdir $2)_CXXFLAGS) -DTHIS_FILE='"$$(<F)"' -c
74296516Smav    $1_$2_COMP=$7
75296516Smav    $1_$2_DEP_FLAG:=$(CXX_FLAG_DEPS)
76185029Spjd  endif
77289362Smav  # Generate the .o (.obj) file name and place it in the bin dir.
78185029Spjd  $1_$2_OBJ:=$3/$$(patsubst %.cpp,%$(OBJ_SUFFIX),$$(patsubst %.c,%$(OBJ_SUFFIX),$$(patsubst %.m,%$(OBJ_SUFFIX),$$(patsubst %.s,%$(OBJ_SUFFIX),$$(notdir $2)))))
79286705Smav  # Only continue if this object file hasn't been processed already. This lets the first found
80286705Smav  # source file override any other with the same name.
81286705Smav  ifeq (,$$(findstring $$($1_$2_OBJ),$$($1_OBJS_SO_FAR)))
82286705Smav    $1_OBJS_SO_FAR+=$$($1_$2_OBJ)
83289362Smav    ifeq (,$$(filter %.s,$2))
84289362Smav      # And this is the dependency file for this obj file.
85286705Smav      $1_$2_DEP:=$$(patsubst %$(OBJ_SUFFIX),%.d,$$($1_$2_OBJ))
86286705Smav      # Include previously generated dependency information. (if it exists)
87286705Smav      -include $$($1_$2_DEP)
88286705Smav
89286705Smav      ifeq ($(COMPILER_TYPE),CL)
90286705Smav        $1_$2_DEBUG_OUT_FLAGS:=-Fd$$(patsubst %$(OBJ_SUFFIX),%.pdb,$$($1_$2_OBJ)) \
91286705Smav            -Fm$$(patsubst %$(OBJ_SUFFIX),%.map,$$($1_$2_OBJ))
92289362Smav      endif
93286705Smav    endif
94286705Smav
95286705Smav    $$($1_$2_OBJ) : $2
96286705Smav        ifeq ($(COMPILER_TYPE),CC)
97286705Smav	  $$(call COMPILING_MSG,$2,$$($1_TARGET))
98286705Smav          # The Sun studio compiler doesn't output the full path to the object file in the
99286705Smav          # generated deps files. Fixing it with sed. If compiling assembly, don't try this.
100286705Smav          ifeq ($(COMPILER_NAME)$$(filter %.s,$2),ossc)
101286705Smav	    $$($1_$2_COMP) $$($1_$2_FLAGS) $$($1_$2_DEP_FLAG) $$($1_$2_DEP).tmp $(CC_OUT_OPTION)$$($1_$2_OBJ) $2
102286705Smav	    $(SED) 's|^$$(@F):|$$@:|' $$($1_$2_DEP).tmp > $$($1_$2_DEP)
103286705Smav          else
104168404Spjd	    $$($1_$2_COMP) $$($1_$2_FLAGS) $$($1_$2_DEP_FLAG) $$($1_$2_DEP) $(CC_OUT_OPTION)$$($1_$2_OBJ) $2
105235222Smm          endif
106168404Spjd        endif
107289362Smav        # The Visual Studio compiler lacks a feature for generating make dependencies, but by
108168404Spjd        # setting -showIncludes, all included files are printed. These are filtered out and
109168404Spjd        # parsed into make dependences.
110297509Smav        ifeq ($(COMPILER_TYPE),CL)
111297509Smav	  ($$($1_$2_COMP) $$($1_$2_FLAGS) -showIncludes $$($1_$2_DEBUG_OUT_FLAGS) \
112297509Smav	      $(CC_OUT_OPTION)$$($1_$2_OBJ) $2 ; echo $$$$? > $$($1_$2_DEP).exitvalue) \
113297509Smav	      | $(TEE) $$($1_$2_DEP).raw | $(GREP) -v "^Note: including file:" \
114297509Smav	      && exit `cat $$($1_$2_DEP).exitvalue`
115297509Smav	  $(RM) $$($1_$2_DEP).exitvalue
116297509Smav	  ($(ECHO) $$@: \\ \
117297509Smav	  && $(SED) -e '/^Note: including file:/!d' \
118297509Smav	      -e 's|Note: including file: *||' \
119297509Smav	      -e 's|\\|/|g' \
120297509Smav	      -e 's|^\([a-zA-Z]\):|/cygdrive/\1|g' \
121297509Smav	      -e '/$(subst /,\/,$(TOPDIR))/!d' \
122297509Smav	      -e 's|$$$$| \\|g' \
123240415Smm	      $$($1_$2_DEP).raw) > $$($1_$2_DEP)
124168404Spjd        endif
125168404Spjd  endif
126168404Spjdendef
127168404Spjd
128168404Spjddefine SetupNativeCompilation
129168404Spjd  # param 1 is for example BUILD_MYPACKAGE
130169170Spjd  # param 2,3,4,5,6,7,8 are named args.
131168404Spjd  #   SRC one or more directory roots to scan for C/C++ files.
132168404Spjd  #   LANG C or C++
133235222Smm  #   CFLAGS the compiler flags to be used, used both for C and C++.
134168404Spjd  #   CXXFLAGS the compiler flags to be used for c++, if set overrides CFLAGS.
135235222Smm  #   LDFLAGS the linker flags to be used, used both for C and C++.
136168404Spjd  #   LDFLAGS_SUFFIX the linker flags to be added last on the commandline
137235222Smm  #       typically the libraries linked to.
138235222Smm  #   ARFLAGS the archiver flags to be used
139168404Spjd  #   OBJECT_DIR the directory where we store the object files
140168404Spjd  #   LIBRARY the resulting library file
141235222Smm  #   PROGRAM the resulting exec file
142168404Spjd  #   INCLUDES only pick source from these directories
143235222Smm  #   EXCLUDES do not pick source from these directories
144235222Smm  #   INCLUDE_FILES only compile exactly these files!
145235222Smm  #   EXCLUDE_FILES with these names
146235222Smm  #   VERSIONINFO_RESOURCE Input file for RC. Setting this implies that RC will be run
147235222Smm  #   RC_FLAGS flags for RC.
148168404Spjd  #   MAPFILE mapfile
149168404Spjd  #   REORDER reorder file
150286587Smav  #   DEBUG_SYMBOLS add debug symbols (if configured on)
151286587Smav  #   CC the compiler to use, default is $(CC)
152286587Smav  #   LDEXE the linker to use for linking executables, default is $(LDEXE)
153286587Smav  #   OPTIMIZATION sets optimization level to NONE, LOW, HIGH, HIGHEST
154286587Smav  $(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))
155168404Spjd  $(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))
156286587Smav  $(if $(27),$(error Internal makefile error: Too many arguments to SetupNativeCompilation, please update NativeCompilation.gmk))
157286587Smav
158286587Smav  ifneq (,$$($1_BIN))
159286587Smav    $$(error BIN has been replaced with OBJECT_DIR)
160286587Smav  endif
161286587Smav
162286587Smav  ifneq (,$$($1_LIB))
163307284Smav    $$(error LIB has been replaced with LIBRARY)
164307284Smav  endif
165307284Smav
166286587Smav  ifneq (,$$($1_EXE))
167286587Smav    $$(error EXE has been replaced with PROGRAM)
168286587Smav  endif
169286587Smav
170307284Smav  ifneq (,$$($1_LIBRARY))
171307284Smav    ifeq (,$$($1_OUTPUT_DIR))
172307284Smav      $$(error LIBRARY requires OUTPUT_DIR)
173286587Smav    endif
174286587Smav
175286587Smav    ifneq ($$($1_LIBRARY),$(basename $$($1_LIBRARY)))
176286587Smav      $$(error directory of LIBRARY should be specified using OUTPUT_DIR)
177286587Smav    endif
178286587Smav
179286587Smav    ifneq (,$(findstring $(SHARED_LIBRARY_SUFFIX),$$($1_LIBRARY)))
180286587Smav      $$(error LIBRARY should be specified without SHARED_LIBRARY_SUFFIX: $(SHARED_LIBRARY_SUFFIX))
181286587Smav    endif
182286587Smav
183286587Smav    ifneq (,$(findstring $(LIBRARY_PREFIX),$$($1_LIBRARY)))
184286587Smav      $$(error LIBRARY should be specified without LIBRARY_PREFIX: $(LIBRARY_PREFIX))
185286587Smav    endif
186286587Smav
187294815Smav    $1_BASENAME:=$(LIBRARY_PREFIX)$$($1_LIBRARY)$(SHARED_LIBRARY_SUFFIX)
188294815Smav    $1_TARGET:=$$($1_OUTPUT_DIR)/$$($1_BASENAME)
189294815Smav    $1_NOSUFFIX:=$(LIBRARY_PREFIX)$$($1_LIBRARY)
190294815Smav  endif
191294815Smav
192294815Smav  ifneq (,$$($1_STATIC_LIBRARY))
193294815Smav    ifeq (,$$($1_OUTPUT_DIR))
194294815Smav      $$(error STATIC_LIBRARY requires OUTPUT_DIR)
195286587Smav    endif
196235222Smm
197168404Spjd    ifneq ($$($1_STATIC_LIBRARY),$(basename $$($1_STATIC_LIBRARY)))
198168404Spjd      $$(error directory of STATIC_LIBRARY should be specified using OUTPUT_DIR)
199235222Smm    endif
200219089Spjd
201253821Sdelphij    ifneq (,$(findstring $(STATIC_LIBRARY_SUFFIX),$$($1_STATIC_LIBRARY)))
202253821Sdelphij      $$(error STATIC_LIBRARY should be specified without STATIC_LIBRARY_SUFFIX: $(STATIC_LIBRARY_SUFFIX))
203253821Sdelphij    endif
204253821Sdelphij
205253821Sdelphij    ifneq (,$(findstring $(LIBRARY_PREFIX),$$($1_STATIC_LIBRARY)))
206289362Smav      $$(error STATIC_LIBRARY should be specified without LIBRARY_PREFIX: $(LIBRARY_PREFIX))
207253821Sdelphij    endif
208253821Sdelphij
209253821Sdelphij    $1_BASENAME:=$(LIBRARY_PREFIX)$$($1_STATIC_LIBRARY)$(STATIC_LIBRARY_SUFFIX)
210253821Sdelphij    $1_TARGET:=$$($1_OUTPUT_DIR)/$$($1_BASENAME)
211253821Sdelphij    $1_NOSUFFIX:=$(LIBRARY_PREFIX)$$($1_STATIC_LIBRARY)
212253821Sdelphij  endif
213253821Sdelphij
214253821Sdelphij  ifneq (,$$($1_PROGRAM))
215253821Sdelphij    ifeq (,$$($1_OUTPUT_DIR))
216253821Sdelphij      $$(error PROGRAM requires OUTPUT_DIR)
217253821Sdelphij    endif
218237458Smm
219237458Smm    ifneq ($$($1_PROGRAM),$(basename $$($1_PROGRAM)))
220237458Smm      $$(error directory of PROGRAM should be specified using OUTPUT_DIR)
221219089Spjd    endif
222219089Spjd
223219089Spjd    ifneq (,$(findstring $(EXE_SUFFIX),$$($1_PROGRAM)))
224219089Spjd      $$(error PROGRAM should be specified without EXE_SUFFIX: $(EXE_SUFFIX))
225219089Spjd    endif
226219089Spjd
227219089Spjd    $1_BASENAME:=$$($1_PROGRAM)$(EXE_SUFFIX)
228235222Smm    $1_TARGET:=$$($1_OUTPUT_DIR)/$$($1_BASENAME)
229235222Smm    $1_NOSUFFIX:=$$($1_PROGRAM)
230286587Smav  endif
231249195Smm
232235222Smm  ifeq (,$$($1_TARGET))
233219089Spjd    $$(error Neither PROGRAM, LIBRARY nor STATIC_LIBRARY has been specified for SetupNativeCompilation)
234219089Spjd  endif
235235222Smm
236219089Spjd  ifeq (,$$($1_LANG))
237219089Spjd    $$(error You have to specify LANG for native compilation $1)
238219089Spjd  endif
239219089Spjd  ifeq (C,$$($1_LANG))
240219089Spjd    ifeq ($$($1_LDEXE),)
241219089Spjd      $1_LDEXE:=$(LDEXE)
242219089Spjd    endif
243219089Spjd    $1_LD:=$(LD)
244219089Spjd  else
245219089Spjd    ifeq (C++,$$($1_LANG))
246219089Spjd      $1_LD:=$(LDCXX)
247219089Spjd      $1_LDEXE:=$(LDEXECXX)
248219089Spjd    else
249219089Spjd      $$(error Unknown native language $$($1_LANG) for $1)
250219089Spjd    endif
251219089Spjd  endif
252219089Spjd
253286587Smav  ifeq ($$($1_CC),)
254249195Smm    $1_CC:=$(CC)
255235222Smm  endif
256219089Spjd
257219089Spjd  # Make sure the dirs exist.
258219089Spjd  $$(eval $$(call MakeDir,$$($1_OBJECT_DIR) $$($1_OUTPUT_DIR)))
259235222Smm  $$(foreach d,$$($1_SRC), $$(if $$(wildcard $$d),,$$(error SRC specified to SetupNativeCompilation $1 contains missing directory $$d)))
260235222Smm
261219089Spjd  # Find all files in the source trees. Sort to remove duplicates.
262219089Spjd  $1_ALL_SRCS := $$(sort $$(call CacheFind,$$($1_SRC)))
263219089Spjd  # Extract the C/C++ files.
264235222Smm  $1_EXCLUDE_FILES:=$$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$($1_EXCLUDE_FILES)))
265219089Spjd  $1_INCLUDE_FILES:=$$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$($1_INCLUDE_FILES)))
266286587Smav  ifneq ($$($1_EXCLUDE_FILES),)
267249195Smm    $1_EXCLUDE_FILES:=$$(addprefix %,$$($1_EXCLUDE_FILES))
268219089Spjd  endif
269235222Smm  $1_SRCS := $$(filter-out $$($1_EXCLUDE_FILES),$$(filter %.s %.c %.cpp %.m,$$($1_ALL_SRCS)))
270219089Spjd  ifneq (,$$(strip $$($1_INCLUDE_FILES)))
271168404Spjd    $1_SRCS := $$(filter $$($1_INCLUDE_FILES),$$($1_SRCS))
272168404Spjd  endif
273168404Spjd  ifeq (,$$($1_SRCS))
274168404Spjd    $$(error No sources found for $1 when looking inside the dirs $$($1_SRC))
275168404Spjd  endif
276268075Sdelphij  # There can be only a single bin dir root, no need to foreach over the roots.
277219089Spjd  $1_BINS := $$(wildcard $$($1_OBJECT_DIR)/*$(OBJ_SUFFIX))
278168404Spjd  # Now we have a list of all c/c++ files to compile: $$($1_SRCS)
279235222Smm  # and we have a list of all existing object files: $$($1_BINS)
280219089Spjd
281253821Sdelphij  # Prepend the source/bin path to the filter expressions. Then do the filtering.
282253821Sdelphij  ifneq ($$($1_INCLUDES),)
283253821Sdelphij    $1_SRC_INCLUDES := $$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$(addsuffix /%,$$($1_INCLUDES))))
284253821Sdelphij    $1_SRCS := $$(filter $$($1_SRC_INCLUDES),$$($1_SRCS))
285253821Sdelphij  endif
286253821Sdelphij  ifneq ($$($1_EXCLUDES),)
287253821Sdelphij    $1_SRC_EXCLUDES := $$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$(addsuffix /%,$$($1_EXCLUDES))))
288253821Sdelphij    $1_SRCS := $$(filter-out $$($1_SRC_EXCLUDES),$$($1_SRCS))
289253821Sdelphij  endif
290219089Spjd
291219089Spjd  # Calculate the expected output from compiling the sources (sort to remove duplicates. Also provides
292219089Spjd  # a reproducable order on the input files to the linker).
293219089Spjd  $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))))))))
294219089Spjd  # Are there too many object files on disk? Perhaps because some source file was removed?
295219089Spjd  $1_SUPERFLOUS_OBJS:=$$(sort $$(filter-out $$($1_EXPECTED_OBJS),$$($1_BINS)))
296219089Spjd  # Clean out the superfluous object files.
297235222Smm  ifneq ($$($1_SUPERFLUOUS_OBJS),)
298286587Smav    $$(shell $(RM) -f $$($1_SUPERFLUOUS_OBJS))
299249195Smm  endif
300235222Smm
301219089Spjd  # Pickup extra OPENJDK_TARGET_OS_API and/or OPENJDK_TARGET_OS dependent variables for CFLAGS.
302286587Smav  $1_EXTRA_CFLAGS:=$$($1_CFLAGS_$(OPENJDK_TARGET_OS_API)) $$($1_CFLAGS_$(OPENJDK_TARGET_OS))
303235222Smm  ifneq ($(DEBUG_LEVEL),release)
304235222Smm    # Pickup extra debug dependent variables for CFLAGS
305219089Spjd    $1_EXTRA_CFLAGS+=$$($1_CFLAGS_debug)
306219089Spjd    $1_EXTRA_CFLAGS+=$$($1_CFLAGS_$(OPENJDK_TARGET_OS_API)_debug)
307219089Spjd    $1_EXTRA_CFLAGS+=$$($1_CFLAGS_$(OPENJDK_TARGET_OS)_debug)
308219089Spjd  else
309235222Smm    $1_EXTRA_CFLAGS+=$$($1_CFLAGS_release)
310274337Sdelphij    $1_EXTRA_CFLAGS+=$$($1_CFLAGS_$(OPENJDK_TARGET_OS_API)_release)
311268075Sdelphij    $1_EXTRA_CFLAGS+=$$($1_CFLAGS_$(OPENJDK_TARGET_OS)_release)
312274337Sdelphij  endif
313274337Sdelphij
314274337Sdelphij  # Pickup extra OPENJDK_TARGET_OS_API and/or OPENJDK_TARGET_OS dependent variables for CXXFLAGS.
315274337Sdelphij  $1_EXTRA_CXXFLAGS:=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS_API)) $$($1_CXXFLAGS_$(OPENJDK_TARGET_OS))
316268075Sdelphij  ifneq ($(DEBUG_LEVEL),release)
317268075Sdelphij    # Pickup extra debug dependent variables for CXXFLAGS
318268075Sdelphij    $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_debug)
319268075Sdelphij    $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS_API)_debug)
320289422Smav    $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS)_debug)
321289422Smav  else
322268075Sdelphij    $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_release)
323268075Sdelphij    $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS_API)_release)
324268075Sdelphij    $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS)_release)
325268075Sdelphij  endif
326268075Sdelphij
327268075Sdelphij  ifneq (,$$($1_DEBUG_SYMBOLS))
328168404Spjd    ifeq ($(ENABLE_DEBUG_SYMBOLS), true)
329286587Smav      ifdef OPENJDK
330249195Smm        # Always add debug symbols
331219089Spjd        $1_EXTRA_CFLAGS+=$(CFLAGS_DEBUG_SYMBOLS)
332219089Spjd        $1_EXTRA_CXXFLAGS+=$(CXXFLAGS_DEBUG_SYMBOLS)
333219089Spjd      else
334219089Spjd        # Programs don't get the debug symbols added in the old build. It's not clear if
335268075Sdelphij        # this is intentional.
336268075Sdelphij        ifeq ($$($1_PROGRAM),)
337268075Sdelphij          $1_EXTRA_CFLAGS+=$(CFLAGS_DEBUG_SYMBOLS)
338268075Sdelphij          $1_EXTRA_CXXFLAGS+=$(CXXFLAGS_DEBUG_SYMBOLS)
339268075Sdelphij        endif
340268075Sdelphij      endif
341268075Sdelphij    endif
342268075Sdelphij  endif
343286587Smav
344268075Sdelphij  ifeq ($$($1_CXXFLAGS),)
345268075Sdelphij    $1_CXXFLAGS:=$$($1_CFLAGS)
346268075Sdelphij  endif
347268075Sdelphij  ifeq ($$(strip $$($1_EXTRA_CXXFLAGS)),)
348268075Sdelphij    $1_EXTRA_CXXFLAGS:=$$($1_EXTRA_CFLAGS)
349268075Sdelphij  endif
350268075Sdelphij
351268075Sdelphij  ifneq (,$$($1_REORDER))
352268075Sdelphij    $1_EXTRA_CFLAGS += $$(C_FLAG_REORDER)
353268075Sdelphij    $1_EXTRA_CXXFLAGS += $$(CXX_FLAG_REORDER)
354268075Sdelphij  endif
355268075Sdelphij
356268075Sdelphij  ifeq (NONE, $$($1_OPTIMIZATION))
357268075Sdelphij    $1_EXTRA_CFLAGS += $(C_O_FLAG_NONE)
358268075Sdelphij    $1_EXTRA_CXXFLAGS += $(CXX_O_FLAG_NONE)
359268075Sdelphij  else ifeq (LOW, $$($1_OPTIMIZATION))
360268075Sdelphij    $1_EXTRA_CFLAGS += $(C_O_FLAG_NORM)
361268075Sdelphij    $1_EXTRA_CXXFLAGS += $(CXX_O_FLAG_NORM)
362268075Sdelphij  else ifeq (HIGH, $$($1_OPTIMIZATION))
363286587Smav    $1_EXTRA_CFLAGS += $(C_O_FLAG_HI)
364268075Sdelphij    $1_EXTRA_CXXFLAGS += $(CXX_O_FLAG_HI)
365268075Sdelphij  else ifeq (HIGHEST, $$($1_OPTIMIZATION))
366268075Sdelphij    $1_EXTRA_CFLAGS += $(C_O_FLAG_HIGHEST)
367268075Sdelphij    $1_EXTRA_CXXFLAGS += $(CXX_O_FLAG_HIGHEST)
368268075Sdelphij  else ifneq (, $$($1_OPTIMIZATION))
369235222Smm    $$(error Unknown value for OPTIMIZATION: $$($1_OPTIMIZATION))
370219089Spjd  endif
371235222Smm
372219089Spjd  # Now call add_native_source for each source file we are going to compile.
373235222Smm  $$(foreach p,$$($1_SRCS), \
374286587Smav      $$(eval $$(call add_native_source,$1,$$p,$$($1_OBJECT_DIR), \
375249195Smm          $$($1_CFLAGS) $$($1_EXTRA_CFLAGS),$$($1_CC), \
376235222Smm          $$($1_CXXFLAGS) $$($1_EXTRA_CXXFLAGS),$(CXX),$$($1_ASFLAGS))))
377219089Spjd
378219089Spjd  # On windows we need to create a resource file
379219089Spjd  ifeq ($(OPENJDK_TARGET_OS), windows)
380235222Smm    ifneq (,$$($1_VERSIONINFO_RESOURCE))
381235222Smm      $1_RES:=$$($1_OBJECT_DIR)/$$($1_BASENAME).res
382219089Spjd      $$($1_RES): $$($1_VERSIONINFO_RESOURCE)
383219089Spjd		$(RC) $$($1_RC_FLAGS) $(CC_OUT_OPTION)$$@ $$($1_VERSIONINFO_RESOURCE)
384235222Smm    endif
385219089Spjd    ifneq (,$$($1_MANIFEST))
386286587Smav      $1_GEN_MANIFEST:=$$($1_OBJECT_DIR)/$$($1_PROGRAM).manifest
387249195Smm      IMVERSIONVALUE:=$(JDK_MINOR_VERSION).$(JDK_MICRO_VERSION).$(JDK_UPDATE_VERSION).$(COOKED_BUILD_NUMBER)
388168404Spjd      $$($1_GEN_MANIFEST): $$($1_MANIFEST)
389168404Spjd		$(SED) 's%IMVERSION%$$(IMVERSIONVALUE)%g;s%PROGRAM%$$($1_PROGRAM)%g' $$< > $$@
390168404Spjd    endif
391168404Spjd  endif
392235222Smm
393168404Spjd  # mapfile doesnt seem to be implemented on macosx (yet??)
394235222Smm  ifneq ($(OPENJDK_TARGET_OS),macosx)
395219089Spjd    ifneq ($(OPENJDK_TARGET_OS),windows)
396219089Spjd      $1_REAL_MAPFILE:=$$($1_MAPFILE)
397219089Spjd      ifneq (,$$($1_REORDER))
398219089Spjd        $1_REAL_MAPFILE:=$$($1_OBJECT_DIR)/mapfile
399219089Spjd
400219089Spjd        $$($1_REAL_MAPFILE) : $$($1_MAPFILE) $$($1_REORDER)
401219089Spjd		$$(MKDIR) -p $$(@D)
402219089Spjd		$$(CP) $$($1_MAPFILE) $$@.tmp
403235222Smm		$$(SED) -e 's=OUTPUTDIR=$$($1_OBJECT_DIR)=' $$($1_REORDER) >> $$@.tmp
404235222Smm		$$(MV) $$@.tmp $$@
405286587Smav      endif
406249195Smm    endif
407235222Smm  endif
408219089Spjd
409235222Smm  # Pickup extra OPENJDK_TARGET_OS_API and/or OPENJDK_TARGET_OS dependent variables
410219089Spjd  # for LDFLAGS and LDFLAGS_SUFFIX
411219089Spjd  $1_EXTRA_LDFLAGS:=$$($1_LDFLAGS_$(OPENJDK_TARGET_OS_API)) $$($1_LDFLAGS_$(OPENJDK_TARGET_OS))
412219089Spjd  $1_EXTRA_LDFLAGS_SUFFIX:=$$($1_LDFLAGS_SUFFIX_$(OPENJDK_TARGET_OS_API)) $$($1_LDFLAGS_SUFFIX_$(OPENJDK_TARGET_OS))
413219089Spjd  ifneq (,$$($1_REAL_MAPFILE))
414219089Spjd    $1_EXTRA_LDFLAGS += $(call SET_SHARED_LIBRARY_MAPFILE,$$($1_REAL_MAPFILE))
415219089Spjd  endif
416219089Spjd
417219089Spjd  # Need to make sure TARGET is first on list
418219089Spjd  $1 := $$($1_TARGET)
419286587Smav  ifeq ($$($1_STATIC_LIBRARY),)
420249195Smm    ifneq ($$($1_DEBUG_SYMBOLS),)
421235222Smm      ifeq ($(ENABLE_DEBUG_SYMBOLS), true)
422219089Spjd        ifneq ($(OPENJDK_TARGET_OS), macosx) # no MacOS X support yet
423219089Spjd          ifneq ($$($1_OUTPUT_DIR),$$($1_OBJECT_DIR))
424219089Spjd            # The dependency on TARGET is needed on windows for debuginfo files
425168404Spjd            # to be rebuilt properly.
426235222Smm            $$($1_OUTPUT_DIR)/% : $$($1_OBJECT_DIR)/% $$($1_TARGET)
427235222Smm		$(CP) $$< $$@
428219089Spjd          endif
429219089Spjd
430235222Smm          # Generate debuginfo files.
431168404Spjd          ifeq ($(OPENJDK_TARGET_OS), windows)
432235222Smm            $1_EXTRA_LDFLAGS += "-pdb:$$($1_OBJECT_DIR)/$$($1_NOSUFFIX).pdb" \
433219089Spjd                "-map:$$($1_OBJECT_DIR)/$$($1_NOSUFFIX).map"
434168404Spjd            $1_DEBUGINFO_FILES := $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).pdb \
435168404Spjd                $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).map
436168404Spjd
437168404Spjd            # This dependency dance ensures that windows debug info files get rebuilt
438235222Smm            # properly if deleted.
439168404Spjd            $$($1_TARGET): $$($1_DEBUGINFO_FILES)
440235222Smm            $$($1_DEBUGINFO_FILES): $$($1_EXPECTED_OBJS)
441219089Spjd
442289362Smav          else ifeq ($(OPENJDK_TARGET_OS), solaris)
443289362Smav            $1_DEBUGINFO_FILES := $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).debuginfo
444289362Smav            # gobjcopy crashes on "empty" section headers with the SHF_ALLOC flag set.
445289362Smav            # Use $(FIX_EMPTY_SEC_HDR_FLAGS) to clear the SHF_ALLOC flag (if set) from
446289362Smav            # empty section headers until a fixed $(OBJCOPY) is available.
447289362Smav            # An empty section header has sh_addr == 0 and sh_size == 0.
448289362Smav            # This problem has only been seen on Solaris X64, but we call this tool
449289362Smav            # on all Solaris builds just in case.
450289362Smav            #
451289362Smav            # $(OBJCOPY) --add-gnu-debuglink=... corrupts SUNW_* sections.
452289362Smav            # Use $(ADD_GNU_DEBUGLINK) until a fixed $(OBJCOPY) is available.
453289362Smav            $$($1_DEBUGINFO_FILES): $$($1_TARGET) \
454289362Smav                $(FIX_EMPTY_SEC_HDR_FLAGS) $(ADD_GNU_DEBUGLINK)
455168404Spjd			$(RM) $$@
456235222Smm			$(FIX_EMPTY_SEC_HDR_FLAGS) $(LOG_INFO) $$<
457168404Spjd			$(OBJCOPY) --only-keep-debug $$< $$@
458235222Smm			$(CD) $$(@D) && $(ADD_GNU_DEBUGLINK) $(LOG_INFO) $$(@F) $$<
459286587Smav			$(TOUCH) $$@
460249195Smm
461235222Smm          else ifeq ($(OPENJDK_TARGET_OS), linux)
462219089Spjd            $1_DEBUGINFO_FILES := $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).debuginfo
463219089Spjd            $$($1_DEBUGINFO_FILES): $$($1_TARGET)
464168404Spjd			$(RM) $$@
465235222Smm			$(OBJCOPY) --only-keep-debug $$< $$@
466235222Smm			$(CD) $$(@D) && $(OBJCOPY) --add-gnu-debuglink=$$(@F) $$<
467219089Spjd			$(TOUCH) $$@
468219089Spjd
469219089Spjd          endif # No MacOS X support
470219089Spjd
471219089Spjd          ifeq ($(ZIP_DEBUGINFO_FILES), true)
472219089Spjd            $1_DEBUGINFO_ZIP := $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).diz
473219089Spjd            $1 += $$(subst $$($1_OBJECT_DIR),$$($1_OUTPUT_DIR),$$($1_DEBUGINFO_ZIP))
474235222Smm
475168404Spjd            # The dependency on TARGET is needed on windows for debuginfo files
476274337Sdelphij            # to be rebuilt properly.
477274337Sdelphij            $$($1_DEBUGINFO_ZIP): $$($1_DEBUGINFO_FILES) $$($1_TARGET)
478274337Sdelphij		$(CD) $$($1_OBJECT_DIR) \
479274337Sdelphij		&& $(ZIP) -q $$@ $$($1_DEBUGINFO_FILES)
480286587Smav
481286587Smav          else
482249195Smm            $1 += $$(subst $$($1_OBJECT_DIR),$$($1_OUTPUT_DIR),$$($1_DEBUGINFO_FILES))
483286587Smav          endif
484168404Spjd        endif
485253821Sdelphij      endif # !MacOS X
486235222Smm    endif # $1_DEBUG_SYMBOLS
487253821Sdelphij  endif # !STATIC_LIBRARY
488249195Smm
489248571Smm  ifneq (,$$($1_LIBRARY))
490249195Smm    # Generating a dynamic library.
491168404Spjd    $1_EXTRA_LDFLAGS+=$$(call SET_SHARED_LIBRARY_NAME,$$($1_BASENAME))
492168404Spjd    ifeq ($(OPENJDK_TARGET_OS), windows)
493168404Spjd      $1_EXTRA_LDFLAGS+="-implib:$$($1_OBJECT_DIR)/$$($1_LIBRARY).lib"
494268075Sdelphij    endif
495268075Sdelphij
496268075Sdelphij    $1_EXTRA_LDFLAGS_SUFFIX += $(GLOBAL_LDFLAGS_SUFFIX)
497268075Sdelphij
498268075Sdelphij    $$($1_TARGET) : $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_REAL_MAPFILE)
499268075Sdelphij	$$(call LINKING_MSG,$$($1_BASENAME))
500268075Sdelphij	$$($1_LD) $$($1_LDFLAGS) $$($1_EXTRA_LDFLAGS) $(LD_OUT_OPTION)$$@ \
501268075Sdelphij	$$($1_EXPECTED_OBJS) $$($1_RES) $$($1_LDFLAGS_SUFFIX) \
502268075Sdelphij	$$($1_EXTRA_LDFLAGS_SUFFIX)
503268075Sdelphij        # Touch target to make sure it has a later time stamp than the debug
504268075Sdelphij        # symbol files to avoid unnecessary relinking on rebuild.
505268075Sdelphij        ifeq ($(OPENJDK_TARGET_OS), windows)
506268075Sdelphij	  $(TOUCH) $$@
507268075Sdelphij        endif
508268075Sdelphij
509268075Sdelphij  endif
510268075Sdelphij
511268075Sdelphij  ifneq (,$$($1_STATIC_LIBRARY))
512268075Sdelphij    # Generating a static library, ie object file archive.
513268075Sdelphij    $$($1_TARGET) : $$($1_EXPECTED_OBJS) $$($1_RES)
514268075Sdelphij	$$(call ARCHIVING_MSG,$$($1_LIBRARY))
515268075Sdelphij	$(AR) $$($1_ARFLAGS) $(AR_OUT_OPTION)$$($1_TARGET) $$($1_EXPECTED_OBJS) \
516268075Sdelphij	    $$($1_RES) $$($1_LDFLAGS_SUFFIX) $$($1_EXTRA_LDFLAGS_SUFFIX)
517268075Sdelphij  endif
518268075Sdelphij
519268075Sdelphij  ifneq (,$$($1_PROGRAM))
520268075Sdelphij    # A executable binary has been specified, setup the target for it.
521286705Smav    $1_EXTRA_LDFLAGS_SUFFIX += $(GLOBAL_LDFLAGS_SUFFIX)
522286705Smav
523286705Smav    $$($1_TARGET) : $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_GEN_MANIFEST)
524286705Smav	$$(call LINKING_EXE_MSG,$$($1_BASENAME))
525286705Smav	$$($1_LDEXE) $$($1_LDFLAGS) $$($1_EXTRA_LDFLAGS) $(EXE_OUT_OPTION)$$($1_TARGET) \
526286705Smav	$$($1_EXPECTED_OBJS) $$($1_RES) $$($1_LDFLAGS_SUFFIX) \
527286705Smav	$$($1_EXTRA_LDFLAGS_SUFFIX)
528286705Smav        ifneq (,$$($1_GEN_MANIFEST))
529286705Smav	  $(MT) -nologo -manifest $$($1_GEN_MANIFEST) -outputresource:$$@;#1
530286705Smav        endif
531286705Smav        # This only works if the openjdk_codesign identity is present on the system. Let
532286705Smav        # silently fail otherwise.
533286705Smav        ifneq (,$(CODESIGN))
534168404Spjd          ifneq (,$$($1_CODESIGN))
535289362Smav	    $(CODESIGN) -s openjdk_codesign $$@
536289362Smav          endif
537289362Smav        endif
538286705Smav        # Touch target to make sure it has a later time stamp than the debug
539286705Smav        # symbol files to avoid unnecessary relinking on rebuild.
540286705Smav        ifeq ($(OPENJDK_TARGET_OS), windows)
541286705Smav	  $(TOUCH) $$@
542286705Smav        endif
543286705Smav
544286705Smav  endif
545286705Smavendef
546286705Smav