NativeCompilation.gmk revision 1125:13255d60e919
175353Smjacob# 2139749Simp# Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. 375353Smjacob# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 475353Smjacob# 575353Smjacob# This code is free software; you can redistribute it and/or modify it 675353Smjacob# under the terms of the GNU General Public License version 2 only, as 775353Smjacob# published by the Free Software Foundation. Oracle designates this 875353Smjacob# particular file as subject to the "Classpath" exception as provided 975353Smjacob# by Oracle in the LICENSE file that accompanied this code. 1075353Smjacob# 1175353Smjacob# This code is distributed in the hope that it will be useful, but WITHOUT 1275353Smjacob# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1375353Smjacob# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1475353Smjacob# version 2 for more details (a copy is included in the LICENSE file that 1575353Smjacob# accompanied this code). 1675353Smjacob# 1775353Smjacob# You should have received a copy of the GNU General Public License version 1875353Smjacob# 2 along with this work; if not, write to the Free Software Foundation, 1975353Smjacob# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2075353Smjacob# 2175353Smjacob# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2275353Smjacob# or visit www.oracle.com if you need additional information or have any 2375353Smjacob# questions. 2475353Smjacob# 2575353Smjacob 2675353Smjacob# When you read this source. Remember that $(sort ...) has the side effect 2775353Smjacob# of removing duplicates. It is actually this side effect that is 2875353Smjacob# desired whenever sort is used below! 29220938Smarius 3075353Smjacobifndef _NATIVE_COMPILATION_GMK 3175353Smjacob_NATIVE_COMPILATION_GMK := 1 3275353Smjacob 33139749Simpifeq (,$(_MAKEBASE_GMK)) 3475353Smjacob $(error You must include MakeBase.gmk prior to including NativeCompilation.gmk) 3575353Smjacobendif 3675353Smjacob 3775353Smjacobifneq ($(TOOLCHAIN_TYPE), microsoft) 3875353Smjacob COMPILING_MSG=echo $(LOG_INFO) "Compiling $(notdir $1) (for $(notdir $2))" 3975353Smjacob LINKING_MSG=echo $(LOG_INFO) "Linking $1" 4075353Smjacob LINKING_EXE_MSG=echo $(LOG_INFO) "Linking executable $1" 4175353Smjacob ARCHIVING_MSG=echo $(LOG_INFO) "Archiving $1" 4275353Smjacobelse 4375353Smjacob COMPILING_MSG= 4475353Smjacob LINKING_MSG= 4575353Smjacob LINKING_EXE_MSG= 4675353Smjacob ARCHIVING_MSG= 4775353Smjacobendif 4875353Smjacob 4975353Smjacobifeq ($(OPENJDK_BUILD_OS_ENV), windows.cygwin) 5075353Smjacob UNIX_PATH_PREFIX := /cygdrive 5175353Smjacobelse ifeq ($(OPENJDK_BUILD_OS_ENV), windows.msys) 5275353Smjacob UNIX_PATH_PREFIX := 5375353Smjacobendif 5475353Smjacob 5575353Smjacobdefine add_native_source 5675353Smjacob # param 1 = BUILD_MYPACKAGE 5775353Smjacob # parma 2 = the source file name (..../alfa.c or .../beta.cpp) 5875353Smjacob # param 3 = the bin dir that stores all .o (.obj) and .d files. 5975353Smjacob # param 4 = the c flags to the compiler 6075353Smjacob # param 5 = the c compiler 6175353Smjacob # param 6 = the c++ flags to the compiler 6275353Smjacob # param 7 = the c++ compiler 6375353Smjacob # param 8 = the flags to the assembler 6475353Smjacob 6575353Smjacob ifneq (,$$(filter %.c,$2)) 6675353Smjacob # Compile as a C file 6775353Smjacob $1_$2_FLAGS=$4 $$($1_$(notdir $2)_CFLAGS) -DTHIS_FILE='"$$(<F)"' -c 6875353Smjacob $1_$2_COMP=$5 6975353Smjacob $1_$2_DEP_FLAG:=$(C_FLAG_DEPS) 7075353Smjacob else ifneq (,$$(filter %.m,$2)) 7175353Smjacob # Compile as a objective-c file 7275353Smjacob $1_$2_FLAGS=-x objective-c $4 $$($1_$(notdir $2)_CFLAGS) -DTHIS_FILE='"$$(<F)"' -c 7375353Smjacob $1_$2_COMP=$5 7475353Smjacob $1_$2_DEP_FLAG:=$(C_FLAG_DEPS) 7575353Smjacob else ifneq (,$$(filter %.s,$2)) 7675353Smjacob # Compile as assembler file 7775353Smjacob $1_$2_FLAGS=$8 -DTHIS_FILE='"$$(<F)"' 7875353Smjacob $1_$2_COMP=$(AS) 7975353Smjacob $1_$2_DEP_FLAG:= 8075353Smjacob else 8175353Smjacob # Compile as a C++ file 8275353Smjacob $1_$2_FLAGS=$6 $$($1_$(notdir $2)_CXXFLAGS) -DTHIS_FILE='"$$(<F)"' -c 8375353Smjacob $1_$2_COMP=$7 8475353Smjacob $1_$2_DEP_FLAG:=$(CXX_FLAG_DEPS) 8575353Smjacob endif 8675353Smjacob # Generate the .o (.obj) file name and place it in the bin dir. 8775353Smjacob $1_$2_OBJ:=$3/$$(patsubst %.cpp,%$(OBJ_SUFFIX),$$(patsubst %.c,%$(OBJ_SUFFIX),$$(patsubst %.m,%$(OBJ_SUFFIX),$$(patsubst %.s,%$(OBJ_SUFFIX),$$(notdir $2))))) 8875353Smjacob # Only continue if this object file hasn't been processed already. This lets the first found 8975353Smjacob # source file override any other with the same name. 9075353Smjacob ifeq (,$$(findstring $$($1_$2_OBJ),$$($1_OBJS_SO_FAR))) 9175353Smjacob $1_OBJS_SO_FAR+=$$($1_$2_OBJ) 9275353Smjacob ifeq (,$$(filter %.s,$2)) 9375353Smjacob # And this is the dependency file for this obj file. 9475353Smjacob $1_$2_DEP:=$$(patsubst %$(OBJ_SUFFIX),%.d,$$($1_$2_OBJ)) 9575353Smjacob # Include previously generated dependency information. (if it exists) 9675353Smjacob -include $$($1_$2_DEP) 9775353Smjacob 9875353Smjacob ifeq ($(TOOLCHAIN_TYPE), microsoft) 9975353Smjacob $1_$2_DEBUG_OUT_FLAGS:=-Fd$$(patsubst %$(OBJ_SUFFIX),%.pdb,$$($1_$2_OBJ)) \ 10075353Smjacob -Fm$$(patsubst %$(OBJ_SUFFIX),%.map,$$($1_$2_OBJ)) 10175353Smjacob endif 10275353Smjacob endif 10375353Smjacob 10475353Smjacob $$($1_$2_OBJ) : $2 10575353Smjacob ifneq ($(TOOLCHAIN_TYPE), microsoft) 10675353Smjacob $$(call COMPILING_MSG,$2,$$($1_TARGET)) 10775353Smjacob # The Solaris studio compiler doesn't output the full path to the object file in the 10875353Smjacob # generated deps files. Fixing it with sed. If compiling assembly, don't try this. 10975353Smjacob ifeq ($(TOOLCHAIN_TYPE)$$(filter %.s,$2), solstudio) 110120281Swilko $$($1_$2_COMP) $$($1_$2_FLAGS) $$($1_$2_DEP_FLAG) $$($1_$2_DEP).tmp $(CC_OUT_OPTION)$$($1_$2_OBJ) $2 11175353Smjacob $(SED) 's|^$$(@F):|$$@:|' $$($1_$2_DEP).tmp > $$($1_$2_DEP) 11275353Smjacob else 11375353Smjacob $$($1_$2_COMP) $$($1_$2_FLAGS) $$($1_$2_DEP_FLAG) $$($1_$2_DEP) $(CC_OUT_OPTION)$$($1_$2_OBJ) $2 11475353Smjacob endif 11575353Smjacob endif 11675353Smjacob # The Visual Studio compiler lacks a feature for generating make dependencies, but by 11775353Smjacob # setting -showIncludes, all included files are printed. These are filtered out and 11875353Smjacob # parsed into make dependences. 11975353Smjacob ifeq ($(TOOLCHAIN_TYPE), microsoft) 12075353Smjacob ($$($1_$2_COMP) $$($1_$2_FLAGS) -showIncludes $$($1_$2_DEBUG_OUT_FLAGS) \ 12175353Smjacob $(CC_OUT_OPTION)$$($1_$2_OBJ) $2 ; echo $$$$? > $$($1_$2_DEP).exitvalue) \ 12275353Smjacob | $(TEE) $$($1_$2_DEP).raw | $(GREP) -v "^Note: including file:" \ 12375353Smjacob && exit `cat $$($1_$2_DEP).exitvalue` 12475353Smjacob $(RM) $$($1_$2_DEP).exitvalue 12575353Smjacob ($(ECHO) $$@: \\ \ 126120281Swilko && $(SED) -e '/^Note: including file:/!d' \ 127120281Swilko -e 's|Note: including file: *||' \ 128120281Swilko -e 's|\\|/|g' \ 129120281Swilko -e 's|^\([a-zA-Z]\):|$(UNIX_PATH_PREFIX)/\1|g' \ 130120281Swilko -e '/$(subst /,\/,$(TOPDIR))/!d' \ 131120281Swilko -e 's|$$$$| \\|g' \ 132120281Swilko $$($1_$2_DEP).raw) > $$($1_$2_DEP) 133120281Swilko endif 134120281Swilko endif 13575353Smjacobendef 13675353Smjacob 13775353Smjacobdefine SetupNativeCompilation 13875353Smjacob # param 1 is for example BUILD_MYPACKAGE 13975353Smjacob # param 2,3,4,5,6,7,8 are named args. 14075353Smjacob # SRC one or more directory roots to scan for C/C++ files. 14175353Smjacob # LANG C or C++ 14275353Smjacob # CFLAGS the compiler flags to be used, used both for C and C++. 14375353Smjacob # CXXFLAGS the compiler flags to be used for c++, if set overrides CFLAGS. 14475353Smjacob # LDFLAGS the linker flags to be used, used both for C and C++. 14575353Smjacob # LDFLAGS_SUFFIX the linker flags to be added last on the commandline 14675353Smjacob # typically the libraries linked to. 14775353Smjacob # ARFLAGS the archiver flags to be used 148120281Swilko # OBJECT_DIR the directory where we store the object files 149120281Swilko # LIBRARY the resulting library file 150120281Swilko # PROGRAM the resulting exec file 151120281Swilko # INCLUDES only pick source from these directories 152120281Swilko # EXCLUDES do not pick source from these directories 153120281Swilko # INCLUDE_FILES only compile exactly these files! 154120281Swilko # EXCLUDE_FILES with these names 155120281Swilko # VERSIONINFO_RESOURCE Input file for RC. Setting this implies that RC will be run 156120281Swilko # RC_FLAGS flags for RC. 157120281Swilko # MAPFILE mapfile 15875353Smjacob # REORDER reorder file 15975353Smjacob # DEBUG_SYMBOLS add debug symbols (if configured on) 16075353Smjacob # CC the compiler to use, default is $(CC) 16175353Smjacob # LDEXE the linker to use for linking executables, default is $(LDEXE) 16275353Smjacob # OPTIMIZATION sets optimization level to NONE, LOW, HIGH, HIGHEST 16375353Smjacob $(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)) 16475353Smjacob $(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)) 16575353Smjacob $(if $(27),$(error Internal makefile error: Too many arguments to SetupNativeCompilation, please update NativeCompilation.gmk)) 16675353Smjacob 16775353Smjacob ifneq (,$$($1_BIN)) 16875353Smjacob $$(error BIN has been replaced with OBJECT_DIR) 16975353Smjacob endif 17075353Smjacob 17175353Smjacob ifneq (,$$($1_LIB)) 17275353Smjacob $$(error LIB has been replaced with LIBRARY) 17375353Smjacob endif 17475353Smjacob 17575353Smjacob ifneq (,$$($1_EXE)) 17675353Smjacob $$(error EXE has been replaced with PROGRAM) 17775353Smjacob endif 17875353Smjacob 17975353Smjacob ifneq (,$$($1_LIBRARY)) 18075353Smjacob ifeq (,$$($1_OUTPUT_DIR)) 18175353Smjacob $$(error LIBRARY requires OUTPUT_DIR) 18275353Smjacob endif 18375353Smjacob 18475353Smjacob ifneq ($$($1_LIBRARY),$(basename $$($1_LIBRARY))) 18575353Smjacob $$(error directory of LIBRARY should be specified using OUTPUT_DIR) 18675353Smjacob endif 18775353Smjacob 18875353Smjacob ifneq (,$(findstring $(SHARED_LIBRARY_SUFFIX),$$($1_LIBRARY))) 18975353Smjacob $$(error LIBRARY should be specified without SHARED_LIBRARY_SUFFIX: $(SHARED_LIBRARY_SUFFIX)) 19075353Smjacob endif 19175353Smjacob 19275353Smjacob ifneq (,$(findstring $(LIBRARY_PREFIX),$$($1_LIBRARY))) 19375353Smjacob $$(error LIBRARY should be specified without LIBRARY_PREFIX: $(LIBRARY_PREFIX)) 19475353Smjacob endif 19575353Smjacob 19675353Smjacob $1_BASENAME:=$(LIBRARY_PREFIX)$$($1_LIBRARY)$(SHARED_LIBRARY_SUFFIX) 19775353Smjacob $1_TARGET:=$$($1_OUTPUT_DIR)/$$($1_BASENAME) 19875353Smjacob $1_NOSUFFIX:=$(LIBRARY_PREFIX)$$($1_LIBRARY) 19975353Smjacob endif 20075353Smjacob 20175353Smjacob ifneq (,$$($1_STATIC_LIBRARY)) 20275353Smjacob ifeq (,$$($1_OUTPUT_DIR)) 20375353Smjacob $$(error STATIC_LIBRARY requires OUTPUT_DIR) 20475353Smjacob endif 20575353Smjacob 20675353Smjacob ifneq ($$($1_STATIC_LIBRARY),$(basename $$($1_STATIC_LIBRARY))) 20775353Smjacob $$(error directory of STATIC_LIBRARY should be specified using OUTPUT_DIR) 20875353Smjacob endif 20975353Smjacob 21075353Smjacob ifneq (,$(findstring $(STATIC_LIBRARY_SUFFIX),$$($1_STATIC_LIBRARY))) 21175353Smjacob $$(error STATIC_LIBRARY should be specified without STATIC_LIBRARY_SUFFIX: $(STATIC_LIBRARY_SUFFIX)) 21275353Smjacob endif 21375353Smjacob 21475353Smjacob ifneq (,$(findstring $(LIBRARY_PREFIX),$$($1_STATIC_LIBRARY))) 21575353Smjacob $$(error STATIC_LIBRARY should be specified without LIBRARY_PREFIX: $(LIBRARY_PREFIX)) 21675353Smjacob endif 21775353Smjacob 21875353Smjacob $1_BASENAME:=$(LIBRARY_PREFIX)$$($1_STATIC_LIBRARY)$(STATIC_LIBRARY_SUFFIX) 21975353Smjacob $1_TARGET:=$$($1_OUTPUT_DIR)/$$($1_BASENAME) 22075353Smjacob $1_NOSUFFIX:=$(LIBRARY_PREFIX)$$($1_STATIC_LIBRARY) 22175353Smjacob endif 22275353Smjacob 22375353Smjacob ifneq (,$$($1_PROGRAM)) 22475353Smjacob ifeq (,$$($1_OUTPUT_DIR)) 22575353Smjacob $$(error PROGRAM requires OUTPUT_DIR) 22675353Smjacob endif 22775353Smjacob 22875353Smjacob ifneq ($$($1_PROGRAM),$(basename $$($1_PROGRAM))) 22975353Smjacob $$(error directory of PROGRAM should be specified using OUTPUT_DIR) 23075353Smjacob endif 23175353Smjacob 23275353Smjacob ifneq (,$(findstring $(EXE_SUFFIX),$$($1_PROGRAM))) 23375353Smjacob $$(error PROGRAM should be specified without EXE_SUFFIX: $(EXE_SUFFIX)) 23475353Smjacob endif 23575353Smjacob 23675353Smjacob $1_BASENAME:=$$($1_PROGRAM)$(EXE_SUFFIX) 23775353Smjacob $1_TARGET:=$$($1_OUTPUT_DIR)/$$($1_BASENAME) 23875353Smjacob $1_NOSUFFIX:=$$($1_PROGRAM) 239192713Syongari endif 240192713Syongari 241192713Syongari ifeq (,$$($1_TARGET)) 242192713Syongari $$(error Neither PROGRAM, LIBRARY nor STATIC_LIBRARY has been specified for SetupNativeCompilation) 243192713Syongari endif 244192713Syongari 245192713Syongari ifeq (,$$($1_LANG)) 246192713Syongari $$(error You have to specify LANG for native compilation $1) 247192713Syongari endif 248192713Syongari ifeq (C,$$($1_LANG)) 249165097Syongari ifeq ($$($1_LDEXE),) 250165097Syongari $1_LDEXE:=$(LDEXE) 251197590Syongari endif 252197590Syongari $1_LD:=$(LD) 253197590Syongari else 254197590Syongari ifeq (C++,$$($1_LANG)) 255197590Syongari $1_LD:=$(LDCXX) 256165097Syongari $1_LDEXE:=$(LDEXECXX) 257165097Syongari else 258165097Syongari $$(error Unknown native language $$($1_LANG) for $1) 259165097Syongari endif 260165097Syongari endif 261165097Syongari 262173133Syongari ifeq ($$($1_CC),) 263173133Syongari $1_CC:=$(CC) 264193291Syongari endif 265173133Syongari 266173133Syongari # Make sure the dirs exist. 267193291Syongari $$(eval $$(call MakeDir,$$($1_OBJECT_DIR) $$($1_OUTPUT_DIR))) 268193291Syongari $$(foreach d,$$($1_SRC), $$(if $$(wildcard $$d),,$$(error SRC specified to SetupNativeCompilation $1 contains missing directory $$d))) 269193291Syongari 270193291Syongari # Find all files in the source trees. Sort to remove duplicates. 271193291Syongari $1_ALL_SRCS := $$(sort $$(call CacheFind,$$($1_SRC))) 272193291Syongari # Extract the C/C++ files. 273193291Syongari $1_EXCLUDE_FILES:=$$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$($1_EXCLUDE_FILES))) 274193291Syongari $1_INCLUDE_FILES:=$$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$($1_INCLUDE_FILES))) 275193291Syongari ifneq ($$($1_EXCLUDE_FILES),) 276193291Syongari $1_EXCLUDE_FILES:=$$(addprefix %,$$($1_EXCLUDE_FILES)) 27775353Smjacob endif 27875353Smjacob $1_SRCS := $$(filter-out $$($1_EXCLUDE_FILES),$$(filter %.s %.c %.cpp %.m,$$($1_ALL_SRCS))) 27975353Smjacob ifneq (,$$(strip $$($1_INCLUDE_FILES))) 28075353Smjacob $1_SRCS := $$(filter $$($1_INCLUDE_FILES),$$($1_SRCS)) 28175353Smjacob endif 28275353Smjacob ifeq (,$$($1_SRCS)) 28375353Smjacob $$(error No sources found for $1 when looking inside the dirs $$($1_SRC)) 28475353Smjacob endif 28575353Smjacob # There can be only a single bin dir root, no need to foreach over the roots. 28675353Smjacob $1_BINS := $$(wildcard $$($1_OBJECT_DIR)/*$(OBJ_SUFFIX)) 28775353Smjacob # Now we have a list of all c/c++ files to compile: $$($1_SRCS) 28875353Smjacob # and we have a list of all existing object files: $$($1_BINS) 28975353Smjacob 29075353Smjacob # Prepend the source/bin path to the filter expressions. Then do the filtering. 29175353Smjacob ifneq ($$($1_INCLUDES),) 29275353Smjacob $1_SRC_INCLUDES := $$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$(addsuffix /%,$$($1_INCLUDES)))) 29375353Smjacob $1_SRCS := $$(filter $$($1_SRC_INCLUDES),$$($1_SRCS)) 29475353Smjacob endif 29575353Smjacob ifneq ($$($1_EXCLUDES),) 29675353Smjacob $1_SRC_EXCLUDES := $$(addsuffix /%,$$($1_EXCLUDES)) 29775353Smjacob $1_SRC_EXCLUDES += $$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$(addsuffix /%,$$($1_EXCLUDES)))) 29875353Smjacob $1_SRCS := $$(filter-out $$($1_SRC_EXCLUDES),$$($1_SRCS)) 29975353Smjacob endif 30075353Smjacob 30175353Smjacob # Calculate the expected output from compiling the sources (sort to remove duplicates. Also provides 30275353Smjacob # a reproducable order on the input files to the linker). 30375353Smjacob $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)))))))) 304193291Syongari # Are there too many object files on disk? Perhaps because some source file was removed? 305193291Syongari $1_SUPERFLOUS_OBJS:=$$(sort $$(filter-out $$($1_EXPECTED_OBJS),$$($1_BINS))) 306193291Syongari # Clean out the superfluous object files. 307193291Syongari ifneq ($$($1_SUPERFLUOUS_OBJS),) 308193291Syongari $$(shell $(RM) -f $$($1_SUPERFLUOUS_OBJS)) 309193291Syongari endif 310193291Syongari 311193291Syongari # Pickup extra OPENJDK_TARGET_OS_API and/or OPENJDK_TARGET_OS dependent variables for CFLAGS. 312193291Syongari $1_EXTRA_CFLAGS:=$$($1_CFLAGS_$(OPENJDK_TARGET_OS_API)) $$($1_CFLAGS_$(OPENJDK_TARGET_OS)) 313193291Syongari ifneq ($(DEBUG_LEVEL),release) 314193291Syongari # Pickup extra debug dependent variables for CFLAGS 315193291Syongari $1_EXTRA_CFLAGS+=$$($1_CFLAGS_debug) 316193291Syongari $1_EXTRA_CFLAGS+=$$($1_CFLAGS_$(OPENJDK_TARGET_OS_API)_debug) 317193291Syongari $1_EXTRA_CFLAGS+=$$($1_CFLAGS_$(OPENJDK_TARGET_OS)_debug) 318193291Syongari else 319193291Syongari $1_EXTRA_CFLAGS+=$$($1_CFLAGS_release) 320193291Syongari $1_EXTRA_CFLAGS+=$$($1_CFLAGS_$(OPENJDK_TARGET_OS_API)_release) 321193291Syongari $1_EXTRA_CFLAGS+=$$($1_CFLAGS_$(OPENJDK_TARGET_OS)_release) 322193291Syongari endif 323193291Syongari 32475353Smjacob # Pickup extra OPENJDK_TARGET_OS_API and/or OPENJDK_TARGET_OS dependent variables for CXXFLAGS. 32575353Smjacob $1_EXTRA_CXXFLAGS:=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS_API)) $$($1_CXXFLAGS_$(OPENJDK_TARGET_OS)) 32675353Smjacob ifneq ($(DEBUG_LEVEL),release) 32775353Smjacob # Pickup extra debug dependent variables for CXXFLAGS 32875353Smjacob $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_debug) 32975353Smjacob $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS_API)_debug) 33075353Smjacob $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS)_debug) 33175353Smjacob else 33275353Smjacob $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_release) 33375353Smjacob $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS_API)_release) 33475353Smjacob $1_EXTRA_CXXFLAGS+=$$($1_CXXFLAGS_$(OPENJDK_TARGET_OS)_release) 33575353Smjacob endif 33675353Smjacob 33775353Smjacob ifneq (,$$($1_DEBUG_SYMBOLS)) 33875353Smjacob ifeq ($(ENABLE_DEBUG_SYMBOLS), true) 33975353Smjacob ifdef OPENJDK 34075353Smjacob # Always add debug symbols 34175353Smjacob $1_EXTRA_CFLAGS+=$(CFLAGS_DEBUG_SYMBOLS) 34275353Smjacob $1_EXTRA_CXXFLAGS+=$(CXXFLAGS_DEBUG_SYMBOLS) 34375353Smjacob else 34475353Smjacob # Programs don't get the debug symbols added in the old build. It's not clear if 34575353Smjacob # this is intentional. 34675353Smjacob ifeq ($$($1_PROGRAM),) 347165097Syongari $1_EXTRA_CFLAGS+=$(CFLAGS_DEBUG_SYMBOLS) 348165097Syongari $1_EXTRA_CXXFLAGS+=$(CXXFLAGS_DEBUG_SYMBOLS) 34975353Smjacob endif 35075353Smjacob endif 35175353Smjacob endif 35275353Smjacob endif 35375353Smjacob 35475353Smjacob ifeq ($$($1_CXXFLAGS),) 35575353Smjacob $1_CXXFLAGS:=$$($1_CFLAGS) 35675353Smjacob endif 35775353Smjacob ifeq ($$(strip $$($1_EXTRA_CXXFLAGS)),) 35875353Smjacob $1_EXTRA_CXXFLAGS:=$$($1_EXTRA_CFLAGS) 35975353Smjacob endif 36075353Smjacob 36175353Smjacob ifneq (,$$($1_REORDER)) 36275353Smjacob $1_EXTRA_CFLAGS += $$(C_FLAG_REORDER) 36375353Smjacob $1_EXTRA_CXXFLAGS += $$(CXX_FLAG_REORDER) 36475353Smjacob endif 36575353Smjacob 36675353Smjacob ifeq (NONE, $$($1_OPTIMIZATION)) 367120281Swilko $1_EXTRA_CFLAGS += $(C_O_FLAG_NONE) 368120281Swilko $1_EXTRA_CXXFLAGS += $(CXX_O_FLAG_NONE) 369120281Swilko else ifeq (LOW, $$($1_OPTIMIZATION)) 370120281Swilko $1_EXTRA_CFLAGS += $(C_O_FLAG_NORM) 371120281Swilko $1_EXTRA_CXXFLAGS += $(CXX_O_FLAG_NORM) 372120281Swilko else ifeq (HIGH, $$($1_OPTIMIZATION)) 373120281Swilko $1_EXTRA_CFLAGS += $(C_O_FLAG_HI) 374120281Swilko $1_EXTRA_CXXFLAGS += $(CXX_O_FLAG_HI) 375 else ifeq (HIGHEST, $$($1_OPTIMIZATION)) 376 $1_EXTRA_CFLAGS += $(C_O_FLAG_HIGHEST) 377 $1_EXTRA_CXXFLAGS += $(CXX_O_FLAG_HIGHEST) 378 else ifneq (, $$($1_OPTIMIZATION)) 379 $$(error Unknown value for OPTIMIZATION: $$($1_OPTIMIZATION)) 380 endif 381 382 # Add sys root specific cflags last 383 $1_EXTRA_CFLAGS += $(SYSROOT_CFLAGS) 384 $1_EXTRA_CXXFLAGS += $(SYSROOT_CFLAGS) 385 386 # Now call add_native_source for each source file we are going to compile. 387 $$(foreach p,$$($1_SRCS), \ 388 $$(eval $$(call add_native_source,$1,$$p,$$($1_OBJECT_DIR), \ 389 $$($1_CFLAGS) $$($1_EXTRA_CFLAGS),$$($1_CC), \ 390 $$($1_CXXFLAGS) $$($1_EXTRA_CXXFLAGS),$(CXX),$$($1_ASFLAGS)))) 391 392 # On windows we need to create a resource file 393 ifeq ($(OPENJDK_TARGET_OS), windows) 394 ifneq (,$$($1_VERSIONINFO_RESOURCE)) 395 $1_RES:=$$($1_OBJECT_DIR)/$$($1_BASENAME).res 396 $$($1_RES): $$($1_VERSIONINFO_RESOURCE) 397 $(RC) $$($1_RC_FLAGS) $(CC_OUT_OPTION)$$@ $$($1_VERSIONINFO_RESOURCE) 398 endif 399 ifneq (,$$($1_MANIFEST)) 400 $1_GEN_MANIFEST:=$$($1_OBJECT_DIR)/$$($1_PROGRAM).manifest 401 IMVERSIONVALUE:=$(JDK_MINOR_VERSION).$(JDK_MICRO_VERSION).$(JDK_UPDATE_VERSION).$(COOKED_BUILD_NUMBER) 402 $$($1_GEN_MANIFEST): $$($1_MANIFEST) 403 $(SED) 's%IMVERSION%$$(IMVERSIONVALUE)%g;s%PROGRAM%$$($1_PROGRAM)%g' $$< > $$@ 404 endif 405 endif 406 407 # mapfile doesnt seem to be implemented on macosx (yet??) 408 ifneq ($(OPENJDK_TARGET_OS),macosx) 409 ifneq ($(OPENJDK_TARGET_OS),windows) 410 $1_REAL_MAPFILE:=$$($1_MAPFILE) 411 ifneq (,$$($1_REORDER)) 412 $1_REAL_MAPFILE:=$$($1_OBJECT_DIR)/mapfile 413 414 $$($1_REAL_MAPFILE) : $$($1_MAPFILE) $$($1_REORDER) 415 $$(MKDIR) -p $$(@D) 416 $$(CP) $$($1_MAPFILE) $$@.tmp 417 $$(SED) -e 's=OUTPUTDIR=$$($1_OBJECT_DIR)=' $$($1_REORDER) >> $$@.tmp 418 $$(MV) $$@.tmp $$@ 419 endif 420 endif 421 endif 422 423 # Pickup extra OPENJDK_TARGET_OS_API and/or OPENJDK_TARGET_OS dependent variables 424 # for LDFLAGS and LDFLAGS_SUFFIX 425 $1_EXTRA_LDFLAGS:=$$($1_LDFLAGS_$(OPENJDK_TARGET_OS_API)) $$($1_LDFLAGS_$(OPENJDK_TARGET_OS)) 426 $1_EXTRA_LDFLAGS_SUFFIX:=$$($1_LDFLAGS_SUFFIX_$(OPENJDK_TARGET_OS_API)) $$($1_LDFLAGS_SUFFIX_$(OPENJDK_TARGET_OS)) 427 ifneq (,$$($1_REAL_MAPFILE)) 428 $1_EXTRA_LDFLAGS += $(call SET_SHARED_LIBRARY_MAPFILE,$$($1_REAL_MAPFILE)) 429 endif 430 431 $1_EXTRA_LDFLAGS += $(SYSROOT_LDFLAGS) 432 433 # Need to make sure TARGET is first on list 434 $1 := $$($1_TARGET) 435 ifeq ($$($1_STATIC_LIBRARY),) 436 ifneq ($$($1_DEBUG_SYMBOLS),) 437 ifeq ($(ENABLE_DEBUG_SYMBOLS), true) 438 ifneq ($(OPENJDK_TARGET_OS), macosx) # no MacOS X support yet 439 ifneq ($$($1_OUTPUT_DIR),$$($1_OBJECT_DIR)) 440 # The dependency on TARGET is needed on windows for debuginfo files 441 # to be rebuilt properly. 442 $$($1_OUTPUT_DIR)/% : $$($1_OBJECT_DIR)/% $$($1_TARGET) 443 $(CP) $$< $$@ 444 endif 445 446 # Generate debuginfo files. 447 ifeq ($(OPENJDK_TARGET_OS), windows) 448 $1_EXTRA_LDFLAGS += "-pdb:$$($1_OBJECT_DIR)/$$($1_NOSUFFIX).pdb" \ 449 "-map:$$($1_OBJECT_DIR)/$$($1_NOSUFFIX).map" 450 $1_DEBUGINFO_FILES := $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).pdb \ 451 $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).map 452 453 # This dependency dance ensures that windows debug info files get rebuilt 454 # properly if deleted. 455 $$($1_TARGET): $$($1_DEBUGINFO_FILES) 456 $$($1_DEBUGINFO_FILES): $$($1_EXPECTED_OBJS) 457 458 else ifeq ($(OPENJDK_TARGET_OS), solaris) 459 $1_DEBUGINFO_FILES := $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).debuginfo 460 # gobjcopy crashes on "empty" section headers with the SHF_ALLOC flag set. 461 # Use $(FIX_EMPTY_SEC_HDR_FLAGS) to clear the SHF_ALLOC flag (if set) from 462 # empty section headers until a fixed $(OBJCOPY) is available. 463 # An empty section header has sh_addr == 0 and sh_size == 0. 464 # This problem has only been seen on Solaris X64, but we call this tool 465 # on all Solaris builds just in case. 466 # 467 # $(OBJCOPY) --add-gnu-debuglink=... corrupts SUNW_* sections. 468 # Use $(ADD_GNU_DEBUGLINK) until a fixed $(OBJCOPY) is available. 469 $$($1_DEBUGINFO_FILES): $$($1_TARGET) \ 470 $(FIX_EMPTY_SEC_HDR_FLAGS) $(ADD_GNU_DEBUGLINK) 471 $(RM) $$@ 472 $(FIX_EMPTY_SEC_HDR_FLAGS) $(LOG_INFO) $$< 473 $(OBJCOPY) --only-keep-debug $$< $$@ 474 $(CD) $$(@D) && $(ADD_GNU_DEBUGLINK) $(LOG_INFO) $$(@F) $$< 475 $(TOUCH) $$@ 476 477 else ifeq ($(OPENJDK_TARGET_OS), linux) 478 $1_DEBUGINFO_FILES := $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).debuginfo 479 $$($1_DEBUGINFO_FILES): $$($1_TARGET) 480 $(RM) $$@ 481 $(OBJCOPY) --only-keep-debug $$< $$@ 482 $(CD) $$(@D) && $(OBJCOPY) --add-gnu-debuglink=$$(@F) $$< 483 $(TOUCH) $$@ 484 485 endif # No MacOS X support 486 487 ifeq ($(ZIP_DEBUGINFO_FILES), true) 488 $1_DEBUGINFO_ZIP := $$($1_OBJECT_DIR)/$$($1_NOSUFFIX).diz 489 $1 += $$(subst $$($1_OBJECT_DIR),$$($1_OUTPUT_DIR),$$($1_DEBUGINFO_ZIP)) 490 491 # The dependency on TARGET is needed on windows for debuginfo files 492 # to be rebuilt properly. 493 $$($1_DEBUGINFO_ZIP): $$($1_DEBUGINFO_FILES) $$($1_TARGET) 494 $(CD) $$($1_OBJECT_DIR) \ 495 && $(ZIP) -q $$@ $$(notdir $$($1_DEBUGINFO_FILES)) 496 497 else 498 $1 += $$(subst $$($1_OBJECT_DIR),$$($1_OUTPUT_DIR),$$($1_DEBUGINFO_FILES)) 499 endif 500 endif 501 endif # !MacOS X 502 endif # $1_DEBUG_SYMBOLS 503 endif # !STATIC_LIBRARY 504 505 ifneq (,$$($1_LIBRARY)) 506 # Generating a dynamic library. 507 $1_EXTRA_LDFLAGS+=$$(call SET_SHARED_LIBRARY_NAME,$$($1_BASENAME)) 508 ifeq ($(OPENJDK_TARGET_OS), windows) 509 $1_EXTRA_LDFLAGS+="-implib:$$($1_OBJECT_DIR)/$$($1_LIBRARY).lib" 510 endif 511 512 $1_EXTRA_LDFLAGS_SUFFIX += $(GLOBAL_LDFLAGS_SUFFIX) 513 514 $$($1_TARGET) : $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_REAL_MAPFILE) 515 $$(call LINKING_MSG,$$($1_BASENAME)) 516 $$($1_LD) $$($1_LDFLAGS) $$($1_EXTRA_LDFLAGS) $(LD_OUT_OPTION)$$@ \ 517 $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_LDFLAGS_SUFFIX) \ 518 $$($1_EXTRA_LDFLAGS_SUFFIX) 519 # Touch target to make sure it has a later time stamp than the debug 520 # symbol files to avoid unnecessary relinking on rebuild. 521 ifeq ($(OPENJDK_TARGET_OS), windows) 522 $(TOUCH) $$@ 523 endif 524 525 endif 526 527 ifneq (,$$($1_STATIC_LIBRARY)) 528 # Generating a static library, ie object file archive. 529 $$($1_TARGET) : $$($1_EXPECTED_OBJS) $$($1_RES) 530 $$(call ARCHIVING_MSG,$$($1_LIBRARY)) 531 $(AR) $$($1_ARFLAGS) $(AR_OUT_OPTION)$$($1_TARGET) $$($1_EXPECTED_OBJS) \ 532 $$($1_RES) $$($1_LDFLAGS_SUFFIX) $$($1_EXTRA_LDFLAGS_SUFFIX) 533 endif 534 535 ifneq (,$$($1_PROGRAM)) 536 # A executable binary has been specified, setup the target for it. 537 $1_EXTRA_LDFLAGS_SUFFIX += $(GLOBAL_LDFLAGS_SUFFIX) 538 539 $$($1_TARGET) : $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_GEN_MANIFEST) 540 $$(call LINKING_EXE_MSG,$$($1_BASENAME)) 541 $$($1_LDEXE) $$($1_LDFLAGS) $$($1_EXTRA_LDFLAGS) $(EXE_OUT_OPTION)$$($1_TARGET) \ 542 $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_LDFLAGS_SUFFIX) \ 543 $$($1_EXTRA_LDFLAGS_SUFFIX) 544 ifneq (,$$($1_GEN_MANIFEST)) 545 $(MT) -nologo -manifest $$($1_GEN_MANIFEST) -outputresource:$$@;#1 546 endif 547 # This only works if the openjdk_codesign identity is present on the system. Let 548 # silently fail otherwise. 549 ifneq (,$(CODESIGN)) 550 ifneq (,$$($1_CODESIGN)) 551 $(CODESIGN) -s openjdk_codesign $$@ 552 endif 553 endif 554 # Touch target to make sure it has a later time stamp than the debug 555 # symbol files to avoid unnecessary relinking on rebuild. 556 ifeq ($(OPENJDK_TARGET_OS), windows) 557 $(TOUCH) $$@ 558 endif 559 560 endif 561endef 562 563endif # _NATIVE_COMPILATION_GMK 564