# # Copyright (c) 2020, 2024, 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. # default: all include $(SPEC) include MakeBase.gmk include JdkNativeCompilation.gmk ################################################################################ # This makefile compiles and installs the hsdis library # ################################################################################ HSDIS_OUTPUT_DIR := $(SUPPORT_OUTPUTDIR)/hsdis REAL_HSDIS_NAME := hsdis-$(OPENJDK_TARGET_CPU_LEGACY_LIB)$(SHARED_LIBRARY_SUFFIX) BUILT_HSDIS_LIB := $(HSDIS_OUTPUT_DIR)/$(REAL_HSDIS_NAME) HSDIS_LINK_TYPE := C ifeq ($(HSDIS_BACKEND), capstone) ifeq ($(call isTargetCpuArch, x86), true) CAPSTONE_ARCH := CS_ARCH_X86 CAPSTONE_MODE := CS_MODE_$(OPENJDK_TARGET_CPU_BITS) else ifeq ($(call isTargetCpuArch, aarch64), true) CAPSTONE_ARCH := CS_ARCH_$(CAPSTONE_ARCH_AARCH64_NAME) CAPSTONE_MODE := CS_MODE_ARM else $(error No support for Capstone on this platform) endif HSDIS_CFLAGS += -DCAPSTONE_ARCH=$(CAPSTONE_ARCH) \ -DCAPSTONE_MODE=$(CAPSTONE_MODE) endif ifeq ($(HSDIS_BACKEND), llvm) # Use C++ instead of C HSDIS_LINK_TYPE := C++ ifeq ($(call isTargetOs, linux), true) LLVM_OS := pc-linux-gnu else ifeq ($(call isTargetOs, macosx), true) LLVM_OS := apple-darwin else ifeq ($(call isTargetOs, windows), true) LLVM_OS := pc-windows-msvc else $(error No support for LLVM on this platform) endif HSDIS_CFLAGS += -DLLVM_DEFAULT_TRIPLET='"$(OPENJDK_TARGET_CPU)-$(LLVM_OS)"' endif ifeq ($(HSDIS_BACKEND), binutils) ifeq ($(call isTargetOs, windows), true) # On windows, we need to "fake" a completely different toolchain using gcc # instead of the normal microsoft toolchain. This is quite hacky... MINGW_BASE := x86_64-w64-mingw32 MINGW_SYSROOT = $(shell $(MINGW_BASE)-gcc -print-sysroot) ifeq ($(wildcard $(MINGW_SYSROOT)), ) # Use fallback path MINGW_SYSROOT := /usr/$(MINGW_BASE) ifeq ($(wildcard $(MINGW_SYSROOT)), ) $(error mingw sysroot not found) endif endif BUILD_HSDIS_CC := $(MINGW_BASE)-gcc BUILD_HSDIS_LD := $(MINGW_BASE)-ld BUILD_HSDIS_OBJCOPY := $(MINGW_BASE)-objcopy BUILD_HSDIS_SYSROOT_CFLAGS := --sysroot=$(MINGW_SYSROOT) BUILD_HSDIS_SYSROOT_LDFLAGS := --sysroot=$(MINGW_SYSROOT) MINGW_SYSROOT_LIB_PATH := $(MINGW_SYSROOT)/mingw/lib ifeq ($(wildcard $(MINGW_SYSROOT_LIB_PATH)), ) # Try without mingw MINGW_SYSROOT_LIB_PATH := $(MINGW_SYSROOT)/lib ifeq ($(wildcard $(MINGW_SYSROOT_LIB_PATH)), ) $(error mingw sysroot lib path not found) endif endif MINGW_VERSION = $(shell $(MINGW_BASE)-gcc -v 2>&1 | $(GREP) "gcc version" | $(CUT) -d " " -f 3) MINGW_GCC_LIB_PATH := /usr/lib/gcc/$(MINGW_BASE)/$(MINGW_VERSION) ifeq ($(wildcard $(MINGW_GCC_LIB_PATH)), ) # Try using only major version number MINGW_VERSION_MAJOR := $(firstword $(subst ., , $(MINGW_VERSION))) MINGW_GCC_LIB_PATH := /usr/lib/gcc/$(MINGW_BASE)/$(MINGW_VERSION_MAJOR) ifeq ($(wildcard $(MINGW_GCC_LIB_PATH)), ) $(error mingw gcc lib path not found) endif endif TOOLCHAIN_TYPE := gcc OPENJDK_TARGET_OS := linux OPENJDK_TARGET_OS_TYPE := unix CC_OUT_OPTION := -o$(SPACE) GENDEPS_FLAGS := -MMD -MF CFLAGS_DEBUG_SYMBOLS := -g DISABLED_WARNINGS := DISABLE_WARNING_PREFIX := -Wno- CFLAGS_WARNINGS_ARE_ERRORS := -Werror SHARED_LIBRARY_FLAGS := -shared HSDIS_TOOLCHAIN_DEFAULT_CFLAGS := false HSDIS_TOOLCHAIN_DEFAULT_LDFLAGS := false HSDIS_LDFLAGS += -L$(MINGW_GCC_LIB_PATH) -L$(MINGW_SYSROOT_LIB_PATH) MINGW_DLLCRT := $(MINGW_SYSROOT_LIB_PATH)/dllcrt2.o HSDIS_TOOLCHAIN_LIBS := $(MINGW_DLLCRT) -lmingw32 -lgcc -lgcc_eh -lmoldname \ -lmingwex -lmsvcrt -lpthread -ladvapi32 -lshell32 -luser32 -lkernel32 else HSDIS_TOOLCHAIN_LIBS := -ldl endif endif ################################################################################ ## Build libhsdis ################################################################################ $(eval $(call SetupJdkLibrary, BUILD_HSDIS, \ NAME := hsdis, \ LINK_TYPE := $(HSDIS_LINK_TYPE), \ SRC := $(TOPDIR)/src/utils/hsdis/$(HSDIS_BACKEND), \ EXTRA_HEADER_DIRS := \ java.base:include \ $(TOPDIR)/src/utils/hsdis, \ OUTPUT_DIR := $(HSDIS_OUTPUT_DIR), \ OBJECT_DIR := $(HSDIS_OUTPUT_DIR), \ DISABLED_WARNINGS_gcc := undef format-nonliteral sign-compare, \ DISABLED_WARNINGS_clang := undef format-nonliteral, \ DEFAULT_CFLAGS := $(HSDIS_TOOLCHAIN_DEFAULT_CFLAGS), \ CFLAGS := $(HSDIS_CFLAGS), \ CXXFLAGS := $(HSDIS_CFLAGS), \ LD_SET_ORIGIN := false, \ DEFAULT_LDFLAGS := $(HSDIS_TOOLCHAIN_DEFAULT_LDFLAGS), \ LDFLAGS := $(HSDIS_LDFLAGS) $(SHARED_LIBRARY_FLAGS), \ LIBS := $(HSDIS_LIBS) $(HSDIS_TOOLCHAIN_LIBS), \ )) $(BUILT_HSDIS_LIB): $(BUILD_HSDIS_TARGET) $(install-file) build: $(BUILD_HSDIS) $(BUILT_HSDIS_LIB) TARGETS += build ifeq ($(ENABLE_HSDIS_BUNDLING), false) ifeq ($(call isTargetOs, windows), true) JDK_HSDIS_DIR := $(JDK_OUTPUTDIR)/bin IMAGE_HSDIS_DIR := $(JDK_IMAGE_DIR)/bin else JDK_HSDIS_DIR := $(JDK_OUTPUTDIR)/lib IMAGE_HSDIS_DIR := $(JDK_IMAGE_DIR)/lib endif INSTALLED_HSDIS_JDK := $(JDK_HSDIS_DIR)/$(REAL_HSDIS_NAME) INSTALLED_HSDIS_IMAGE := $(IMAGE_HSDIS_DIR)/$(REAL_HSDIS_NAME) $(INSTALLED_HSDIS_JDK): $(BUILT_HSDIS_LIB) ifeq ($(HSDIS_BACKEND), binutils) $(call LogWarn, NOTE: The resulting build might not be redistributable. Seek legal advice before distributing.) endif $(install-file) $(INSTALLED_HSDIS_IMAGE): $(BUILT_HSDIS_LIB) $(install-file) install: $(INSTALLED_HSDIS_JDK) $(INSTALLED_HSDIS_IMAGE) else install: $(ECHO) NOTE: make install-hsdis is a no-op with --enable-hsdis-bundling endif TARGETS += install ################################################################################ all: $(TARGETS) .PHONY: all default build install