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 ifeq ($(ZIP_DEBUGINFO_FILES),1) 185 (set -e ; \ 186 $(CD) $(OBJDIR) ; \ 187 $(ZIPEXE) -q $(LIBRARY).diz $(LIBRARY).map $(LIBRARY).pdb ; \ 188 ) 189 $(CP) $(OBJDIR)/$(LIBRARY).diz $(@D) 190 $(RM) $(OBJDIR)/$(LIBRARY).map $(OBJDIR)/$(LIBRARY).pdb 191 else 192 $(CP) $(OBJDIR)/$(LIBRARY).map $(@D) 193 $(CP) $(OBJDIR)/$(LIBRARY).pdb $(@D) 194 endif 195 endif 196 197 endif # LIBRARY 198 199 $(OBJDIR)/$(LIBRARY).lcf: $(OBJDIR)/$(LIBRARY).res $(COMPILE_FILES_o) $(FILES_m) 200 @$(prep-target) 201 @$(MKDIR) -p $(TEMPDIR) 202 @$(ECHO) $(FILES_o) > $@ 203 ifndef LOCAL_RESOURCE_FILE 204 @$(ECHO) $(OBJDIR)/$(LIBRARY).res >> $@ 205 endif 206 @$(ECHO) Created $@ 207 208 # JDK name required here 209 RC_FLAGS += /D "JDK_FNAME=$(LIBRARY).dll" \ 210 /D "JDK_INTERNAL_NAME=$(LIBRARY)" \ 211 /D "JDK_FTYPE=0x2L" 212 213 $(OBJDIR)/$(LIBRARY).res: $(VERSIONINFO_RESOURCE) 214 ifndef LOCAL_RESOURCE_FILE 215 @$(prep-target) 216 $(RC) $(RC_FLAGS) $(CC_OBJECT_OUTPUT_FLAG)$(@) $(VERSIONINFO_RESOURCE) 217 endif 218 219 # 220 # Install a .lib file if required. 221 # 222 ifeq ($(INSTALL_DOT_LIB), true) 223 $(ACTUAL_LIBRARY):: $(LIBDIR)/$(LIBRARY).lib 224 225 clean:: 226 -$(RM) $(LIBDIR)/$(LIBRARY).lib 227 228 $(LIBDIR)/$(LIBRARY).lib:: $(OBJDIR)/$(LIBRARY).lib 229 $(install-file) 230 231 $(LIBDIR)/$(LIBRARY).dll:: $(OBJDIR)/$(LIBRARY).dll 232 $(install-file) 233 234 endif # INSTALL_DOT_LIB 235 236 else # PLATFORM 237 238 # 239 # On Solaris, use mcs to write the version into the comment section of 240 # the shared library. On other platforms set this to false at the 241 # make command line. 242 # 243 244 ifneq ($(PLATFORM), macosx) 245 ARFLAGS = -r 246 endif 247 248 $(ACTUAL_LIBRARY):: $(COMPILE_FILES_o) $(FILES_m) $(FILES_reorder) 249 @$(prep-target) 250 @$(ECHO) "STATS: LIBRARY=$(LIBRARY), PRODUCT=$(PRODUCT), OPTIMIZATION_LEVEL=$(OPTIMIZATION_LEVEL)" 251 @$(ECHO) "Rebuilding $@ because of $?" 252 ifeq ($(LIBRARY), fdlibm) 253 $(AR) $(ARFLAGS) $@ $(FILES_o) 254 else # LIBRARY 255 $(LINKER) $(SHARED_LIBRARY_FLAG) -o $@ $(FILES_o) $(LDLIBS) 256 @$(call binary_file_verification,$@) 257 ifeq ($(WRITE_LIBVERSION),true) 258 $(MCS) -d -a "$(FULL_VERSION)" $@ 259 endif # WRITE_LIBVERSION 260 ifneq ($(PLATFORM), macosx) 261 ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) 262 ifeq ($(LIBRARY_SUPPORTS_FULL_DEBUG_SYMBOLS),1) 263 (set -e ; \ 264 $(CD) $(@D) ; \ 265 $(OBJCOPY) --only-keep-debug $(@F) $(LIBRARY).debuginfo ; \ 266 $(OBJCOPY) --add-gnu-debuglink=$(LIBRARY).debuginfo $(@F) ; \ 267 ) 268 ifeq ($(STRIP_POLICY),all_strip) 269 $(STRIP) $@ 270 else 271 ifeq ($(STRIP_POLICY),min_strip) 272 ifeq ($(PLATFORM), solaris) 273 $(STRIP) -x $@ 274 else 275 # assume Linux 276 $(STRIP) -g $@ 277 endif 278 # implied else here is no stripping at all 279 endif 280 endif 281 ifeq ($(ZIP_DEBUGINFO_FILES),1) 282 (set -e ; \ 283 $(CD) $(@D) ; \ 284 $(ZIPEXE) -q $(LIBRARY).diz $(LIBRARY).debuginfo ; \ 285 $(RM) $(LIBRARY).debuginfo ; \ 286 ) 287 endif 288 endif # LIBRARY_SUPPORTS_FULL_DEBUG_SYMBOLS 289 endif # ENABLE_FULL_DEBUG_SYMBOLS 290 endif # PLATFORM-!macosx 291 endif # LIBRARY 292 293 endif # PLATFORM 294 295 # 296 # Cross check all linted files against each other 297 # 298 ifeq ($(PLATFORM),solaris) 299 lint.errors : $(FILES_ln) 300 $(LINT.c) $(FILES_ln) $(LDLIBS) 301 endif 302 303 # 304 # Class libraries with JNI native methods get a include to the package. 305 # 306 ifdef PACKAGE 307 vpath %.c $(PLATFORM_SRC)/native/$(PKGDIR) 308 vpath %.c $(SHARE_SRC)/native/$(PKGDIR) 309 OTHER_INCLUDES += -I$(SHARE_SRC)/native/common -I$(PLATFORM_SRC)/native/common 310 OTHER_INCLUDES += -I$(SHARE_SRC)/native/$(PKGDIR) \ 311 -I$(PLATFORM_SRC)/native/$(PKGDIR) 312 endif 313 314 # 315 # Clean/clobber rules 316 # 317 clean:: 318 $(RM) -r $(ACTUAL_LIBRARY) 319 320 clobber:: clean 321 322 # 323 # INCREMENTAL_BUILD means that this workspace will be built over and over 324 # possibly incrementally. This means tracking the object file dependencies 325 # on include files so that sources get re-compiled when the include files 326 # change. When building from scratch and doing a one time build (like 327 # release engineering or nightly builds) set INCREMENTAL_BUILD=false. 328 # 329 330 ifeq ($(INCREMENTAL_BUILD),true) 331 332 # 333 # Workaround: gnumake sometimes says files is empty when it shouldn't 334 # was: files := $(foreach file, $(wildcard $(OBJDIR)/*.$(DEPEND_SUFFIX)), $(file)) 335 # 336 files := $(shell $(LS) $(OBJDIR)/*.$(DEPEND_SUFFIX) 2>/dev/null) 337 338 # 339 # Only include these files if we have any. 340 # 341 ifneq ($(strip $(files)),) 342 343 include $(files) 344 345 endif # files 346 347 endif # INCREMENTAL_BUILD 348 349 # 350 # Default dependencies 351 # 352 353 all: build 354 355 build: library 356 357 debug: 358 $(MAKE) VARIANT=DBG build 359 360 fastdebug: 361 $(MAKE) VARIANT=DBG FASTDEBUG=true build 362 363 openjdk: 364 $(MAKE) OPENJDK=true build 365 366 FORCE: 367 368 .PHONY: all build debug fastdebug 369