1#
2# Copyright (c) 1999, 2019, 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.
8#
9# This code is distributed in the hope that it will be useful, but WITHOUT
10# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12# version 2 for more details (a copy is included in the LICENSE file that
13# accompanied this code).
14#
15# You should have received a copy of the GNU General Public License version
16# 2 along with this work; if not, write to the Free Software Foundation,
17# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18#
19# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20# or visit www.oracle.com if you need additional information or have any
21# questions.
22#
23#
24
25# Rules to build JVM and related libraries, included from vm.make in the build
26# directory.
27
28# Common build rules.
29MAKEFILES_DIR=$(GAMMADIR)/make/$(Platform_os_family)/makefiles
30include $(MAKEFILES_DIR)/rules.make
31include $(GAMMADIR)/make/altsrc.make
32
33default: build
34
35#----------------------------------------------------------------------
36# Defs
37
38GENERATED     = ../generated
39DEP_DIR       = $(GENERATED)/dependencies
40
41# reads the generated files defining the set of .o's and the .o .h dependencies
42-include $(DEP_DIR)/*.d
43
44# read machine-specific adjustments (%%% should do this via buildtree.make?)
45ifeq ($(findstring true, $(JVM_VARIANT_ZERO) $(JVM_VARIANT_ZEROSHARK)), true)
46  include $(MAKEFILES_DIR)/zeroshark.make
47else
48  include $(MAKEFILES_DIR)/$(BUILDARCH).make
49endif
50
51# set VPATH so make knows where to look for source files
52# Src_Dirs_V is everything in src/share/vm/*, plus the right os/*/vm and cpu/*/vm
53# The adfiles directory contains ad_<arch>.[ch]pp.
54# The jvmtifiles directory contains jvmti*.[ch]pp
55Src_Dirs_V += $(GENERATED)/adfiles $(GENERATED)/jvmtifiles $(GENERATED)/jfrfiles
56VPATH += $(Src_Dirs_V:%=%:)
57
58# set INCLUDES for C preprocessor.
59Src_Dirs_I += $(GENERATED)
60# The order is important for the precompiled headers to work.
61INCLUDES += $(PRECOMPILED_HEADER_DIR:%=-I%) $(Src_Dirs_I:%=-I%)
62
63# SYMFLAG is used by {jsig,saproc}.make
64ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
65  # always build with debug info when we can create .dSYM/.debuginfo files
66  SYMFLAG = -g
67else
68  ifeq (${VERSION}, debug)
69    SYMFLAG = -g
70  else
71    SYMFLAG =
72  endif
73endif
74
75# HOTSPOT_RELEASE_VERSION and HOTSPOT_BUILD_VERSION are defined
76# in $(GAMMADIR)/make/defs.make
77ifeq ($(HOTSPOT_BUILD_VERSION),)
78  BUILD_VERSION = -DHOTSPOT_RELEASE_VERSION="\"$(HOTSPOT_RELEASE_VERSION)\""
79else
80  BUILD_VERSION = -DHOTSPOT_RELEASE_VERSION="\"$(HOTSPOT_RELEASE_VERSION)-$(HOTSPOT_BUILD_VERSION)\""
81endif
82
83# The following variables are defined in the generated flags.make file.
84BUILD_VERSION = -DHOTSPOT_RELEASE_VERSION="\"$(HS_BUILD_VER)\""
85JRE_VERSION   = -DJRE_RELEASE_VERSION="\"$(JRE_RELEASE_VER)\""
86HS_LIB_ARCH   = -DHOTSPOT_LIB_ARCH=\"$(LIBARCH)\"
87BUILD_TARGET  = -DHOTSPOT_BUILD_TARGET="\"$(TARGET)\""
88BUILD_USER    = -DHOTSPOT_BUILD_USER="\"$(HOTSPOT_BUILD_USER)\""
89VM_DISTRO     = -DHOTSPOT_VM_DISTRO="\"$(HOTSPOT_VM_DISTRO)\""
90
91CXXFLAGS =           \
92  ${SYSDEFS}         \
93  ${INCLUDES}        \
94  ${BUILD_VERSION}   \
95  ${BUILD_TARGET}    \
96  ${BUILD_USER}      \
97  ${HS_LIB_ARCH}     \
98  ${VM_DISTRO}
99
100# This is VERY important! The version define must only be supplied to vm_version.o
101# If not, ccache will not re-use the cache at all, since the version string might contain
102# a time and date.
103CXXFLAGS/vm_version.o += ${JRE_VERSION} ${VERSION_CFLAGS}
104CXXFLAGS/arguments.o += ${VERSION_CFLAGS}
105
106CXXFLAGS/BYFILE = $(CXXFLAGS/$@)
107
108# File specific flags
109CXXFLAGS += $(CXXFLAGS/BYFILE)
110
111ifneq ($(DEFAULT_LIBPATH),)
112CXXFLAGS += -DDEFAULT_LIBPATH="\"$(DEFAULT_LIBPATH)\""
113endif
114
115# CFLAGS_WARN holds compiler options to suppress/enable warnings.
116CFLAGS += $(CFLAGS_WARN/BYFILE)
117
118# Do not use C++ exception handling
119CFLAGS += $(CFLAGS/NOEX)
120
121# Extra flags from gnumake's invocation or environment
122CFLAGS += $(EXTRA_CFLAGS)
123LFLAGS += $(EXTRA_CFLAGS) $(EXTRA_LDFLAGS)
124ASFLAGS += $(EXTRA_ASFLAGS)
125
126# Don't set excutable bit on stack segment
127# the same could be done by separate execstack command
128# Darwin is non-executable-stack by default
129ifneq ($(OS_VENDOR), Darwin)
130LFLAGS += -Xlinker -z -Xlinker noexecstack
131endif
132
133LIBS += -lm
134
135LIBS += -pthread
136
137# By default, link the *.o into the library, not the executable.
138LINK_INTO$(LINK_INTO) = LIBJVM
139
140JDK_LIBDIR = $(JAVA_HOME)/jre/lib/$(LIBARCH)
141
142#----------------------------------------------------------------------
143# jvm_db & dtrace
144include $(MAKEFILES_DIR)/dtrace.make
145
146#----------------------------------------------------------------------
147# JVM
148
149JVM    = jvm
150ifeq ($(OS_VENDOR), Darwin)
151  LIBJVM   = lib$(JVM).dylib
152  CFLAGS  += -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE
153  ifeq (${VERSION}, $(filter ${VERSION}, debug fastdebug))
154    CFLAGS += -DALLOW_OPERATOR_NEW_USAGE
155  endif
156
157  LIBJVM_DEBUGINFO   = lib$(JVM).dylib.dSYM
158  LIBJVM_DIZ         = lib$(JVM).diz
159else
160  LIBJVM   = lib$(JVM).so
161
162  LIBJVM_DEBUGINFO   = lib$(JVM).debuginfo
163  LIBJVM_DIZ         = lib$(JVM).diz
164endif
165
166ifneq ($(ENABLE_JFR),true)
167EXCLUDE_JFR_PATHS:= -o -name jfr -prune
168endif
169SPECIAL_PATHS:=adlc c1 gc_implementation opto shark libadt
170
171SOURCE_PATHS=\
172  $(shell find $(HS_COMMON_SRC)/share/vm/* -type d \! \
173      \( -name DUMMY $(foreach dir,$(SPECIAL_PATHS),-o -name $(dir)) $(EXCLUDE_JFR_PATHS) \))
174SOURCE_PATHS+=$(HS_COMMON_SRC)/os/$(Platform_os_family)/vm
175SOURCE_PATHS+=$(HS_COMMON_SRC)/os/posix/vm
176SOURCE_PATHS+=$(HS_COMMON_SRC)/cpu/$(Platform_arch)/vm
177SOURCE_PATHS+=$(HS_COMMON_SRC)/os_cpu/$(Platform_os_arch)/vm
178
179CORE_PATHS=$(foreach path,$(SOURCE_PATHS),$(call altsrc,$(path)) $(path))
180CORE_PATHS+=$(GENERATED)/jvmtifiles $(GENERATED)/jfrfiles
181
182COMPILER1_PATHS := $(call altsrc,$(HS_COMMON_SRC)/share/vm/c1)
183COMPILER1_PATHS += $(HS_COMMON_SRC)/share/vm/c1
184
185COMPILER2_PATHS := $(call altsrc,$(HS_COMMON_SRC)/share/vm/opto)
186COMPILER2_PATHS += $(call altsrc,$(HS_COMMON_SRC)/share/vm/libadt)
187COMPILER2_PATHS += $(HS_COMMON_SRC)/share/vm/opto
188COMPILER2_PATHS += $(HS_COMMON_SRC)/share/vm/libadt
189COMPILER2_PATHS += $(GENERATED)/adfiles
190
191SHARK_PATHS := $(GAMMADIR)/src/share/vm/shark
192
193# Include dirs per type.
194Src_Dirs/CORE      := $(CORE_PATHS)
195Src_Dirs/COMPILER1 := $(CORE_PATHS) $(COMPILER1_PATHS)
196Src_Dirs/COMPILER2 := $(CORE_PATHS) $(COMPILER2_PATHS)
197Src_Dirs/TIERED    := $(CORE_PATHS) $(COMPILER1_PATHS) $(COMPILER2_PATHS)
198Src_Dirs/ZERO      := $(CORE_PATHS)
199Src_Dirs/SHARK     := $(CORE_PATHS) $(SHARK_PATHS)
200Src_Dirs := $(Src_Dirs/$(TYPE))
201
202COMPILER2_SPECIFIC_FILES := opto libadt bcEscapeAnalyzer.cpp c2_\* runtime_\*
203COMPILER1_SPECIFIC_FILES := c1_\*
204SHARK_SPECIFIC_FILES     := shark
205ZERO_SPECIFIC_FILES      := zero
206
207# Always exclude these.
208Src_Files_EXCLUDE += jsig.c jvmtiEnvRecommended.cpp jvmtiEnvStub.cpp
209
210# Exclude per type.
211Src_Files_EXCLUDE/CORE      := $(COMPILER1_SPECIFIC_FILES) $(COMPILER2_SPECIFIC_FILES) $(ZERO_SPECIFIC_FILES) $(SHARK_SPECIFIC_FILES) ciTypeFlow.cpp
212Src_Files_EXCLUDE/COMPILER1 := $(COMPILER2_SPECIFIC_FILES) $(ZERO_SPECIFIC_FILES) $(SHARK_SPECIFIC_FILES) ciTypeFlow.cpp
213Src_Files_EXCLUDE/COMPILER2 := $(COMPILER1_SPECIFIC_FILES) $(ZERO_SPECIFIC_FILES) $(SHARK_SPECIFIC_FILES)
214Src_Files_EXCLUDE/TIERED    := $(ZERO_SPECIFIC_FILES) $(SHARK_SPECIFIC_FILES)
215Src_Files_EXCLUDE/ZERO      := $(COMPILER1_SPECIFIC_FILES) $(COMPILER2_SPECIFIC_FILES) $(SHARK_SPECIFIC_FILES) ciTypeFlow.cpp
216Src_Files_EXCLUDE/SHARK     := $(COMPILER1_SPECIFIC_FILES) $(COMPILER2_SPECIFIC_FILES) $(ZERO_SPECIFIC_FILES)
217
218Src_Files_EXCLUDE +=  $(Src_Files_EXCLUDE/$(TYPE))
219
220# Special handling of arch model.
221ifeq ($(Platform_arch_model), x86_32)
222Src_Files_EXCLUDE += \*x86_64\*
223endif
224ifeq ($(Platform_arch_model), x86_64)
225Src_Files_EXCLUDE += \*x86_32\*
226endif
227
228# Locate all source files in the given directory, excluding files in Src_Files_EXCLUDE.
229define findsrc
230	$(notdir $(shell find $(1)/. ! -name . -prune \
231		-a \( -name \*.c -o -name \*.cpp -o -name \*.s \) \
232		-a ! \( -name DUMMY $(addprefix -o -name ,$(Src_Files_EXCLUDE)) \)))
233endef
234
235Src_Files := $(foreach e,$(Src_Dirs),$(call findsrc,$(e)))
236
237Obj_Files = $(sort $(addsuffix .o,$(basename $(Src_Files))))
238
239JVM_OBJ_FILES = $(Obj_Files)
240
241vm_version.o: $(filter-out vm_version.o,$(JVM_OBJ_FILES))
242
243mapfile : $(MAPFILE) vm.def mapfile_ext
244	rm -f $@
245	awk '{ if ($$0 ~ "INSERT VTABLE SYMBOLS HERE")	\
246                 { system ("cat mapfile_ext"); system ("cat vm.def"); } \
247               else					\
248                 { print $$0 }				\
249             }' > $@ < $(MAPFILE)
250
251mapfile_reorder : mapfile $(REORDERFILE)
252	rm -f $@
253	cat $^ > $@
254
255vm.def: $(Res_Files) $(Obj_Files)
256	sh $(GAMMADIR)/make/bsd/makefiles/build_vm_def.sh *.o > $@
257
258mapfile_ext:
259	rm -f $@
260	touch $@
261	if [ -f $(HS_ALT_MAKE)/bsd/makefiles/mapfile-ext ]; then \
262	  cat $(HS_ALT_MAKE)/bsd/makefiles/mapfile-ext > $@; \
263	fi
264
265STATIC_CXX = false
266
267ifeq ($(LINK_INTO),AOUT)
268  LIBJVM.o                 =
269  LIBJVM_MAPFILE           =
270  LIBS_VM                  = $(LIBS)
271else
272  LIBJVM.o                 = $(JVM_OBJ_FILES)
273  LIBJVM_MAPFILE$(LDNOMAP) = mapfile_reorder
274  LFLAGS_VM$(LDNOMAP)      += $(MAPFLAG:FILENAME=$(LIBJVM_MAPFILE))
275  LFLAGS_VM                += $(SONAMEFLAG:SONAME=$(LIBJVM))
276
277  ifeq ($(OS_VENDOR), Darwin)
278    LFLAGS_VM += -Xlinker -rpath -Xlinker @loader_path/.
279    LFLAGS_VM += -Xlinker -rpath -Xlinker @loader_path/..
280    LFLAGS_VM += -Xlinker -install_name -Xlinker @rpath/$(@F)
281  endif
282
283  # JVM is statically linked with libgcc[_s] and libstdc++; this is needed to
284  # get around library dependency and compatibility issues. Must use gcc not
285  # g++ to link.
286  ifeq ($(STATIC_CXX), true)
287    LFLAGS_VM              += $(STATIC_LIBGCC)
288    LIBS_VM                += $(STATIC_STDCXX)
289    LINK_VM                = $(LINK_LIB.CC)
290  else
291    LINK_VM                = $(LINK_LIB.CXX)
292  endif
293
294  LIBS_VM                  += $(LIBS)
295endif
296ifeq ($(JVM_VARIANT_ZERO), true)
297  LIBS_VM += $(LIBFFI_LIBS)
298endif
299ifeq ($(JVM_VARIANT_ZEROSHARK), true)
300  LIBS_VM   += $(LIBFFI_LIBS) $(LLVM_LIBS)
301  LFLAGS_VM += $(LLVM_LDFLAGS)
302endif
303
304
305# rule for building precompiled header
306$(PRECOMPILED_HEADER):
307	$(QUIETLY) echo Generating precompiled header $@
308	$(QUIETLY) mkdir -p $(PRECOMPILED_HEADER_DIR)
309	$(QUIETLY) $(COMPILE.CXX) $(DEPFLAGS) -x c++-header $(PRECOMPILED_HEADER_SRC) -o $@ $(COMPILE_DONE)
310
311# making the library:
312
313ifneq ($(JVM_BASE_ADDR),)
314# By default shared library is linked at base address == 0. Modify the
315# linker script if JVM prefers a different base location. It can also be
316# implemented with 'prelink -r'. But 'prelink' is not (yet) available on
317# our build platform (AS-2.1).
318LD_SCRIPT = libjvm.so.lds
319$(LD_SCRIPT): $(LIBJVM_MAPFILE)
320	$(QUIETLY) {                                                \
321	  rm -rf $@;                                                \
322	  $(LINK_VM) -Wl,--verbose $(LFLAGS_VM) 2>&1             |  \
323	    sed -e '/^======/,/^======/!d'                          \
324		-e '/^======/d'                                     \
325		-e 's/0\( + SIZEOF_HEADERS\)/$(JVM_BASE_ADDR)\1/'   \
326		> $@;                                               \
327	}
328LD_SCRIPT_FLAG = -Wl,-T,$(LD_SCRIPT)
329endif
330
331$(LIBJVM): $(LIBJVM.o) $(LIBJVM_MAPFILE) $(LD_SCRIPT)
332	$(QUIETLY) {                                                    \
333	    echo Linking vm...;                                         \
334	    $(LINK_LIB.CXX/PRE_HOOK)                                     \
335	    $(LINK_VM) $(LD_SCRIPT_FLAG)                                \
336		       $(LFLAGS_VM) -o $@ $(sort $(LIBJVM.o)) $(LIBS_VM); \
337	    $(LINK_LIB.CXX/POST_HOOK)                                    \
338	    rm -f $@.1; ln -s $@ $@.1;                                  \
339	}
340
341ifeq ($(ENABLE_FULL_DEBUG_SYMBOLS),1)
342  ifeq ($(OS_VENDOR), Darwin)
343	$(DSYMUTIL) $@
344    ifeq ($(ZIP_DEBUGINFO_FILES),1)
345	$(ZIPEXE) -q -r -y $(LIBJVM_DIZ) $(LIBJVM_DEBUGINFO)
346	$(RM) -r $(LIBJVM_DEBUGINFO)
347    endif
348  else
349    ifneq ($(STRIP_POLICY),no_strip)
350	$(QUIETLY) $(OBJCOPY) --only-keep-debug $@ $(LIBJVM_DEBUGINFO)
351	$(QUIETLY) $(OBJCOPY) --add-gnu-debuglink=$(LIBJVM_DEBUGINFO) $@
352    endif
353    ifeq ($(STRIP_POLICY),all_strip)
354	$(QUIETLY) $(STRIP) $@
355    else
356      ifeq ($(STRIP_POLICY),min_strip)
357	$(QUIETLY) $(STRIP) -g $@
358      # implied else here is no stripping at all
359      endif
360    endif
361    ifneq ($(STRIP_POLICY),no_strip)
362      ifeq ($(ZIP_DEBUGINFO_FILES),1)
363	$(ZIPEXE) -q -y $(LIBJVM_DIZ) $(LIBJVM_DEBUGINFO)
364	$(RM) $(LIBJVM_DEBUGINFO)
365      endif
366    endif
367  endif
368endif
369
370DEST_SUBDIR        = $(JDK_LIBDIR)/$(VM_SUBDIR)
371DEST_JVM           = $(DEST_SUBDIR)/$(LIBJVM)
372DEST_JVM_DEBUGINFO = $(DEST_SUBDIR)/$(LIBJVM_DEBUGINFO)
373DEST_JVM_DIZ       = $(DEST_SUBDIR)/$(LIBJVM_DIZ)
374
375install_jvm: $(LIBJVM)
376	@echo "Copying $(LIBJVM) to $(DEST_JVM)"
377ifeq ($(OS_VENDOR), Darwin)
378	$(QUIETLY) test -d $(LIBJVM_DEBUGINFO) && \
379	    cp -f -r $(LIBJVM_DEBUGINFO) $(DEST_JVM_DEBUGINFO)
380else
381	$(QUIETLY) test -f $(LIBJVM_DEBUGINFO) && \
382	    cp -f $(LIBJVM_DEBUGINFO) $(DEST_JVM_DEBUGINFO)
383endif
384	$(QUIETLY) test -f $(LIBJVM_DIZ) && \
385	    cp -f $(LIBJVM_DIZ) $(DEST_JVM_DIZ)
386	$(QUIETLY) cp -f $(LIBJVM) $(DEST_JVM) && echo "Done"
387
388#----------------------------------------------------------------------
389# Other files
390
391# Signal interposition library
392include $(MAKEFILES_DIR)/jsig.make
393
394# Serviceability agent
395include $(MAKEFILES_DIR)/saproc.make
396
397#----------------------------------------------------------------------
398
399ifeq ($(OS_VENDOR), Darwin)
400# no libjvm_db for macosx
401build: $(LIBJVM) $(LAUNCHER) $(LIBJSIG) $(BUILDLIBSAPROC) dtraceCheck
402	echo "Doing vm.make build:"
403else
404build: $(LIBJVM) $(LAUNCHER) $(LIBJSIG) $(LIBJVM_DB) $(BUILDLIBSAPROC)
405endif
406
407install: install_jvm install_jsig install_saproc
408
409.PHONY: default build install install_jvm
410