594b196afc
Work around 'gobjcopy' failures on Solaris by adding temporary tools to add the '.gnu_debuglink' section and remove the SHF_ALLOC flag from "empty" section headers. Reviewed-by: sspitsyn, acorn
394 lines
12 KiB
Plaintext
394 lines
12 KiB
Plaintext
#
|
|
# 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) $(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) $@ $(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
|
|
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
|
|
|