|
| 1 | +# |
| 2 | +# Copyright (c) 2019, 2025, 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 | +.PHONY: clean build copy |
| 25 | + |
| 26 | +uname_m := $(shell uname -m) |
| 27 | +ifeq ($(uname_m),x86_64) |
| 28 | + ARCH_SUFFIX := amd64 |
| 29 | +else ifeq ($(uname_m),aarch64) |
| 30 | + ARCH_SUFFIX := aarch64 |
| 31 | +else |
| 32 | + $(error Unexpected architecture $(uname_m)) |
| 33 | +endif |
| 34 | + |
| 35 | +ifndef TARGET_FILE_FORMAT |
| 36 | + $(error TARGET_FILE_FORMAT is not set) |
| 37 | +endif |
| 38 | + |
| 39 | +ifndef DEBUG_LEVEL |
| 40 | + $(error DEBUG_LEVEL is not set) |
| 41 | +endif |
| 42 | + |
| 43 | +ifndef COMPRESSED_REFERENCES |
| 44 | + $(error COMPRESSED_REFERENCES is not set) |
| 45 | +endif |
| 46 | + |
| 47 | +# 'gmake MX_VERBOSE=y' or 'gmake QUIETLY=' gives all the gory details. |
| 48 | +QUIETLY$(MX_VERBOSE) = @ |
| 49 | + |
| 50 | +PROJECT_ROOT := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) |
| 51 | +BUILD_ROOT := $(CURDIR) |
| 52 | + |
| 53 | +INCLUDES.amd64 := -I$(PROJECT_ROOT)cpu/x86 -I$(PROJECT_ROOT)os_cpu/linux_x86 -I$(PROJECT_ROOT)mocks/cpu/x86 -I$(PROJECT_ROOT)mocks/os_cpu/linux_x86 |
| 54 | +INCLUDES.aarch64 := -I$(PROJECT_ROOT)cpu/aarch64 -I$(PROJECT_ROOT)os_cpu/linux_aarch64 -I$(PROJECT_ROOT)mocks/cpu/aarch64 -I$(PROJECT_ROOT)mocks/os_cpu/linux_aarch64 |
| 55 | +INCLUDES.common := -I$(PROJECT_ROOT) -I$(PROJECT_ROOT)os/linux -I$(PROJECT_ROOT)os/posix -I$(PROJECT_ROOT)os/posix/include \ |
| 56 | + -I$(PROJECT_ROOT)share -I$(PROJECT_ROOT)share/include -I$(PROJECT_ROOT)share/precompiled -I$(PROJECT_ROOT)share/utilities \ |
| 57 | + -I$(PROJECT_ROOT)mocks -I$(PROJECT_ROOT)mocks/os/linux -I$(PROJECT_ROOT)mocks/os/posix -I$(PROJECT_ROOT)mocks/share -I$(PROJECT_ROOT)mocks/share/include \ |
| 58 | + -I$(PROJECT_ROOT)svm -I$(PROJECT_ROOT)svm/share |
| 59 | +INCLUDES := $(INCLUDES.common) $(INCLUDES.$(ARCH_SUFFIX)) |
| 60 | + |
| 61 | +COMPRESSED_REFERENCE_DEFINES.true := -DSVM_COMPRESSED_REFERENCES |
| 62 | +COMPRESSED_REFERENCE_DEFINES.false := |
| 63 | +COMPRESSED_REFERENCE_DEFINES := $(COMPRESSED_REFERENCE_DEFINES.$(COMPRESSED_REFERENCES)) |
| 64 | + |
| 65 | +DEFINES.amd64 := -DINCLUDE_SUFFIX_CPU=_x86 -DAMD64 |
| 66 | +DEFINES.aarch64 := -DINCLUDE_SUFFIX_CPU=_aarch64 -DAARCH64 |
| 67 | +DEFINES.common := -DSVM $(COMPRESSED_REFERENCE_DEFINES) -DINCLUDE_SUFFIX_OS=_linux -DINCLUDE_SUFFIX_COMPILER=_gcc -DLINUX -D_LP64=1 -DINCLUDE_JVMCI=1 -DINCLUDE_JFR=0 -DINCLUDE_G1GC=0 \ |
| 68 | + -DINCLUDE_JVMTI=0 -DINCLUDE_SERVICES=0 -DINCLUDE_MANAGEMENT=0 -DINCLUDE_CDS=0 -DINCLUDE_CMSGC=0 -DINCLUDE_EPSILONGC=0 -DINCLUDE_PARALLELGC=0 -DINCLUDE_SERIALGC=0 -DINCLUDE_SHENANDOAHGC=0 -DINCLUDE_ZGC=0 -DINCLUDE_NMT=0 \ |
| 69 | + -DVM_LITTLE_ENDIAN -DIGNORE_CODE_RELATED_OOPS=1 -DTARGET_COMPILER_gcc -DSUPPORTS_CLOCK_MONOTONIC -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -D_FILE_OFFSET_BITS=64 -D_REENTRANT |
| 70 | +DEFINES := $(DEFINES.common) $(DEFINES.$(ARCH_SUFFIX)) |
| 71 | + |
| 72 | +# only use -fno-lifetime-dse if it is supported |
| 73 | +FNO_LIFETIME_DSE := $(shell $(CC) -fno-lifetime-dse -c /dev/null 2>/dev/null && echo -fno-lifetime-dse) |
| 74 | + |
| 75 | +CPPFLAGS.product := -O3 -DPRODUCT -DDEBUG_LEVEL='"product"' |
| 76 | +CPPFLAGS.notproduct := -O3 -DDEBUG_LEVEL='"notproduct"' |
| 77 | +CPPFLAGS.fastdebug := -g -O1 -DASSERT -DDEBUG_LEVEL='"fastdebug"' |
| 78 | +CPPFLAGS.debug := -g -O0 -DASSERT -DDEBUG_LEVEL='"debug"' |
| 79 | +CPPFLAGS := -fPIC -fno-rtti -fno-exceptions -fno-strict-aliasing -fno-omit-frame-pointer -fstack-protector $(FNO_LIFETIME_DSE) -std=c++14 $(CPPFLAGS.$(DEBUG_LEVEL)) |
| 80 | + |
| 81 | +TARGET_SPECIFIC_CPPFLAGS.so := -fvisibility=hidden |
| 82 | +TARGET_SPECIFIC_CPPFLAGS.a := |
| 83 | +CPPFLAGS += $(TARGET_SPECIFIC_CPPFLAGS.$(TARGET_FILE_FORMAT)) |
| 84 | + |
| 85 | +LDFLAGS.so := -shared -Wl,-z,noexecstack |
| 86 | +LDFLAGS.a := unused |
| 87 | +LDFLAGS := $(LDFLAGS.$(TARGET_FILE_FORMAT)) |
| 88 | + |
| 89 | +TARGET_EXT.so := .so |
| 90 | +TARGET_EXT.a := .a |
| 91 | +TARGET_EXT := $(TARGET_EXT.$(TARGET_FILE_FORMAT)) |
| 92 | + |
| 93 | +COMPRESSED_REFERENCES_SUFFIX.true := cr |
| 94 | +COMPRESSED_REFERENCES_SUFFIX.false := ur |
| 95 | +COMPRESSED_REFERENCES_SUFFIX := $(COMPRESSED_REFERENCES_SUFFIX.$(COMPRESSED_REFERENCES)) |
| 96 | + |
| 97 | +DEBUG_LEVEL_FILE_SUFFIX.product := |
| 98 | +DEBUG_LEVEL_FILE_SUFFIX.notproduct := -notproduct |
| 99 | +DEBUG_LEVEL_FILE_SUFFIX.fastdebug := -fastdebug |
| 100 | +DEBUG_LEVEL_FILE_SUFFIX.debug := -debug |
| 101 | +DEBUG_LEVEL_FILE_SUFFIX := $(DEBUG_LEVEL_FILE_SUFFIX.$(DEBUG_LEVEL)) |
| 102 | + |
| 103 | +BUILD_DIR := $(BUILD_ROOT)/$(DEBUG_LEVEL)-$(COMPRESSED_REFERENCES_SUFFIX)$(TARGET_EXT) |
| 104 | +TARGET_FILE := $(BUILD_ROOT)/libsvmgc$(DEBUG_LEVEL_FILE_SUFFIX)-$(COMPRESSED_REFERENCES_SUFFIX)$(TARGET_EXT) |
| 105 | + |
| 106 | +CPP_FILES_TO_EXCLUDE.amd64 := aarch64 |
| 107 | +CPP_FILES_TO_EXCLUDE.aarch64 := x86 |
| 108 | +CPP_FILES_TO_EXCLUDE := $(CPP_FILES_TO_EXCLUDE.$(ARCH_SUFFIX)) |
| 109 | + |
| 110 | +S_FILES_TO_EXCLUDE.amd64 := aarch64 |
| 111 | +S_FILES_TO_EXCLUDE.aarch64 := x86_64 |
| 112 | +S_FILES_TO_EXCLUDE := $(S_FILES_TO_EXCLUDE.$(ARCH_SUFFIX)) |
| 113 | + |
| 114 | +CPP_SOURCES := $(shell find $(PROJECT_ROOT) ! -name "*_$(CPP_FILES_TO_EXCLUDE).cpp" -name "*.cpp") |
| 115 | +CPP_OBJECTS := $(CPP_SOURCES:$(PROJECT_ROOT)%.cpp=$(BUILD_DIR)/%.o) |
| 116 | +CPP_DEPENDENCIES=$(CPP_OBJECTS:.o=.d) |
| 117 | + |
| 118 | +ASM_SOURCES += $(shell find $(PROJECT_ROOT) ! -name "*_$(S_FILES_TO_EXCLUDE).S" -name "*.S") |
| 119 | +ASM_OBJECTS := $(ASM_SOURCES:$(PROJECT_ROOT)%.S=$(BUILD_DIR)/%.o) |
| 120 | + |
| 121 | +-include $(CPP_DEPENDENCIES) |
| 122 | + |
| 123 | +build: $(BUILD_DIR) $(TARGET_FILE) |
| 124 | + |
| 125 | +clean: |
| 126 | + rm -rf $(BUILD_DIR) |
| 127 | + |
| 128 | +$(TARGET_FILE) : $(CPP_OBJECTS) $(ASM_OBJECTS) |
| 129 | + @echo Linking $(TARGET_FILE) |
| 130 | +ifeq ($(TARGET_FILE_FORMAT),a) |
| 131 | + $(QUIETLY) $(AR) cr $(TARGET_FILE) $^ |
| 132 | +else |
| 133 | + $(QUIETLY) $(CC) $^ -o $(TARGET_FILE) $(LDFLAGS) |
| 134 | +endif |
| 135 | + |
| 136 | +$(CPP_OBJECTS): $(BUILD_DIR)/%.o: %.cpp |
| 137 | + $(QUIETLY) mkdir -p $(@D) |
| 138 | + $(QUIETLY) $(CC) -Wno-format-zero-length -c -MD $(CPPFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ |
| 139 | + |
| 140 | +$(ASM_OBJECTS): $(BUILD_DIR)/%.o: %.S |
| 141 | + $(QUIETLY) mkdir -p $(@D) |
| 142 | + $(QUIETLY) $(CC) -c $(CPPFLAGS) $(INCLUDES) $(DEFINES) $< -o $@ |
| 143 | + |
| 144 | +$(BUILD_DIR): |
| 145 | + $(QUIETLY) mkdir -p $(BUILD_DIR) |
0 commit comments