| # | |
| # Copyright (c) 2020, 2025, 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. | |
| # | |
| include MakeFileStart.gmk | |
| ################################################################################ | |
| # This makefile compiles and installs the hsdis library | |
| ################################################################################ | |
| include JdkNativeCompilation.gmk | |
| 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 | |
| .PHONY: build install | |
| ################################################################################ | |
| include MakeFileEnd.gmk |