1 # 2 # Copyright (c) 1995, 2011, 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 ($(INCREMENTAL_BUILD),true) 62 FILES_d = $(patsubst %.c, %.$(DEPEND_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_c)))) 63 FILES_d += $(patsubst %.cpp, %.$(DEPEND_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_cpp)))) 64 endif # INCREMENTAL_BUILD 65 66 ifeq ($(PLATFORM),solaris) 67 # List of all lint files, one for each .c file (only for C) 68 FILES_ln = $(patsubst %.c, %.$(LINT_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_c)))) 69 endif 70 71 # 72 # C++ libraries must be linked with CC. 73 # 74 ifdef CPLUSPLUSLIBRARY 75 LINKER=$(LINK.cc) 76 else 77 LINKER=$(LINK.c) 78 endif 79 80 $(ACTUAL_LIBRARY):: $(INIT) $(TEMPDIR) $(LIBDIR) $(BINDIR) $(EXTDIR) classheaders 81 82 # 83 # COMPILE_APPROACH: Different approaches to compile up the native object 84 # files as quickly as possible. 85 # The setting of parallel works best on Unix, batch on Windows. 86 # 87 88 COMPILE_FILES_o = $(OBJDIR)/.files_compiled 89 $(COMPILE_FILES_o): $(FILES_d) $(FILES_o) 90 @$(ECHO) "$<" >> $@ 91 clean:: 92 $(RM) $(COMPILE_FILES_o) 93 94 # 95 # COMPILE_APPROACH=parallel: Will trigger compilations (just compilations) to 96 # happen in parallel. Greatly decreases Unix build time, even on single CPU 97 # machines, more so on multiple CPU machines. Default is 2 compiles 98 # at a time, but can be adjusted with ALT_PARALLEL_COMPILE_JOBS. 99 # Note that each .d file will also be dependent on it's .o file, see 100 # Rules.gmk. 101 # Note this does not depend on Rules.gmk to work like batch (below) 102 # and this technique doesn't seem to help Windows build time nor does 103 # it work very well, it's possible the Windows Visual Studio compilers 104 # don't work well in a parallel situation, this needs investigation. 105 # 106 107 ifeq ($(COMPILE_APPROACH),parallel) 108 109 .PHONY: library_parallel_compile 110 111 library_parallel_compile: 112 @$(ECHO) "Begin parallel compiles: $(shell $(PWD))" 113 @$(MAKE) -j $(PARALLEL_COMPILE_JOBS) $(COMPILE_FILES_o) 114 @$(ECHO) "Done with parallel compiles: $(shell $(PWD))" 115 116 $(ACTUAL_LIBRARY):: library_parallel_compile 117 118 endif 119 120 # 121 # COMPILE_APPROACH=batch: Will trigger compilations (just compilations) to 122 # happen in batch mode. Greatly decreases Windows build time. 123 # See logic in Rules.gmk for how compiles happen, the $(MAKE) in 124 # library_batch_compile below triggers the actions in Rules.gmk. 125 # Note that each .d file will also be dependent on it's .o file, see 126 # Rules.gmk. 127 # 128 ifeq ($(COMPILE_APPROACH),batch) 129 130 .PHONY: library_batch_compile 131 132 library_batch_compile: 133 @$(ECHO) "Begin BATCH compiles: $(shell $(PWD))" 134 $(MAKE) $(COMPILE_FILES_o) 135 $(MAKE) batch_compile 136 @$(ECHO) "Done with BATCH compiles: $(shell $(PWD))" 137 $(MAKE) COMPILE_APPROACH=normal $(COMPILE_FILES_o) 138 139 $(ACTUAL_LIBRARY):: library_batch_compile 140 141 endif 142 143 ifeq ($(PLATFORM), windows) 144 145 # 146 # Library building rules. 147 # 148 149 $(LIBRARY).lib:: $(OBJDIR) 150 151 ifeq ($(LIBRARY), fdlibm) 152 $(ACTUAL_LIBRARY):: $(OBJDIR)/$(LIBRARY).lib 153 154 $(OBJDIR)/$(LIBRARY).lib:: $(OBJDIR)/$(LIBRARY).lcf 155 @$(prep-target) 156 $(LIBEXE) -NODEFAULTLIB:MSVCRT -out:$@ -nologo \ 157 @$(OBJDIR)/$(LIBRARY).lcf $(OTHER_LCF) $(LDLIBS_COMMON) 158 else # LIBRARY 159 # build it into $(OBJDIR) so that the other generated files get put 160 # there, then copy just the DLL (and MAP file) to the requested directory. 161 # 162 $(ACTUAL_LIBRARY):: $(OBJDIR)/$(LIBRARY).lcf 163 @$(prep-target) 164 @$(MKDIR) -p $(OBJDIR) 165 $(LINK) -dll -out:$(OBJDIR)/$(@F) \ 166 -map:$(OBJDIR)/$(LIBRARY).map \ 167 $(LFLAGS) @$(OBJDIR)/$(LIBRARY).lcf \ 168 $(OTHER_LCF) $(JAVALIB) $(LDLIBS) 169 $(CP) $(OBJDIR)/$(@F) $@ 170 @$(call binary_file_verification,$@) 171 $(CP) $(OBJDIR)/$(LIBRARY).map $(@D) 172 $(CP) $(OBJDIR)/$(LIBRARY).pdb $(@D) 173 174 endif # LIBRARY 175 176 $(OBJDIR)/$(LIBRARY).lcf: $(OBJDIR)/$(LIBRARY).res $(COMPILE_FILES_o) $(FILES_m) 177 @$(prep-target) 178 @$(MKDIR) -p $(TEMPDIR) 179 @$(ECHO) $(FILES_o) > $@ 180 ifndef LOCAL_RESOURCE_FILE 181 @$(ECHO) $(OBJDIR)/$(LIBRARY).res >> $@ 182 endif 183 @$(ECHO) Created $@ 184 185 # JDK name required here 186 RC_FLAGS += /D "JDK_FNAME=$(LIBRARY).dll" \ 187 /D "JDK_INTERNAL_NAME=$(LIBRARY)" \ 188 /D "JDK_FTYPE=0x2L" 189 190 $(OBJDIR)/$(LIBRARY).res: $(VERSIONINFO_RESOURCE) 191 ifndef LOCAL_RESOURCE_FILE 192 @$(prep-target) 193 $(RC) $(RC_FLAGS) $(CC_OBJECT_OUTPUT_FLAG)$(@) $(VERSIONINFO_RESOURCE) 194 endif 195 196 # 197 # Install a .lib file if required. 198 # 199 ifeq ($(INSTALL_DOT_LIB), true) 200 $(ACTUAL_LIBRARY):: $(LIBDIR)/$(LIBRARY).lib 201 202 clean:: 203 -$(RM) $(LIBDIR)/$(LIBRARY).lib 204 205 $(LIBDIR)/$(LIBRARY).lib:: $(OBJDIR)/$(LIBRARY).lib 206 $(install-file) 207 208 $(LIBDIR)/$(LIBRARY).dll:: $(OBJDIR)/$(LIBRARY).dll 209 $(install-file) 210 211 endif # INSTALL_DOT_LIB 212 213 else # PLATFORM 214 215 # 216 # On Solaris, use mcs to write the version into the comment section of 217 # the shared library. On other platforms set this to false at the 218 # make command line. 219 # 220 $(ACTUAL_LIBRARY):: $(COMPILE_FILES_o) $(FILES_m) $(FILES_reorder) 221 @$(prep-target) 222 @$(ECHO) "STATS: LIBRARY=$(LIBRARY), PRODUCT=$(PRODUCT), OPTIMIZATION_LEVEL=$(OPTIMIZATION_LEVEL)" 223 @$(ECHO) "Rebuilding $@ because of $?" 224 ifeq ($(LIBRARY), fdlibm) 225 $(AR) -r $@ $(FILES_o) 226 else # LIBRARY 227 $(LINKER) $(SHARED_LIBRARY_FLAG) -o $@ $(FILES_o) $(LDLIBS) 228 @$(call binary_file_verification,$@) 229 ifeq ($(WRITE_LIBVERSION),true) 230 $(MCS) -d -a "$(FULL_VERSION)" $@ 231 endif # WRITE_LIBVERSION 232 endif # LIBRARY 233 234 endif # PLATFORM 235 236 # 237 # Cross check all linted files against each other 238 # 239 ifeq ($(PLATFORM),solaris) 240 lint.errors : $(FILES_ln) 241 $(LINT.c) $(FILES_ln) $(LDLIBS) 242 endif 243 244 # 245 # Class libraries with JNI native methods get a include to the package. 246 # 247 ifdef PACKAGE 248 vpath %.c $(PLATFORM_SRC)/native/$(PKGDIR) 249 vpath %.c $(SHARE_SRC)/native/$(PKGDIR) 250 OTHER_INCLUDES += -I$(SHARE_SRC)/native/common -I$(PLATFORM_SRC)/native/common 251 OTHER_INCLUDES += -I$(SHARE_SRC)/native/$(PKGDIR) \ 252 -I$(PLATFORM_SRC)/native/$(PKGDIR) 253 endif 254 255 # 256 # Clean/clobber rules 257 # 258 clean:: 259 $(RM) -r $(ACTUAL_LIBRARY) 260 261 clobber:: clean 262 263 # 264 # INCREMENTAL_BUILD means that this workspace will be built over and over 265 # possibly incrementally. This means tracking the object file dependencies 266 # on include files so that sources get re-compiled when the include files 267 # change. When building from scratch and doing a one time build (like 268 # release engineering or nightly builds) set INCREMENTAL_BUILD=false. 269 # 270 271 ifeq ($(INCREMENTAL_BUILD),true) 272 273 # 274 # Workaround: gnumake sometimes says files is empty when it shouldn't 275 # was: files := $(foreach file, $(wildcard $(OBJDIR)/*.$(DEPEND_SUFFIX)), $(file)) 276 # 277 files := $(shell $(LS) $(OBJDIR)/*.$(DEPEND_SUFFIX) 2>/dev/null) 278 279 # 280 # Only include these files if we have any. 281 # 282 ifneq ($(strip $(files)),) 283 284 include $(files) 285 286 endif # files 287 288 endif # INCREMENTAL_BUILD 289 290 # 291 # Default dependencies 292 # 293 294 all: build 295 296 build: library 297 298 debug: 299 $(MAKE) VARIANT=DBG build 300 301 fastdebug: 302 $(MAKE) VARIANT=DBG FASTDEBUG=true build 303 304 openjdk: 305 $(MAKE) OPENJDK=true build 306 307 FORCE: 308 309 .PHONY: all build debug fastdebug 310