| # |
| # Copyright (c) 1995, 2012, 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 ($(PLATFORM), macosx) |
| FILES_o += $(patsubst %.m, %.$(OBJECT_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_objc)))) |
| FILES_o += $(patsubst %.mm, %.$(OBJECT_SUFFIX), $(addprefix $(OBJDIR)/, $(notdir $(FILES_objcpp)))) |
| |
| INCREMENTAL_BUILD=false |
| |
| endif # PLATFORM |
| |
| 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 |
| @$(ECHO) Building lib:$(ACTUAL_LIBRARY) |
| # |
| # 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. |
| # |
| ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) |
| MAP_OPTION="-map:$(OBJDIR)/$(LIBRARY).map" |
| endif |
| |
| $(ACTUAL_LIBRARY):: $(OBJDIR)/$(LIBRARY).lcf |
| @$(prep-target) |
| @$(MKDIR) -p $(OBJDIR) |
| $(LINK) -dll -out:$(OBJDIR)/$(@F) \ |
| $(MAP_OPTION) \ |
| $(LFLAGS) @$(OBJDIR)/$(LIBRARY).lcf \ |
| $(OTHER_LCF) $(LDLIBS) |
| $(CP) $(OBJDIR)/$(@F) $@ |
| @$(call binary_file_verification,$@) |
| ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) |
| ifeq ($(ZIP_DEBUGINFO_FILES),1) |
| (set -e ; \ |
| $(CD) $(OBJDIR) ; \ |
| $(ZIPEXE) -q $(LIBRARY).diz $(LIBRARY).map $(LIBRARY).pdb ; \ |
| ) |
| $(CP) $(OBJDIR)/$(LIBRARY).diz $(@D) |
| $(RM) $(OBJDIR)/$(LIBRARY).map $(OBJDIR)/$(LIBRARY).pdb |
| else |
| $(CP) $(OBJDIR)/$(LIBRARY).map $(@D) |
| $(CP) $(OBJDIR)/$(LIBRARY).pdb $(@D) |
| endif |
| endif |
| |
| endif # LIBRARY |
| |
| $(OBJDIR)/$(LIBRARY).lcf: $(OBJDIR)/$(LIBRARY).res $(COMPILE_FILES_o) $(FILES_m) |
| @$(prep-target) |
| @$(MKDIR) -p $(TEMPDIR) |
| @$(ECHO) $(sort $(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. |
| # |
| |
| ifneq ($(PLATFORM), macosx) |
| ARFLAGS = -r |
| endif |
| |
| ifeq ($(PLATFORM), solaris) |
| ifeq ($(LIBRARY_SUPPORTS_FULL_DEBUG_SYMBOLS),1) |
| $(ACTUAL_LIBRARY):: $(ADD_GNU_DEBUGLINK) $(FIX_EMPTY_SEC_HDR_FLAGS) |
| endif |
| endif |
| |
| $(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) $(ARFLAGS) $@ $(sort $(FILES_o)) |
| else # LIBRARY |
| $(LINKER) $(SHARED_LIBRARY_FLAG) -o $@ $(sort $(FILES_o)) $(LDLIBS) |
| @$(call binary_file_verification,$@) |
| ifeq ($(WRITE_LIBVERSION),true) |
| $(MCS) -d -a "$(FULL_VERSION)" $@ |
| endif # WRITE_LIBVERSION |
| ifneq ($(PLATFORM), macosx) |
| ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1) |
| ifeq ($(LIBRARY_SUPPORTS_FULL_DEBUG_SYMBOLS),1) |
| ifeq ($(PLATFORM), solaris) |
| # gobjcopy crashes on "empty" section headers with the SHF_ALLOC flag set. |
| # Use $(FIX_EMPTY_SEC_HDR_FLAGS) to clear the SHF_ALLOC flag (if set) from |
| # empty section headers until a fixed $(OBJCOPY) is available. |
| # An empty section header has sh_addr == 0 and sh_size == 0. |
| # This problem has only been seen on Solaris X64, but we call this tool |
| # on all Solaris builds just in case. |
| # |
| # $(OBJCOPY) --add-gnu-debuglink=... corrupts SUNW_* sections. |
| # Use $(ADD_GNU_DEBUGLINK) until a fixed $(OBJCOPY) is available. |
| (set -e ; \ |
| $(CD) $(@D) ; \ |
| $(FIX_EMPTY_SEC_HDR_FLAGS) $(@F) ; \ |
| $(OBJCOPY) --only-keep-debug $(@F) $(LIB_PREFIX)$(LIBRARY).debuginfo ; \ |
| $(ADD_GNU_DEBUGLINK) $(LIB_PREFIX)$(LIBRARY).debuginfo $(@F) ; \ |
| ) |
| else # PLATFORM != solaris |
| (set -e ; \ |
| $(CD) $(@D) ; \ |
| $(OBJCOPY) --only-keep-debug $(@F) $(LIB_PREFIX)$(LIBRARY).debuginfo ; \ |
| $(OBJCOPY) --add-gnu-debuglink=$(LIB_PREFIX)$(LIBRARY).debuginfo $(@F) ; \ |
| ) |
| endif # PLATFORM == solaris |
| ifeq ($(STRIP_POLICY),all_strip) |
| $(STRIP) $@ |
| else |
| ifeq ($(STRIP_POLICY),min_strip) |
| ifeq ($(PLATFORM), solaris) |
| $(STRIP) -x $@ |
| else |
| # assume Linux |
| $(STRIP) -g $@ |
| endif |
| # implied else here is no stripping at all |
| endif |
| endif |
| ifeq ($(ZIP_DEBUGINFO_FILES),1) |
| (set -e ; \ |
| $(CD) $(@D) ; \ |
| $(ZIPEXE) -q $(LIB_PREFIX)$(LIBRARY).diz $(LIB_PREFIX)$(LIBRARY).debuginfo ; \ |
| $(RM) $(LIB_PREFIX)$(LIBRARY).debuginfo ; \ |
| ) |
| endif |
| endif # LIBRARY_SUPPORTS_FULL_DEBUG_SYMBOLS |
| endif # ENABLE_FULL_DEBUG_SYMBOLS |
| endif # PLATFORM-!macosx |
| 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 |
| |