Path: blob/master/runtime/compiler/build/toolcfg/gnu/common.mk
12639 views
# Copyright (c) 2000, 2021 IBM Corp. and others
#
# This program and the accompanying materials are made available under
# the terms of the Eclipse Public License 2.0 which accompanies this
# distribution and is available at https://www.eclipse.org/legal/epl-2.0/
# or the Apache License, Version 2.0 which accompanies this distribution and
# is available at https://www.apache.org/licenses/LICENSE-2.0.
#
# This Source Code may also be made available under the following
# Secondary Licenses when the conditions for such availability set
# forth in the Eclipse Public License, v. 2.0 are satisfied: GNU
# General Public License, version 2 with the GNU Classpath
# Exception [1] and GNU General Public License, version 2 with the
# OpenJDK Assembly Exception [2].
#
# [1] https://www.gnu.org/software/classpath/license.html
# [2] http://openjdk.java.net/legal/assembly-exception.html
#
# SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception
#
# Explicitly set shell
#
SHELL=/bin/sh
#
# These are the prefixes and suffixes that all GNU tools use for things
#
OBJSUFF=.o
ARSUFF=.a
ifeq ($(OS),osx)
SOSUFF=.dylib
DBGSUFF=$(SOSUFF).dSYM
else
SOSUFF=.so
DBGSUFF=.debuginfo
endif
EXESUFF=
LIBPREFIX=lib
DEPSUFF=.depend.mk
#
# Paths for default programs on the platform
# Most rules will use these default programs, but they can be overwritten individually if,
# for example, you want to compile .spp files with a different C++ compiler than you use
# to compile .cpp files
#
# Use default AR=ar
# Use default AS=as
M4?=m4
SED?=sed
PERL?=perl
ifeq ($(OS),osx)
DSYMUTIL?=dsymutil
else
OBJCOPY?=objcopy
endif
#
# z/Architecture arch and tune level
#
ARCHLEVEL?=z9-109
TUNELEVEL?=z10
ifeq ($(C_COMPILER),gcc)
ifeq (default,$(origin CC))
CC=gcc
endif
# Use default CXX=g++
endif
ifeq ($(C_COMPILER),clang)
ifeq (default,$(origin CC))
CC=clang
endif
ifeq (default,$(origin CXX))
CXX=clang++
endif
endif
# This is the script to preprocess ARM assembly files
ARMASM_SCRIPT?=$(JIT_SCRIPT_DIR)/armasm2gas.sed
# This is the command to check Z assembly files
ZASM_SCRIPT?=$(JIT_SCRIPT_DIR)/s390m4check.pl
#
# First setup C and C++ compilers.
#
# Note: "CX" means both C and C++
#
CX_DEFINES+=\
$(PRODUCT_DEFINES) \
$(HOST_DEFINES) \
$(TARGET_DEFINES) \
SUPPORTS_THREAD_LOCAL \
_LONG_LONG
# Explicitly set the C standard we compile against
# Clang defaults to gnu99 (vs GCC's gnu89) unless explicitly overridden
C_FLAGS+=\
-std=gnu89
CX_FLAGS+=\
-pthread \
-fomit-frame-pointer \
-fasynchronous-unwind-tables \
-Wreturn-type \
-fno-strict-aliasing \
-fstack-protector
ifneq ($(J9VM_OPT_JITSERVER),)
CXX_FLAGS+=\
-std=c++11
else
CXX_FLAGS+=\
-std=c++0x
endif
CXX_FLAGS+=\
-fno-rtti \
-fno-threadsafe-statics \
-Wno-deprecated \
-Wno-enum-compare \
-Wno-invalid-offsetof \
-Wno-write-strings
CX_DEFINES_DEBUG+=DEBUG
CX_FLAGS_DEBUG+=-ggdb3
CX_DEFAULTOPT=-O3
CX_OPTFLAG?=$(CX_DEFAULTOPT)
CX_FLAGS_PROD+=$(CX_OPTFLAG)
ifeq ($(HOST_ARCH),x)
CX_FLAGS+=-mfpmath=sse -msse -msse2 -fno-math-errno -fno-trapping-math
ifeq ($(HOST_BITS),32)
CX_FLAGS+=-m32 -fpic
endif
ifeq ($(HOST_BITS),64)
CX_DEFINES+=J9HAMMER
CX_FLAGS+=-m64 -fPIC
endif
endif
ifeq ($(HOST_ARCH),p)
CX_DEFAULTOPT=-O2
CX_FLAGS+=-fpic
ifeq ($(HOST_BITS),32)
CX_DEFINES+=LINUXPPC USING_ANSI
CX_FLAGS+=-m32
CX_FLAGS_PROD+=-mcpu=powerpc
endif
ifeq ($(HOST_BITS),64)
CX_DEFINES+=LINUXPPC LINUXPPC64 USING_ANSI
CX_FLAGS_PROD+=-mcpu=powerpc64
endif
ifdef ENABLE_SIMD_LIB
CX_DEFINES+=ENABLE_SPMD_SIMD
CX_FLAGS+=-qaltivec -qarch=pwr7 -qtune=pwr7
endif
endif
ifeq ($(HOST_ARCH),z)
ifeq ($(HOST_BITS),32)
CX_DEFINES+=J9VM_TIERED_CODE_CACHE MAXMOVE S390 FULL_ANSI
CX_FLAGS+=-m31 -fPIC -march=$(ARCHLEVEL) -mtune=$(TUNELEVEL) -mzarch
endif
ifeq ($(HOST_BITS),64)
CX_DEFINES+=S390 S39064 FULL_ANSI MAXMOVE J9VM_TIERED_CODE_CACHE
CX_FLAGS+=-fPIC -march=$(ARCHLEVEL) -mtune=$(TUNELEVEL) -mzarch
endif
CX_FLAGS_DEBUG+=-gdwarf-2
endif
ifeq ($(HOST_ARCH),arm)
CX_DEFINES+=ARMGNU ARMGNUEABI FIXUP_UNALIGNED HARDHAT __STDC_LIMIT_MACROS
CX_FLAGS+=-fPIC -mfloat-abi=hard -mfpu=vfp -march=armv6 -marm
endif
ifeq ($(HOST_ARCH),aarch64)
CX_FLAGS+=-fPIC
endif
ifeq ($(C_COMPILER),clang)
CX_FLAGS+=-Wno-parentheses -Werror=header-guard
endif
ifeq ($(BUILD_CONFIG),debug)
CX_DEFINES+=$(CX_DEFINES_DEBUG)
CX_FLAGS+=$(CX_FLAGS_DEBUG)
endif
ifeq ($(BUILD_CONFIG),prod)
CX_DEFINES+=$(CX_DEFINES_PROD)
CX_FLAGS+=$(CX_FLAGS_PROD)
endif
C_CMD?=$(CC)
C_INCLUDES=$(PRODUCT_INCLUDES)
C_DEFINES+=$(CX_DEFINES) $(CX_DEFINES_EXTRA) $(C_DEFINES_EXTRA)
C_FLAGS+=$(CX_FLAGS) $(CX_FLAGS_EXTRA) $(C_FLAGS_EXTRA)
CXX_CMD?=$(CXX)
CXX_INCLUDES=$(PRODUCT_INCLUDES)
CXX_DEFINES+=$(CX_DEFINES) $(CX_DEFINES_EXTRA) $(CXX_DEFINES_EXTRA)
CXX_FLAGS+=$(CX_FLAGS) $(CX_FLAGS_EXTRA) $(CXX_FLAGS_EXTRA)
#
# Now setup GAS
#
S_CMD?=$(AS)
S_INCLUDES=$(PRODUCT_INCLUDES)
S_DEFINES+=$(HOST_DEFINES) $(TARGET_DEFINES)
S_DEFINES_DEBUG+=DEBUG
S_FLAGS+=--noexecstack
S_FLAGS_DEBUG+=--gstabs+ -g
ifeq ($(HOST_ARCH),p)
S_FLAGS+=-maltivec
ifeq ($(HOST_BITS),32)
S_FLAGS+=-a32 -mppc
endif
ifeq ($(HOST_BITS),64)
S_FLAGS+=-a64 -mppc64
endif
endif
ifeq ($(HOST_ARCH),z)
ifeq ($(HOST_BITS),32)
S_FLAGS+=-m31 -mzarch -march=$(ARCHLEVEL)
endif
ifeq ($(HOST_BITS),64)
S_FLAGS+=-march=$(ARCHLEVEL) -mzarch
endif
endif
ifeq ($(HOST_ARCH),arm)
S_FLAGS+=-mfloat-abi=hard -mfpu=vfp
endif
ifeq ($(BUILD_CONFIG),debug)
S_DEFINES+=$(S_DEFINES_DEBUG)
S_FLAGS+=$(S_FLAGS_DEBUG)
endif
ifeq ($(BUILD_CONFIG),prod)
S_DEFINES+=$(S_DEFINES_PROD)
S_FLAGS+=$(S_FLAGS_PROD)
endif
S_DEFINES+=$(S_DEFINES_EXTRA)
S_FLAGS+=$(S_FLAGS_EXTRA)
ifeq ($(HOST_ARCH),x)
#
# Setup NASM
#
NASM_CMD?=nasm
NASM_DEFINES=\
TR_HOST_X86 \
TR_TARGET_X86
ifeq ($(OS),osx)
NASM_DEFINES+=\
OSX
else
NASM_DEFINES+=\
LINUX
endif
NASM_INCLUDES=\
$(J9SRC)/oti \
$(J9SRC)/compiler \
$(J9SRC)/compiler/x/runtime
ifeq ($(HOST_BITS),32)
NASM_OBJ_FORMAT=-felf32
NASM_DEFINES+=\
TR_HOST_32BIT \
TR_TARGET_32BIT
NASM_INCLUDES+=\
$(J9SRC)/compiler/x/i386/runtime
else
ifeq ($(OS),osx)
NASM_OBJ_FORMAT=-fmacho64
else
NASM_OBJ_FORMAT=-felf64
endif
NASM_DEFINES+=\
TR_HOST_64BIT \
TR_TARGET_64BIT
NASM_INCLUDES+=\
$(J9SRC)/compiler/x/amd64/runtime
endif
endif # HOST_ARCH == x
#
# Setup CPP and SED to preprocess PowerPC Assembly Files
#
ifeq ($(HOST_ARCH),p)
IPP_CMD=$(SED)
ifeq ($(BUILD_CONFIG),debug)
IPP_FLAGS+=$(IPP_FLAGS_DEBUG)
endif
ifeq ($(BUILD_CONFIG),prod)
IPP_FLAGS+=$(IPP_FLAGS_PROD)
endif
IPP_FLAGS+=$(IPP_FLAGS_EXTRA)
SPP_CMD=$(CC)
SPP_INCLUDES=$(PRODUCT_INCLUDES)
SPP_DEFINES+=$(CX_DEFINES) $(SPP_DEFINES_EXTRA)
SPP_FLAGS+=$(CX_FLAGS)
ifeq ($(BUILD_CONFIG),debug)
SPP_FLAGS+=$(SPP_FLAGS_DEBUG)
endif
ifeq ($(BUILD_CONFIG),prod)
SPP_FLAGS+=$(SPP_FLAGS_PROD)
endif
SPP_FLAGS+=$(SPP_FLAGS_EXTRA)
endif
#
# Now we setup M4 to preprocess Z assembly files
#
ifeq ($(HOST_ARCH),z)
M4_CMD?=$(M4)
M4_INCLUDES=$(PRODUCT_INCLUDES)
M4_DEFINES+=$(HOST_DEFINES) $(TARGET_DEFINES)
ifeq ($(BUILD_CONFIG),debug)
M4_DEFINES+=$(M4_DEFINES_DEBUG)
M4_FLAGS+=$(M4_FLAGS_DEBUG)
endif
ifeq ($(BUILD_CONFIG),prod)
M4_DEFINES+=$(M4_DEFINES_PROD)
M4_FLAGS+=$(M4_FLAGS_PROD)
endif
M4_DEFINES+=$(M4_DEFINES_EXTRA)
M4_FLAGS+=$(M4_FLAGS_EXTRA)
endif
#
# Now setup stuff for ARM assembly
#
ifeq ($(HOST_ARCH),arm)
ARMASM_CMD?=$(SED)
SPP_CMD?=$(CC)
SPP_INCLUDES=$(PRODUCT_INCLUDES)
SPP_DEFINES+=$(CX_DEFINES)
SPP_FLAGS+=$(CX_FLAGS)
ifeq ($(BUILD_CONFIG),debug)
SPP_DEFINES+=$(SPP_DEFINES_DEBUG)
SPP_FLAGS+=$(SPP_FLAGS_DEBUG)
endif
ifeq ($(BUILD_CONFIG),prod)
SPP_DEFINES+=$(SPP_DEFINES_PROD)
SPP_FLAGS+=$(SPP_FLAGS_PROD)
endif
SPP_DEFINES+=$(SPP_DEFINES_EXTRA)
SPP_FLAGS+=$(SPP_FLAGS_EXTRA)
endif # HOST_ARCH == arm
#
# Setup CPP to preprocess AArch64 Assembly Files
#
ifeq ($(HOST_ARCH),aarch64)
SPP_CMD=$(CC)
SPP_INCLUDES=$(PRODUCT_INCLUDES)
SPP_DEFINES+=$(CX_DEFINES)
SPP_FLAGS+=$(CX_FLAGS)
ifeq ($(BUILD_CONFIG),debug)
SPP_FLAGS+=$(SPP_FLAGS_DEBUG)
endif
ifeq ($(BUILD_CONFIG),prod)
SPP_FLAGS+=$(SPP_FLAGS_PROD)
endif
SPP_DEFINES+=$(SPP_DEFINES_EXTRA)
SPP_FLAGS+=$(SPP_FLAGS_EXTRA)
endif # HOST_ARCH == aarch64
#
# Finally setup the linker
#
SOLINK_CMD?=$(CXX)
SOLINK_LIBPATH+=$(PRODUCT_LIBPATH)
SOLINK_SLINK+=$(PRODUCT_SLINK) j9thr$(J9_VERSION) j9hookable$(J9_VERSION)
ifeq ($(HOST_ARCH),z)
CX_DEFINES+=COMPRESS_AOT_DATA
SOLINK_SLINK+=j9zlib$(J9_VERSION)
endif
ifeq ($(HOST_ARCH),x)
ifeq ($(HOST_BITS),32)
SOLINK_FLAGS+=-m32
SOLINK_SLINK+=dl m omrsig
endif
ifeq ($(HOST_BITS),64)
SOLINK_FLAGS+=-m64
SOLINK_SLINK+=dl m
endif
# Using the linker option -static-libgcc results in an error on OSX. The option -static-libstdc++ is unused. Therefore
# these options have been excluded from OSX
ifneq ($(OS),osx)
SUPPORT_STATIC_LIBCXX = $(shell $(SOLINK_CMD) -static-libstdc++ 2>&1 | grep "unrecognized option" > /dev/null; echo $$?)
ifneq ($(SUPPORT_STATIC_LIBCXX),0)
SOLINK_FLAGS+=-static-libgcc -static-libstdc++
endif
endif
ifeq ($(OS),osx)
SOLINK_FLAGS+=-install_name @rpath/lib$(PRODUCT_NAME).dylib
SOLINK_FLAGS+=-compatibility_version 1.0.0 -current_version 1.0.0
endif
endif
ifeq ($(HOST_ARCH),p)
ifeq ($(HOST_BITS),32)
SOLINK_FLAGS+=-m32 -fpic
SOLINK_SLINK+=dl m
endif
ifeq ($(HOST_BITS),64)
SOLINK_FLAGS+=-m64 -fpic
SOLINK_SLINK+=dl m pthread
endif
SUPPORT_STATIC_LIBCXX = $(shell $(SOLINK_CMD) -static-libstdc++ 2>&1 | grep "unrecognized option" > /dev/null; echo $$?)
ifneq ($(SUPPORT_STATIC_LIBCXX),0)
SOLINK_FLAGS+=-static-libgcc -static-libstdc++
endif
endif
ifeq ($(HOST_ARCH),z)
ifeq ($(HOST_BITS),32)
SOLINK_FLAGS+=-m31
endif
SUPPORT_STATIC_LIBCXX = $(shell $(SOLINK_CMD) -static-libstdc++ 2>&1 | grep "unrecognized option" > /dev/null; echo $$?)
ifneq ($(SUPPORT_STATIC_LIBCXX),0)
SOLINK_FLAGS+=-static-libgcc -static-libstdc++
endif
endif
ifeq ($(HOST_ARCH),aarch64)
SUPPORT_STATIC_LIBCXX = $(shell $(SOLINK_CMD) -static-libstdc++ 2>&1 | grep "unrecognized option" > /dev/null; echo $$?)
ifneq ($(SUPPORT_STATIC_LIBCXX),0)
SOLINK_FLAGS+=-static-libgcc -static-libstdc++
endif
endif
ifeq ($(HOST_ARCH),arm)
SOLINK_SLINK+=c m gcc_s
endif
ifeq ($(BUILD_CONFIG),debug)
SOLINK_FLAGS+=$(SOLINK_FLAGS_DEBUG)
endif
ifeq ($(BUILD_CONFIG),prod)
SOLINK_FLAGS+=$(SOLINK_FLAGS_PROD)
endif
# Determine which export script to use depending on whether debug symbols are on
SOLINK_VERSION_SCRIPT=$(JIT_SCRIPT_DIR)/j9jit.linux.exp
ifeq ($(ASSUMES),1)
SOLINK_VERSION_SCRIPT=$(JIT_SCRIPT_DIR)/j9jit.linux.debug.exp
endif
ifeq ($(BUILD_CONFIG),debug)
SOLINK_VERSION_SCRIPT=$(JIT_SCRIPT_DIR)/j9jit.linux.debug.exp
endif
ifeq ($(OS),linux)
SOLINK_EXTRA_ARGS+=-Wl,-soname=libj9jit29.so
SOLINK_EXTRA_ARGS+=-Wl,--version-script=$(SOLINK_VERSION_SCRIPT)
endif
SOLINK_FLAGS+=$(SOLINK_FLAGS_EXTRA)
ifneq ($(J9VM_OPT_JITSERVER),)
ifneq ($(OPENSSL_CFLAGS),)
C_FLAGS+=$(OPENSSL_CFLAGS)
CXX_FLAGS+=$(OPENSSL_CFLAGS)
endif
# --with-openssl=fetched --enable-openssl-bundling
ifneq ($(OPENSSL_BUNDLE_LIB_PATH),)
SOLINK_FLAGS+=-Wl,-rpath,\$$ORIGIN/..
C_INCLUDES+=$(OPENSSL_BUNDLE_LIB_PATH)
CXX_INCLUDES+=$(OPENSSL_BUNDLE_LIB_PATH)
# --with-openssl=fetched only
else ifneq ($(OPENSSL_DIR),)
C_INCLUDES+=$(OPENSSL_DIR)
CXX_INCLUDES+=$(OPENSSL_DIR)
endif
endif # J9VM_OPT_JITSERVER