1 # 2 # Copyright (c) 1995, 2008, 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 # In VS2005 or VS2008 the link command creates a .manifest file that we want 163 # to insert into the linked artifact so we do not need to track it separately. 164 # Use ";#2" for .dll and ";#1" for .exe in the MT command below: 165 $(ACTUAL_LIBRARY):: $(OBJDIR)/$(LIBRARY).lcf 166 @$(prep-target) 167 @$(MKDIR) -p $(OBJDIR) 168 $(LINK) -dll -out:$(OBJDIR)/$(@F) \ 169 -map:$(OBJDIR)/$(LIBRARY).map \ 170 $(LFLAGS) @$(OBJDIR)/$(LIBRARY).lcf \ 171 $(OTHER_LCF) $(JAVALIB) $(LDLIBS) 172 ifdef MT 173 $(MT) /manifest $(OBJDIR)/$(@F).manifest /outputresource:$(OBJDIR)/$(@F);#2 174 endif 175 $(CP) $(OBJDIR)/$(@F) $@ 176 $(install-module-file) 177 $(CP) $(OBJDIR)/$(LIBRARY).map $(@D) 178 $(CP) $(OBJDIR)/$(LIBRARY).pdb $(@D) 179 180 $(ACTUAL_LIBRARY):: $(ACTUAL_LIBRARY_DIR)/$(LIBRARY).map $(ACTUAL_LIBRARY_DIR)/$(LIBRARY).pdb 181 182 $(ACTUAL_LIBRARY_DIR)/%.map: FORCE 183 $(install-module-file) 184 185 $(ACTUAL_LIBRARY_DIR)/%.pdb: FORCE 186 $(install-module-file) 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 $(ACTUAL_LIBRARY):: $(COMPILE_FILES_o) $(FILES_m) $(FILES_reorder) 235 @$(prep-target) 236 @$(ECHO) "STATS: LIBRARY=$(LIBRARY), PRODUCT=$(PRODUCT), OPTIMIZATION_LEVEL=$(OPTIMIZATION_LEVEL)" 237 @$(ECHO) "Rebuilding $@ because of $?" 238 ifeq ($(LIBRARY), fdlibm) 239 $(AR) -r $@ $(FILES_o) 240 else # LIBRARY 241 $(LINKER) $(SHARED_LIBRARY_FLAG) -o $@ $(FILES_o) $(LDLIBS) 242 $(install-module-file) 243 ifeq ($(WRITE_LIBVERSION),true) 244 $(MCS) -d -a "$(FULL_VERSION)" $@ 245 endif # WRITE_LIBVERSION 246 endif # LIBRARY 247 248 endif # PLATFORM 249 250 # 251 # Cross check all linted files against each other 252 # 253 ifeq ($(PLATFORM),solaris) 254 lint.errors : $(FILES_ln) 255 $(LINT.c) $(FILES_ln) $(LDLIBS) 256 endif 257 258 # 259 # Class libraries with JNI native methods get a include to the package. 260 # 261 ifdef PACKAGE 262 vpath %.c $(PLATFORM_SRC)/native/$(PKGDIR) 263 vpath %.c $(SHARE_SRC)/native/$(PKGDIR) 264 OTHER_INCLUDES += -I$(SHARE_SRC)/native/common -I$(PLATFORM_SRC)/native/common 265 OTHER_INCLUDES += -I$(SHARE_SRC)/native/$(PKGDIR) \ 266 -I$(PLATFORM_SRC)/native/$(PKGDIR) 267 endif 268 269 # 270 # Clean/clobber rules 271 # 272 clean:: 273 $(RM) -r $(ACTUAL_LIBRARY) 274 275 clobber:: clean 276 277 # 278 # INCREMENTAL_BUILD means that this workspace will be built over and over 279 # possibly incrementally. This means tracking the object file dependencies 280 # on include files so that sources get re-compiled when the include files 281 # change. When building from scratch and doing a one time build (like 282 # release engineering or nightly builds) set INCREMENTAL_BUILD=false. 283 # 284 285 ifeq ($(INCREMENTAL_BUILD),true) 286 287 # 288 # Workaround: gnumake sometimes says files is empty when it shouldn't 289 # was: files := $(foreach file, $(wildcard $(OBJDIR)/*.$(DEPEND_SUFFIX)), $(file)) 290 # 291 files := $(shell $(LS) $(OBJDIR)/*.$(DEPEND_SUFFIX) 2>/dev/null) 292 293 # 294 # Only include these files if we have any. 295 # 296 ifneq ($(strip $(files)),) 297 298 include $(files) 299 300 endif # files 301 302 endif # INCREMENTAL_BUILD 303 304 # 305 # Default dependencies 306 # 307 308 all: build 309 310 build: library 311 312 debug: 313 $(MAKE) VARIANT=DBG build 314 315 fastdebug: 316 $(MAKE) VARIANT=DBG FASTDEBUG=true build 317 318 openjdk: 319 $(MAKE) OPENJDK=true build 320 321 FORCE: 322 323 .PHONY: all build debug fastdebug 324