ifndef _AUTO_MK
_AUTO_MK :=
ifeq ($(CROSS_PREFIX),)
ARCH := $(shell uname -m)
ifeq ($(ARCH),arm64)
ARCH := aarch64
endif
else ifneq ($(findstring x86_64, $(CROSS_PREFIX)),)
ARCH := x86_64
else ifneq ($(findstring aarch64_be, $(CROSS_PREFIX)),)
ARCH := aarch64_be
else ifneq ($(findstring aarch64, $(CROSS_PREFIX)),)
ARCH := aarch64
else ifneq ($(findstring riscv64, $(CROSS_PREFIX)),)
ARCH := riscv64
else ifneq ($(findstring riscv32, $(CROSS_PREFIX)),)
ARCH := riscv32
else ifneq ($(findstring powerpc64le, $(CROSS_PREFIX)),)
ARCH := powerpc64le
else ifneq ($(findstring arm-none-eabi-, $(CROSS_PREFIX)),)
ARCH := arm
else
ifeq ($(AUTO),1)
$(warning Unknown cross-compilation prefix $(CROSS_PREFIX), no automatic detection of CFLAGS.)
ARCH := unknown
endif
endif
endif
ifeq ($(ARCH),x86_64)
MK_COMPILER_SUPPORTS_AVX2 ?= $(shell echo 'int main() { __asm__("vpxor %%ymm0, %%ymm1, %%ymm2" ::: "ymm0", "ymm1", "ymm2"); return 0; }' | $(CC) -mavx2 -x c - -c -o /dev/null 2>/dev/null && echo 1 || echo 0)
MK_COMPILER_SUPPORTS_SSE2 ?= $(shell echo 'int main() { __asm__("pxor %%xmm0, %%xmm1" ::: "xmm0", "xmm1"); return 0; }' | $(CC) -msse2 -x c - -c -o /dev/null 2>/dev/null && echo 1 || echo 0)
MK_COMPILER_SUPPORTS_BMI2 ?= $(shell echo 'int main() { __asm__("pdep %%eax, %%ebx, %%ecx" ::: "eax", "ebx", "ecx"); return 0; }' | $(CC) -mbmi2 -x c - -c -o /dev/null 2>/dev/null && echo 1 || echo 0)
endif
ifeq ($(ARCH),aarch64)
MK_COMPILER_SUPPORTS_SHA3 ?= $(shell echo 'int main() { __asm__("eor3 v0.16b, v1.16b, v2.16b, v3.16b" ::: "v0", "v1", "v2", "v3"); return 0; }' | $(CC) -march=armv8.4-a+sha3 -x c - -c -o /dev/null 2>/dev/null && echo 1 || echo 0)
endif
ifeq ($(ARCH),riscv64)
MK_COMPILER_SUPPORTS_RVV ?= $(shell echo 'int main() { __asm__("vadd.vv v0, v1, v2"); return 0; }' | $(CC) -march=rv64gcv -x c - -c -o /dev/null 2>/dev/null && echo 1 || echo 0)
endif
HOST_PLATFORM ?= $(shell uname -s)-$(shell uname -m)
define check_host_feature
$(shell $(2) 2>/dev/null | grep -q "$(1)" && echo 1 || echo 0)
endef
ifeq ($(ARCH),x86_64)
ifeq ($(HOST_PLATFORM),Linux-x86_64)
MK_HOST_SUPPORTS_AVX2 := $(call check_host_feature,avx2,cat /proc/cpuinfo)
MK_HOST_SUPPORTS_SSE2 := $(call check_host_feature,sse2,cat /proc/cpuinfo)
MK_HOST_SUPPORTS_BMI2 := $(call check_host_feature,bmi2,cat /proc/cpuinfo)
else ifeq ($(HOST_PLATFORM),Darwin-x86_64)
MK_HOST_SUPPORTS_AVX2 := $(call check_host_feature,AVX2,sysctl -n machdep.cpu.leaf7_features)
MK_HOST_SUPPORTS_SSE2 := $(call check_host_feature,SSE2,sysctl -n machdep.cpu.features)
MK_HOST_SUPPORTS_BMI2 := $(call check_host_feature,BMI2,sysctl -n machdep.cpu.leaf7_features)
else ifneq ($(CROSS_PREFIX),)
MK_HOST_SUPPORTS_AVX2 := 1
MK_HOST_SUPPORTS_SSE2 := 1
MK_HOST_SUPPORTS_BMI2 := 1
else
MK_HOST_SUPPORTS_AVX2 := 0
MK_HOST_SUPPORTS_SSE2 := 0
MK_HOST_SUPPORTS_BMI2 := 0
endif
endif
ifeq ($(ARCH),aarch64)
ifeq ($(HOST_PLATFORM),Linux-aarch64)
MK_HOST_SUPPORTS_SHA3 := $(call check_host_feature,sha3,cat /proc/cpuinfo)
else ifeq ($(HOST_PLATFORM),Darwin-arm64)
MK_HOST_SUPPORTS_SHA3 := $(call check_host_feature,1,sysctl -n hw.optional.armv8_2_sha3)
else ifneq ($(CROSS_PREFIX),)
MK_HOST_SUPPORTS_SHA3 := 1
else
MK_HOST_SUPPORTS_SHA3 := 0
endif
endif
ifeq ($(ARCH),riscv64)
ifeq ($(HOST_PLATFORM),Linux-riscv64)
MK_HOST_SUPPORTS_RVV := $(shell sed -n '/^isa/{s/.*rv64//;s/_.*//;p;q}' /proc/cpuinfo 2>/dev/null | grep -q v && echo 1 || echo 0)
else ifneq ($(CROSS_PREFIX),)
MK_HOST_SUPPORTS_RVV := 1
else
MK_HOST_SUPPORTS_RVV := 0
endif
endif
ifeq ($(AUTO),1)
ifeq ($(ARCH),x86_64)
CFLAGS += -DMLD_FORCE_X86_64
ifeq ($(MK_COMPILER_SUPPORTS_AVX2)$(MK_HOST_SUPPORTS_AVX2),11)
CFLAGS += -mavx2
endif
ifeq ($(MK_COMPILER_SUPPORTS_BMI2)$(MK_HOST_SUPPORTS_BMI2),11)
CFLAGS += -mbmi2
endif
endif
ifeq ($(ARCH),aarch64)
CFLAGS += -DMLD_FORCE_AARCH64
ifeq ($(MK_COMPILER_SUPPORTS_SHA3)$(MK_HOST_SUPPORTS_SHA3),11)
CFLAGS += -march=armv8.4-a+sha3
endif
endif
ifeq ($(ARCH),aarch64_be)
CFLAGS += -DMLD_FORCE_AARCH64_EB
endif
ifeq ($(ARCH),riscv64)
CFLAGS += -DMLD_FORCE_RISCV64
ifeq ($(MK_COMPILER_SUPPORTS_RVV)$(MK_HOST_SUPPORTS_RVV),11)
CFLAGS += -march=rv64gcv
endif
endif
ifeq ($(ARCH),riscv32)
CFLAGS += -DMLD_FORCE_RISCV32
endif
ifeq ($(ARCH),powerpc64le)
CFLAGS += -DMLD_FORCE_PPC64LE
endif
endif # AUTO=1
endif