1 # 2 # Copyright (c) 1995, 2012, Oracle and/or its affiliates. All rights reserved. 3 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 # 5 # This code is free software; you can redistribute it and/or modify it 6 # under the terms of the GNU General Public License version 2 only, as 7 # published by the Free Software Foundation. Oracle designates this 8 # particular file as subject to the "Classpath" exception as provided 9 # by Oracle in the LICENSE file that accompanied this code. 10 # 11 # This code is distributed in the hope that it will be useful, but WITHOUT 12 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 # version 2 for more details (a copy is included in the LICENSE file that 15 # accompanied this code). 16 # 17 # You should have received a copy of the GNU General Public License version 18 # 2 along with this work; if not, write to the Free Software Foundation, 19 # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 # 21 # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 # or visit www.oracle.com if you need additional information or have any 23 # questions. 24 # 25 26 # 27 # Generic makefile for building shared libraries. 28 # 29 30 # WARNING: This file is shared with other workspaces. 31 # So when it includes other files, it must use JDK_TOPDIR. 32 # 33 34 include $(JDK_TOPDIR)/make/common/Classes.gmk 35 36 # 37 # It is important to define these *after* including Classes.gmk 38 # in order to override the values defined inthat makefile. 39 # 40 41 ifeq ($(LIBRARY), fdlibm) 42 ifeq ($(PLATFORM),windows) 43 ACTUAL_LIBRARY_NAME = $(LIB_PREFIX)$(LIBRARY).$(FDDLIBM_SUFFIX) 44 ACTUAL_LIBRARY_DIR = $(OBJDIR) 45 else # PLATFORM 46 ACTUAL_LIBRARY_NAME = $(LIB_PREFIX)$(LIBRARY).$(ARCH).$(FDDLIBM_SUFFIX) 47 ACTUAL_LIBRARY_DIR = $(OBJDIR) 48 endif #PLATFORM 49 else # LIBRARY 50 ACTUAL_LIBRARY_NAME = $(LIB_PREFIX)$(LIBRARY).$(LIBRARY_SUFFIX) 51 ACTUAL_LIBRARY_DIR = $(LIB_LOCATION) 52 endif 53 ACTUAL_LIBRARY = $(ACTUAL_LIBRARY_DIR)/$(ACTUAL_LIBRARY_NAME) 54 55 library:: $(ACTUAL_LIBRARY) 56 57 FILES_o = $(patsubst %.c, %.$(OBJECT_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_c)))) 58 FILES_o += $(patsubst %.s, %.$(OBJECT_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_s)))) 59 FILES_o += $(patsubst %.cpp, %.$(OBJECT_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_cpp)))) 60 61 ifeq ($(PLATFORM), macosx) 62 FILES_o += $(patsubst %.m, %.$(OBJECT_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_objc)))) 63 FILES_o += $(patsubst %.mm, %.$(OBJECT_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_objcpp)))) 64 65 INCREMENTAL_BUILD=false 66 67 endif # PLATFORM 68 69 ifeq ($(INCREMENTAL_BUILD),true) 70 FILES_d = $(patsubst %.c, %.$(DEPEND_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_c)))) 71 FILES_d += $(patsubst %.cpp, %.$(DEPEND_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_cpp)))) 72 endif # INCREMENTAL_BUILD 73 74 ifeq ($(PLATFORM),solaris) 75 # List of all lint files, one for each .c file (only for C) 76 FILES_ln = $(patsubst %.c, %.$(LINT_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_c)))) 77 endif 78 79 # 80 # C++ libraries must be linked with CC. 81 # 82 ifdef CPLUSPLUSLIBRARY 83 LINKER=$(LINK.cc) 84 else 85 LINKER=$(LINK.c) 86 endif 87 88 $(ACTUAL_LIBRARY):: $(INIT) $(TEMPDIR) $(LIBDIR) $(BINDIR) $(EXTDIR) classheaders 89 @$(ECHO) Building lib:$(ACTUAL_LIBRARY) 90 # 91 # COMPILE_APPROACH: Different approaches to compile up the native object 92 # files as quickly as possible. 93 # The setting of parallel works best on Unix, batch on Windows. 94 # 95 96 COMPILE_FILES_o = $(OBJDIR)/.files_compiled 97 $(COMPILE_FILES_o): $(FILES_d) $(FILES_o) 98 @$(ECHO) "$<" >> $@ 99 clean:: 100 $(RM) $(COMPILE_FILES_o) 101 102 # 103 # COMPILE_APPROACH=parallel: Will trigger compilations (just compilations) to 104 # happen in parallel. Greatly decreases Unix build time, even on single CPU 105 # machines, more so on multiple CPU machines. Default is 2 compiles 106 # at a time, but can be adjusted with ALT_PARALLEL_COMPILE_JOBS. 107 # Note that each .d file will also be dependent on it's .o file, see 108 # Rules.gmk. 109 # Note this does not depend on Rules.gmk to work like batch (below) 110 # and this technique doesn't seem to help Windows build time nor does 111 # it work very well, it's possible the Windows Visual Studio compilers 112 # don't work well in a parallel situation, this needs investigation. 113 # 114 115 ifeq ($(COMPILE_APPROACH),parallel) 116 117 .PHONY: library_parallel_compile 118 119 library_parallel_compile: 120 @$(ECHO) "Begin parallel compiles: $(shell $(PWD))" 121 @$(MAKE) -j $(PARALLEL_COMPILE_JOBS) $(COMPILE_FILES_o) 122 @$(ECHO) "Done with parallel compiles: $(shell $(PWD))" 123 124 $(ACTUAL_LIBRARY):: library_parallel_compile 125 126 endif 127 128 # 129 # COMPILE_APPROACH=batch: Will trigger compilations (just compilations) to 130 # happen in batch mode. Greatly decreases Windows build time. 131 # See logic in Rules.gmk for how compiles happen, the $(MAKE) in 132 # library_batch_compile below triggers the actions in Rules.gmk. 133 # Note that each .d file will also be dependent on it's .o file, see 134 # Rules.gmk. 135 # 136 ifeq ($(COMPILE_APPROACH),batch) 137 138 .PHONY: library_batch_compile 139 140 library_batch_compile: 141 @$(ECHO) "Begin BATCH compiles: $(shell $(PWD))" 142 $(MAKE) $(COMPILE_FILES_o) 143 $(MAKE) batch_compile 144 @$(ECHO) "Done with BATCH compiles: $(shell $(PWD))" 145 $(MAKE) COMPILE_APPROACH=normal $(COMPILE_FILES_o) 146 147 $(ACTUAL_LIBRARY):: library_batch_compile 148 149 endif 150 151 ifeq ($(PLATFORM), windows) 152 153 # 154 # Library building rules. 155 # 156 157 $(LIBRARY).lib:: $(OBJDIR) 158 159 ifeq ($(LIBRARY), fdlibm) 160 $(ACTUAL_LIBRARY):: $(OBJDIR)/$(LIBRARY).lib 161 162 $(OBJDIR)/$(LIBRARY).lib:: $(OBJDIR)/$(LIBRARY).lcf 163 @$(prep-target) 164 $(LIBEXE) -NODEFAULTLIB:MSVCRT -out:$@ -nologo \ 165 @$(OBJDIR)/$(LIBRARY).lcf $(OTHER_LCF) $(LDLIBS_COMMON) 166 else # LIBRARY 167 # build it into $(OBJDIR) so that the other generated files get put 168 # there, then copy just the DLL (and MAP file) to the requested directory. 169 # 170 ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) 171 MAP_OPTION="-map:$(OBJDIR)/$(LIBRARY).map" 172 endif 173 174 $(ACTUAL_LIBRARY):: $(OBJDIR)/$(LIBRARY).lcf 175 @$(prep-target) 176 @$(MKDIR) -p $(OBJDIR) 177 $(LINK) -dll -out:$(OBJDIR)/$(@F) \ 178 $(MAP_OPTION) \ 179 $(LFLAGS) @$(OBJDIR)/$(LIBRARY).lcf \ 180 $(OTHER_LCF) $(LDLIBS) 181 $(CP) $(OBJDIR)/$(@F) $@ 182 @$(call binary_file_verification,$@) 183 ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) 184 $(CP) $(OBJDIR)/$(LIBRARY).map $(@D) 185 $(CP) $(OBJDIR)/$(LIBRARY).pdb $(@D) 186 endif 187 188 endif # LIBRARY 189 190 $(OBJDIR)/$(LIBRARY).lcf: $(OBJDIR)/$(LIBRARY).res $(COMPILE_FILES_o) $(FILES_m) 191 @$(prep-target) 192 @$(MKDIR) -p $(TEMPDIR) 193 @$(ECHO) $(FILES_o) > $@ 194 ifndef LOCAL_RESOURCE_FILE 195 @$(ECHO) $(OBJDIR)/$(LIBRARY).res >> $@ 196 endif 197 @$(ECHO) Created $@ 198 199 # JDK name required here 200 RC_FLAGS += /D "JDK_FNAME=$(LIBRARY).dll" \ 201 /D "JDK_INTERNAL_NAME=$(LIBRARY)" \ 202 /D "JDK_FTYPE=0x2L" 203 204 $(OBJDIR)/$(LIBRARY).res: $(VERSIONINFO_RESOURCE) 205 ifndef LOCAL_RESOURCE_FILE 206 @$(prep-target) 207 $(RC) $(RC_FLAGS) $(CC_OBJECT_OUTPUT_FLAG)$(@) $(VERSIONINFO_RESOURCE) 208 endif 209 210 # 211 # Install a .lib file if required. 212 # 213 ifeq ($(INSTALL_DOT_LIB), true) 214 $(ACTUAL_LIBRARY):: $(LIBDIR)/$(LIBRARY).lib 215 216 clean:: 217 -$(RM) $(LIBDIR)/$(LIBRARY).lib 218 219 $(LIBDIR)/$(LIBRARY).lib:: $(OBJDIR)/$(LIBRARY).lib 220 $(install-file) 221 222 $(LIBDIR)/$(LIBRARY).dll:: $(OBJDIR)/$(LIBRARY).dll 223 $(install-file) 224 225 endif # INSTALL_DOT_LIB 226 227 else # PLATFORM 228 229 # 230 # On Solaris, use mcs to write the version into the comment section of 231 # the shared library. On other platforms set this to false at the 232 # make command line. 233 # 234 235 ifneq ($(PLATFORM), macosx) 236 ARFLAGS = -r 237 endif 238 239 $(ACTUAL_LIBRARY):: $(COMPILE_FILES_o) $(FILES_m) $(FILES_reorder) 240 @$(prep-target) 241 @$(ECHO) "STATS: LIBRARY=$(LIBRARY), PRODUCT=$(PRODUCT), OPTIMIZATION_LEVEL=$(OPTIMIZATION_LEVEL)" 242 @$(ECHO) "Rebuilding $@ because of $?" 243 ifeq ($(LIBRARY), fdlibm) 244 $(AR) $(ARFLAGS) $@ $(FILES_o) 245 else # LIBRARY 246 $(LINKER) $(SHARED_LIBRARY_FLAG) -o $@ $(FILES_o) $(LDLIBS) 247 @$(call binary_file_verification,$@) 248 ifeq ($(WRITE_LIBVERSION),true) 249 $(MCS) -d -a "$(FULL_VERSION)" $@ 250 endif # WRITE_LIBVERSION 251 endif # LIBRARY 252 253 endif # PLATFORM 254 255 # 256 # Cross check all linted files against each other 257 # 258 ifeq ($(PLATFORM),solaris) 259 lint.errors : $(FILES_ln) 260 $(LINT.c) $(FILES_ln) $(LDLIBS) 261 endif 262 263 # 264 # Class libraries with JNI native methods get a include to the package. 265 # 266 ifdef PACKAGE 267 vpath %.c $(PLATFORM_SRC)/native/$(PKGDIR) 268 vpath %.c $(SHARE_SRC)/native/$(PKGDIR) 269 OTHER_INCLUDES += -I$(SHARE_SRC)/native/common -I$(PLATFORM_SRC)/native/common 270 OTHER_INCLUDES += -I$(SHARE_SRC)/native/$(PKGDIR) \ 271 -I$(PLATFORM_SRC)/native/$(PKGDIR) 272 endif 273 274 # 275 # Clean/clobber rules 276 # 277 clean:: 278 $(RM) -r $(ACTUAL_LIBRARY) 279 280 clobber:: clean 281 282 # 283 # INCREMENTAL_BUILD means that this workspace will be built over and over 284 # possibly incrementally. This means tracking the object file dependencies 285 # on include files so that sources get re-compiled when the include files 286 # change. When building from scratch and doing a one time build (like 287 # release engineering or nightly builds) set INCREMENTAL_BUILD=false. 288 # 289 290 ifeq ($(INCREMENTAL_BUILD),true) 291 292 # 293 # Workaround: gnumake sometimes says files is empty when it shouldn't 294 # was: files := $(foreach file, $(wildcard $(OBJDIR)/*.$(DEPEND_SUFFIX)), $(file)) 295 # 296 files := $(shell $(LS) $(OBJDIR)/*.$(DEPEND_SUFFIX) 2>/dev/null) 297 298 # 299 # Only include these files if we have any. 300 # 301 ifneq ($(strip $(files)),) 302 303 include $(files) 304 305 endif # files 306 307 endif # INCREMENTAL_BUILD 308 309 # 310 # Default dependencies 311 # 312 313 all: build 314 315 build: library 316 317 debug: 318 $(MAKE) VARIANT=DBG build 319 320 fastdebug: 321 $(MAKE) VARIANT=DBG FASTDEBUG=true build 322 323 openjdk: 324 $(MAKE) OPENJDK=true build 325 326 FORCE: 327 328 .PHONY: all build debug fastdebug 329