# # Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License version 2 only, as # published by the Free Software Foundation. Oracle designates this # particular file as subject to the "Classpath" exception as provided # by Oracle in the LICENSE file that accompanied this code. # # This code is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # version 2 for more details (a copy is included in the LICENSE file that # accompanied this code). # # You should have received a copy of the GNU General Public License version # 2 along with this work; if not, write to the Free Software Foundation, # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. # # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA # or visit www.oracle.com if you need additional information or have any # questions. # # # Generic makefile for building shared libraries. # # WARNING: This file is shared with other workspaces. # So when it includes other files, it must use JDK_TOPDIR. # include $(JDK_TOPDIR)/make/common/Classes.gmk # # It is important to define these *after* including Classes.gmk # in order to override the values defined inthat makefile. # ifeq ($(LIBRARY), fdlibm) ifeq ($(PLATFORM),windows) ACTUAL_LIBRARY_NAME = $(LIB_PREFIX)$(LIBRARY).$(FDDLIBM_SUFFIX) ACTUAL_LIBRARY_DIR = $(OBJDIR) else # PLATFORM ACTUAL_LIBRARY_NAME = $(LIB_PREFIX)$(LIBRARY).$(ARCH).$(FDDLIBM_SUFFIX) ACTUAL_LIBRARY_DIR = $(OBJDIR) endif #PLATFORM else # LIBRARY ACTUAL_LIBRARY_NAME = $(LIB_PREFIX)$(LIBRARY).$(LIBRARY_SUFFIX) ACTUAL_LIBRARY_DIR = $(LIB_LOCATION) endif ACTUAL_LIBRARY = $(ACTUAL_LIBRARY_DIR)/$(ACTUAL_LIBRARY_NAME) library:: $(ACTUAL_LIBRARY) FILES_o = $(patsubst %.c, %.$(OBJECT_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_c)))) FILES_o += $(patsubst %.s, %.$(OBJECT_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_s)))) FILES_o += $(patsubst %.cpp, %.$(OBJECT_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_cpp)))) ifeq ($(INCREMENTAL_BUILD),true) FILES_d = $(patsubst %.c, %.$(DEPEND_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_c)))) FILES_d += $(patsubst %.cpp, %.$(DEPEND_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_cpp)))) endif # INCREMENTAL_BUILD ifeq ($(PLATFORM),solaris) # List of all lint files, one for each .c file (only for C) FILES_ln = $(patsubst %.c, %.$(LINT_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_c)))) endif # # C++ libraries must be linked with CC. # ifdef CPLUSPLUSLIBRARY LINKER=$(LINK.cc) else LINKER=$(LINK.c) endif $(ACTUAL_LIBRARY):: $(INIT) $(TEMPDIR) $(LIBDIR) $(BINDIR) $(EXTDIR) classheaders # # COMPILE_APPROACH: Different approaches to compile up the native object # files as quickly as possible. # The setting of parallel works best on Unix, batch on Windows. # COMPILE_FILES_o = $(OBJDIR)/.files_compiled $(COMPILE_FILES_o): $(FILES_d) $(FILES_o) @$(ECHO) "$<" >> $@ clean:: $(RM) $(COMPILE_FILES_o) # # COMPILE_APPROACH=parallel: Will trigger compilations (just compilations) to # happen in parallel. Greatly decreases Unix build time, even on single CPU # machines, more so on multiple CPU machines. Default is 2 compiles # at a time, but can be adjusted with ALT_PARALLEL_COMPILE_JOBS. # Note that each .d file will also be dependent on it's .o file, see # Rules.gmk. # Note this does not depend on Rules.gmk to work like batch (below) # and this technique doesn't seem to help Windows build time nor does # it work very well, it's possible the Windows Visual Studio compilers # don't work well in a parallel situation, this needs investigation. # ifeq ($(COMPILE_APPROACH),parallel) .PHONY: library_parallel_compile library_parallel_compile: @$(ECHO) "Begin parallel compiles: $(shell $(PWD))" @$(MAKE) -j $(PARALLEL_COMPILE_JOBS) $(COMPILE_FILES_o) @$(ECHO) "Done with parallel compiles: $(shell $(PWD))" $(ACTUAL_LIBRARY):: library_parallel_compile endif # # COMPILE_APPROACH=batch: Will trigger compilations (just compilations) to # happen in batch mode. Greatly decreases Windows build time. # See logic in Rules.gmk for how compiles happen, the $(MAKE) in # library_batch_compile below triggers the actions in Rules.gmk. # Note that each .d file will also be dependent on it's .o file, see # Rules.gmk. # ifeq ($(COMPILE_APPROACH),batch) .PHONY: library_batch_compile library_batch_compile: @$(ECHO) "Begin BATCH compiles: $(shell $(PWD))" $(MAKE) $(COMPILE_FILES_o) $(MAKE) batch_compile @$(ECHO) "Done with BATCH compiles: $(shell $(PWD))" $(MAKE) COMPILE_APPROACH=normal $(COMPILE_FILES_o) $(ACTUAL_LIBRARY):: library_batch_compile endif ifeq ($(PLATFORM), windows) # # Library building rules. # $(LIBRARY).lib:: $(OBJDIR) ifeq ($(LIBRARY), fdlibm) $(ACTUAL_LIBRARY):: $(OBJDIR)/$(LIBRARY).lib $(OBJDIR)/$(LIBRARY).lib:: $(OBJDIR)/$(LIBRARY).lcf @$(prep-target) $(LIBEXE) -NODEFAULTLIB:MSVCRT -out:$@ -nologo \ @$(OBJDIR)/$(LIBRARY).lcf $(OTHER_LCF) $(LDLIBS_COMMON) else # LIBRARY # build it into $(OBJDIR) so that the other generated files get put # there, then copy just the DLL (and MAP file) to the requested directory. # $(ACTUAL_LIBRARY):: $(OBJDIR)/$(LIBRARY).lcf @$(prep-target) @$(MKDIR) -p $(OBJDIR) $(LINK) -dll -out:$(OBJDIR)/$(@F) \ -map:$(OBJDIR)/$(LIBRARY).map \ $(LFLAGS) @$(OBJDIR)/$(LIBRARY).lcf \ $(OTHER_LCF) $(JAVALIB) $(LDLIBS) $(CP) $(OBJDIR)/$(@F) $@ @$(call binary_file_verification,$@) $(CP) $(OBJDIR)/$(LIBRARY).map $(@D) $(CP) $(OBJDIR)/$(LIBRARY).pdb $(@D) endif # LIBRARY $(OBJDIR)/$(LIBRARY).lcf: $(OBJDIR)/$(LIBRARY).res $(COMPILE_FILES_o) $(FILES_m) @$(prep-target) @$(MKDIR) -p $(TEMPDIR) @$(ECHO) $(FILES_o) > $@ ifndef LOCAL_RESOURCE_FILE @$(ECHO) $(OBJDIR)/$(LIBRARY).res >> $@ endif @$(ECHO) Created $@ # JDK name required here RC_FLAGS += /D "JDK_FNAME=$(LIBRARY).dll" \ /D "JDK_INTERNAL_NAME=$(LIBRARY)" \ /D "JDK_FTYPE=0x2L" $(OBJDIR)/$(LIBRARY).res: $(VERSIONINFO_RESOURCE) ifndef LOCAL_RESOURCE_FILE @$(prep-target) $(RC) $(RC_FLAGS) $(CC_OBJECT_OUTPUT_FLAG)$(@) $(VERSIONINFO_RESOURCE) endif # # Install a .lib file if required. # ifeq ($(INSTALL_DOT_LIB), true) $(ACTUAL_LIBRARY):: $(LIBDIR)/$(LIBRARY).lib clean:: -$(RM) $(LIBDIR)/$(LIBRARY).lib $(LIBDIR)/$(LIBRARY).lib:: $(OBJDIR)/$(LIBRARY).lib $(install-file) $(LIBDIR)/$(LIBRARY).dll:: $(OBJDIR)/$(LIBRARY).dll $(install-file) endif # INSTALL_DOT_LIB else # PLATFORM # # On Solaris, use mcs to write the version into the comment section of # the shared library. On other platforms set this to false at the # make command line. # $(ACTUAL_LIBRARY):: $(COMPILE_FILES_o) $(FILES_m) $(FILES_reorder) @$(prep-target) @$(ECHO) "STATS: LIBRARY=$(LIBRARY), PRODUCT=$(PRODUCT), OPTIMIZATION_LEVEL=$(OPTIMIZATION_LEVEL)" @$(ECHO) "Rebuilding $@ because of $?" ifeq ($(LIBRARY), fdlibm) $(AR) -r $@ $(FILES_o) else # LIBRARY $(LINKER) $(SHARED_LIBRARY_FLAG) -o $@ $(FILES_o) $(LDLIBS) @$(call binary_file_verification,$@) ifeq ($(WRITE_LIBVERSION),true) $(MCS) -d -a "$(FULL_VERSION)" $@ endif # WRITE_LIBVERSION endif # LIBRARY endif # PLATFORM # # Cross check all linted files against each other # ifeq ($(PLATFORM),solaris) lint.errors : $(FILES_ln) $(LINT.c) $(FILES_ln) $(LDLIBS) endif # # Class libraries with JNI native methods get a include to the package. # ifdef PACKAGE vpath %.c $(PLATFORM_SRC)/native/$(PKGDIR) vpath %.c $(SHARE_SRC)/native/$(PKGDIR) OTHER_INCLUDES += -I$(SHARE_SRC)/native/common -I$(PLATFORM_SRC)/native/common OTHER_INCLUDES += -I$(SHARE_SRC)/native/$(PKGDIR) \ -I$(PLATFORM_SRC)/native/$(PKGDIR) endif # # Clean/clobber rules # clean:: $(RM) -r $(ACTUAL_LIBRARY) clobber:: clean # # INCREMENTAL_BUILD means that this workspace will be built over and over # possibly incrementally. This means tracking the object file dependencies # on include files so that sources get re-compiled when the include files # change. When building from scratch and doing a one time build (like # release engineering or nightly builds) set INCREMENTAL_BUILD=false. # ifeq ($(INCREMENTAL_BUILD),true) # # Workaround: gnumake sometimes says files is empty when it shouldn't # was: files := $(foreach file, $(wildcard $(OBJDIR)/*.$(DEPEND_SUFFIX)), $(file)) # files := $(shell $(LS) $(OBJDIR)/*.$(DEPEND_SUFFIX) 2>/dev/null) # # Only include these files if we have any. # ifneq ($(strip $(files)),) include $(files) endif # files endif # INCREMENTAL_BUILD # # Default dependencies # all: build build: library debug: $(MAKE) VARIANT=DBG build fastdebug: $(MAKE) VARIANT=DBG FASTDEBUG=true build openjdk: $(MAKE) OPENJDK=true build FORCE: .PHONY: all build debug fastdebug