mirror of
https://github.com/libretro/parallel-dc.git
synced 2026-11-07 17:29:58 -10:00
1378 lines
39 KiB
Makefile
1378 lines
39 KiB
Makefile
DEBUG := 0
|
|
DEBUG_ASAN := 0
|
|
DEBUG_UBSAN := 0
|
|
HAVE_GL := 1
|
|
HAVE_GL2 := 0
|
|
HAVE_VULKAN := 0
|
|
HAVE_CORE := 0
|
|
NO_THREADS := 0
|
|
NO_EXCEPTIONS := 0
|
|
NO_NVMEM := 0
|
|
NO_VERIFY := 1
|
|
HAVE_LTCG ?= 0
|
|
HAVE_GENERIC_JIT := 1
|
|
HAVE_GL3 := 0
|
|
FORCE_GLES := 0
|
|
STATIC_LINKING:= 0
|
|
HAVE_TEXUPSCALE := 1
|
|
HAVE_OPENMP := 1
|
|
HAVE_CHD := 1
|
|
HAVE_CLANG ?= 0
|
|
HAVE_CDROM := 0
|
|
ENABLE_MODEM := 1
|
|
|
|
ifeq ($(ECHO),1)
|
|
E := 1
|
|
endif
|
|
|
|
TARGET_NAME := parallel_dc
|
|
|
|
ifeq ($(HAVE_CLANG),1)
|
|
CXX = ${CC_PREFIX}clang++
|
|
CC = ${CC_PREFIX}clang
|
|
SHARED := -fuse-ld=lld
|
|
else
|
|
CXX ?= ${CC_PREFIX}g++
|
|
CC ?= ${CC_PREFIX}gcc
|
|
SHARED :=
|
|
endif
|
|
ifeq ($(HAVE_LTCG),1)
|
|
SHARED += -flto
|
|
endif
|
|
|
|
ifneq (${AS},)
|
|
CC_AS := ${AS}
|
|
endif
|
|
CC_AS ?= ${CC_PREFIX}as
|
|
|
|
MFLAGS :=
|
|
ASFLAGS :=
|
|
LDFLAGS :=
|
|
LDFLAGS_END :=
|
|
INCFLAGS :=
|
|
LIBS :=
|
|
CFLAGS :=
|
|
CXXFLAGS :=
|
|
|
|
GIT_VERSION := " $(shell git rev-parse --short HEAD || echo unknown)"
|
|
ifneq ($(GIT_VERSION)," unknown")
|
|
CXXFLAGS += -DGIT_VERSION=\"$(GIT_VERSION)\"
|
|
endif
|
|
|
|
UNAME=$(shell uname -a)
|
|
|
|
LIBRETRO_DIR := .
|
|
|
|
# Cross compile ?
|
|
|
|
ifeq (,$(ARCH))
|
|
ARCH = $(shell uname -m)
|
|
endif
|
|
|
|
# Target Dynarec
|
|
WITH_DYNAREC = $(ARCH)
|
|
|
|
ifeq ($(ARCH), $(filter $(ARCH), i386 i686))
|
|
WITH_DYNAREC = x86
|
|
endif
|
|
|
|
ifeq ($(platform),)
|
|
platform = unix
|
|
ifeq ($(UNAME),)
|
|
platform = win
|
|
else ifneq ($(findstring MINGW,$(UNAME)),)
|
|
platform = win
|
|
else ifneq ($(findstring Darwin,$(UNAME)),)
|
|
platform = osx
|
|
else ifneq ($(findstring win,$(UNAME)),)
|
|
platform = win
|
|
endif
|
|
endif
|
|
|
|
# system platform
|
|
system_platform = unix
|
|
ifeq ($(shell uname -a),)
|
|
EXE_EXT = .exe
|
|
system_platform = win
|
|
else ifneq ($(findstring Darwin,$(shell uname -a)),)
|
|
system_platform = osx
|
|
# (arch=arm from the caller asks for an Apple silicon build)
|
|
arch ?= intel
|
|
ifeq ($(shell uname -p),powerpc)
|
|
arch = ppc
|
|
endif
|
|
else ifneq ($(findstring MINGW,$(shell uname -a)),)
|
|
system_platform = win
|
|
endif
|
|
|
|
CORE_DIR := .
|
|
|
|
DYNAREC_USED = 0
|
|
CORE_DEFINES := -D__LIBRETRO__ -DHAVE_GLSYM_PRIVATE
|
|
|
|
ifeq ($(NO_VERIFY),1)
|
|
CORE_DEFINES += -DNO_VERIFY
|
|
endif
|
|
|
|
DC_PLATFORM=dreamcast
|
|
|
|
HOST_CPU_X86=0x20000001
|
|
HOST_CPU_ARM=0x20000002
|
|
HOST_CPU_MIPS=0x20000003
|
|
HOST_CPU_X64=0x20000004
|
|
HOST_CPU_GENERIC=0x20000005
|
|
HOST_CPU_ARM64=0x20000006
|
|
|
|
ifeq ($(STATIC_LINKING),1)
|
|
EXT=a
|
|
endif
|
|
|
|
# Unix
|
|
ifneq (,$(findstring unix,$(platform)))
|
|
EXT ?= so
|
|
TARGET := $(TARGET_NAME)_libretro.$(EXT)
|
|
SHARED += -shared -Wl,--version-script=link.T
|
|
LDFLAGS += -Wl,--no-undefined
|
|
ifneq (,$(findstring Haiku,$(shell uname -s)))
|
|
LIBS += -lroot -lnetwork
|
|
else
|
|
LIBS += -lrt
|
|
HAVE_VULKAN = 1
|
|
endif
|
|
|
|
ifneq ($(HAVE_GL2), 1)
|
|
HAVE_GL3 = 1
|
|
endif
|
|
|
|
HAVE_CDROM = 1
|
|
fpic = -fPIC
|
|
|
|
ifeq ($(WITH_DYNAREC), $(filter $(WITH_DYNAREC), x86_64 x64))
|
|
CFLAGS += -DTARGET_LINUX_x64
|
|
SINGLE_PREC_FLAGS=1
|
|
HAVE_GENERIC_JIT = 0
|
|
else ifeq ($(WITH_DYNAREC), x86)
|
|
CFLAGS += -m32 -D TARGET_LINUX_x86
|
|
SINGLE_PREC_FLAGS=1
|
|
MFLAGS += -m32
|
|
ASFLAGS += --32
|
|
LDFLAGS += -m32
|
|
HAVE_GENERIC_JIT = 0
|
|
else ifneq ($(filter $(WITH_DYNAREC), arm64 aarch64),)
|
|
# 64-bit ARM Linux: the ARM64 recompiler, not the generic one
|
|
# beside it (the two define the same functions)
|
|
HAVE_GENERIC_JIT = 0
|
|
endif
|
|
PLATFORM_EXT := unix
|
|
|
|
# Raspberry Pi
|
|
else ifneq (,$(findstring rpi,$(platform)))
|
|
EXT ?= so
|
|
TARGET := $(TARGET_NAME)_libretro.$(EXT)
|
|
SHARED += -shared -Wl,--version-script=link.T
|
|
fpic = -fPIC
|
|
LIBS += -lrt
|
|
ARM_FLOAT_ABI_HARD = 1
|
|
SINGLE_PREC_FLAGS = 1
|
|
PLATFORM_EXT := unix
|
|
WITH_DYNAREC=arm
|
|
HAVE_GENERIC_JIT = 0
|
|
|
|
ifneq (,$(findstring rpi4,$(platform)))
|
|
FORCE_GLES = 1
|
|
# The Pi4 has mature Vulkan support when using up-to-date MESA.
|
|
HAVE_VULKAN = 1
|
|
ifneq (,$(findstring rpi4_64,$(platform)))
|
|
# 64-bit userspace
|
|
ARM_FLOAT_ABI_HARD = 0
|
|
CPUFLAGS += -DTARGET_LINUX_ARMv8 -frename-registers
|
|
CFLAGS += -march=armv8-a+crc -mcpu=cortex-a72 -mtune=cortex-a72 $(CPUFLAGS)
|
|
CXXFLAGS += -march=armv8-a+crc -mcpu=cortex-a72 -mtune=cortex-a72 $(CPUFLAGS)
|
|
# Look at GNU assembler man pages for actual aarch64 parameters, don't make them up.
|
|
ASFLAGS += -march=armv8-a+crc -mcpu=cortex-a72 -c
|
|
WITH_DYNAREC=arm64
|
|
else
|
|
# rpi4 flags are taken from rockpro64
|
|
CPUFLAGS += -DNO_ASM -DARM_ASM -frename-registers -ftree-vectorize
|
|
# as of 2020-05-07, the following workaround doesn't seem required
|
|
# CORE_DEFINES += -DRPI4_SET_UNIFORM_ATTRIBUTES_BUG
|
|
CFLAGS += -marm -mfloat-abi=hard -mcpu=cortex-a72 -mtune=cortex-a72 -mfpu=neon-vfpv4 $(CPUFLAGS)
|
|
CXXFLAGS += -marm -mfloat-abi=hard -mcpu=cortex-a72 -mtune=cortex-a72 -mfpu=neon-vfpv4 $(CPUFLAGS)
|
|
ifeq ($(HAVE_CLANG),0)
|
|
CFLAGS += -mvectorize-with-neon-quad
|
|
CXXFLAGS += -mvectorize-with-neon-quad
|
|
endif
|
|
ASFLAGS += $(CFLAGS) -c -frename-registers -fno-strict-aliasing -ffast-math -ftree-vectorize
|
|
endif
|
|
else ifneq (,$(findstring rpi3,$(platform)))
|
|
FORCE_GLES = 1
|
|
ifneq (,$(findstring rpi3_64,$(platform)))
|
|
# 64-bit userspace
|
|
ARM_FLOAT_ABI_HARD = 0
|
|
CPUFLAGS += -DTARGET_LINUX_ARMv8 -frename-registers
|
|
CFLAGS += -march=armv8-a+crc -mcpu=cortex-a53 -mtune=cortex-a53 $(CPUFLAGS)
|
|
CXXFLAGS += -march=armv8-a+crc -mcpu=cortex-a53 -mtune=cortex-a53 $(CPUFLAGS)
|
|
ASFLAGS += $(CFLAGS) -c -frename-registers -fno-strict-aliasing -ffast-math -ftree-vectorize
|
|
WITH_DYNAREC=arm64
|
|
else
|
|
CFLAGS += -mtune=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard
|
|
CXXFLAGS += -mtune=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard
|
|
endif
|
|
else
|
|
ifeq (,$(findstring mesa,$(platform)))
|
|
GLES = 1
|
|
GL_LIB := -L/opt/vc/lib -lbrcmGLESv2
|
|
INCFLAGS += -I/opt/vc/include
|
|
CFLAGS += -DTARGET_NO_STENCIL
|
|
else
|
|
FORCE_GLES = 1
|
|
endif
|
|
ifneq (,$(findstring rpi2,$(platform)))
|
|
CFLAGS += -mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard
|
|
CXXFLAGS += -mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard
|
|
endif
|
|
CORE_DEFINES += -DLOW_END
|
|
endif
|
|
|
|
# Classic Platforms #####################
|
|
# Platform affix = classic_<ISA>_<µARCH>
|
|
#########################################
|
|
# (armv7 a7, hard point, neon based) ####
|
|
# NESC, SNESC, C64 mini
|
|
else ifeq ($(platform), classic_armv7_a7)
|
|
EXT ?= so
|
|
TARGET := $(TARGET_NAME)_libretro.$(EXT)
|
|
SHARED += -shared -Wl,--version-script=link.T
|
|
fpic = -fPIC
|
|
LIBS += -lrt
|
|
ARM_FLOAT_ABI_HARD = 1
|
|
FORCE_GLES = 1
|
|
SINGLE_PREC_FLAGS = 1
|
|
HAVE_LTCG = 0
|
|
HAVE_OPENMP = 1
|
|
CFLAGS += -Ofast \
|
|
-flto=4 -fwhole-program -fuse-linker-plugin \
|
|
-fdata-sections -ffunction-sections -Wl,--gc-sections \
|
|
-fno-stack-protector -fno-ident -fomit-frame-pointer \
|
|
-falign-functions=1 -falign-jumps=1 -falign-loops=1 \
|
|
-fno-unwind-tables -fno-asynchronous-unwind-tables -fno-unroll-loops \
|
|
-fmerge-all-constants -fno-math-errno \
|
|
-marm -mtune=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard
|
|
CXXFLAGS += $(CFLAGS)
|
|
ASFLAGS += $(CFLAGS)
|
|
LDFLAGS += -marm -mtune=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard
|
|
ifeq ($(shell echo `$(CC) -dumpversion` "< 4.9" | bc -l), 1)
|
|
CFLAGS += -march=armv7-a
|
|
LDFLAGS += -march=armv7-a
|
|
else
|
|
CFLAGS += -march=armv7ve
|
|
LDFLAGS += -march=armv7ve
|
|
# If gcc is 5.0 or later
|
|
ifeq ($(shell echo `$(CC) -dumpversion` ">= 5" | bc -l), 1)
|
|
LDFLAGS += -static-libgcc -static-libstdc++
|
|
endif
|
|
endif
|
|
PLATFORM_EXT := unix
|
|
WITH_DYNAREC = arm
|
|
HAVE_GENERIC_JIT = 0
|
|
CORE_DEFINES += -DLOW_END -DLOW_RES
|
|
#########################################
|
|
# (armv8 a35, hard point, neon based) ###
|
|
# PlayStation Classic
|
|
else ifeq ($(platform), classic_armv8_a35)
|
|
EXT ?= so
|
|
TARGET := $(TARGET_NAME)_libretro.$(EXT)
|
|
SHARED += -shared -Wl,--version-script=link.T
|
|
fpic = -fPIC
|
|
LIBS += -lrt
|
|
ARM_FLOAT_ABI_HARD = 1
|
|
FORCE_GLES = 1
|
|
SINGLE_PREC_FLAGS = 1
|
|
HAVE_LTCG = 0
|
|
HAVE_OPENMP = 0
|
|
CFLAGS += -Ofast \
|
|
-fuse-linker-plugin \
|
|
-fno-stack-protector -fno-ident -fomit-frame-pointer \
|
|
-fmerge-all-constants -ffast-math -funroll-all-loops \
|
|
-marm -mcpu=cortex-a35 -mfpu=neon-fp-armv8 -mfloat-abi=hard
|
|
CXXFLAGS += $(CFLAGS)
|
|
ASFLAGS += $(CFLAGS)
|
|
LDFLAGS += -marm -mcpu=cortex-a35 -mfpu=neon-fp-armv8 -mfloat-abi=hard -Ofast -flto -fuse-linker-plugin
|
|
PLATFORM_EXT := unix
|
|
WITH_DYNAREC = arm
|
|
HAVE_GENERIC_JIT = 0
|
|
CORE_DEFINES += -DLOW_END -DLOW_RES
|
|
|
|
#########################################
|
|
|
|
# sun8i Allwinner H2+ / H3 for mainline Builds
|
|
# like Orange PI, Nano PI, Banana PI, Tritium, Sunvell R69, AlphaCore2
|
|
# by MPCORE-HUB/Liontek1985
|
|
|
|
else ifeq ($(platform), sun8i)
|
|
EXT ?= so
|
|
TARGET := $(TARGET_NAME)_libretro.$(EXT)
|
|
SHARED += -shared -Wl,--version-script=link.T
|
|
fpic = -fPIC
|
|
LIBS += -lrt
|
|
ARM_FLOAT_ABI_HARD = 1
|
|
FORCE_GLES = 1
|
|
SINGLE_PREC_FLAGS = 1
|
|
CPUFLAGS += -DNO_ASM -DARM_ASM -frename-registers -ftree-vectorize
|
|
CFLAGS += -marm -mfloat-abi=hard -mtune=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard $(CPUFLAGS)
|
|
CXXFLAGS += -marm -mfloat-abi=hard -mtune=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard $(CPUFLAGS)
|
|
ifeq ($(HAVE_CLANG),0)
|
|
CFLAGS += -mvectorize-with-neon-quad
|
|
CXXFLAGS += -mvectorize-with-neon-quad
|
|
endif
|
|
ifeq ($(shell echo `$(CC) -dumpversion` "< 4.9" | bc -l), 1)
|
|
CFLAGS += -march=armv7-a
|
|
CXXFLAGS += -march=armv7-a
|
|
else
|
|
CFLAGS += -march=armv7ve
|
|
CXXFLAGS += -march=armv7ve
|
|
# If gcc is 5.0 or later
|
|
ifeq ($(shell echo `$(CC) -dumpversion` ">= 5" | bc -l), 1)
|
|
CXXFLAGS += -static-libgcc -static-libstdc++
|
|
endif
|
|
endif
|
|
ASFLAGS += $(CFLAGS) -c -frename-registers -fno-strict-aliasing -ffast-math -ftree-vectorize
|
|
PLATFORM_EXT := unix
|
|
WITH_DYNAREC=arm
|
|
HAVE_GENERIC_JIT = 0
|
|
CORE_DEFINES += -DLOW_END
|
|
|
|
#########################################
|
|
|
|
# sun8i Allwinner H2+ / H3 for Legacy Builds
|
|
# like Orange PI, Nano PI, Banana PI, Tritium, Sunvell R69, AlphaCore2
|
|
# by MPCORE-HUB/Liontek1985
|
|
|
|
else ifeq ($(platform), sun8i_legacy)
|
|
EXT ?= so
|
|
TARGET := $(TARGET_NAME)_libretro.$(EXT)
|
|
SHARED += -shared -Wl,--version-script=link.T
|
|
fpic = -fPIC
|
|
LIBS += -lrt
|
|
ARM_FLOAT_ABI_HARD = 1
|
|
FORCE_GLES = 1
|
|
SINGLE_PREC_FLAGS = 1
|
|
HAVE_LTCG = 0
|
|
HAVE_OPENMP = 0
|
|
CFLAGS += -Ofast \
|
|
-flto -fuse-linker-plugin \
|
|
-fno-stack-protector -fno-ident -fomit-frame-pointer \
|
|
-fmerge-all-constants -ffast-math -funroll-all-loops \
|
|
-marm -mtune=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard
|
|
CXXFLAGS += $(CFLAGS)
|
|
ASFLAGS += $(CFLAGS)
|
|
LDFLAGS += -marm -mtune=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard -Ofast -flto -fuse-linker-plugin
|
|
ifeq ($(shell echo `$(CC) -dumpversion` "< 4.9" | bc -l), 1)
|
|
CFLAGS += -march=armv7-a
|
|
LDFLAGS += -march=armv7-a
|
|
else
|
|
CFLAGS += -march=armv7ve
|
|
LDFLAGS += -march=armv7ve
|
|
# If gcc is 5.0 or later
|
|
ifeq ($(shell echo `$(CC) -dumpversion` ">= 5" | bc -l), 1)
|
|
LDFLAGS += -static-libgcc -static-libstdc++
|
|
endif
|
|
endif
|
|
PLATFORM_EXT := unix
|
|
WITH_DYNAREC = arm
|
|
HAVE_GENERIC_JIT = 0
|
|
CORE_DEFINES += -DLOW_END
|
|
|
|
#######################################
|
|
|
|
# Generic AArch64 Cortex-A53 OpenGL ES 2.0 target
|
|
else ifeq ($(platform), arm64_cortex_a53_gles2)
|
|
EXT ?= so
|
|
TARGET := $(TARGET_NAME)_libretro.$(EXT)
|
|
SHARED += -shared -Wl,--version-script=link.T
|
|
LDFLAGS += -Wl,--no-undefined
|
|
fpic = -fPIC
|
|
LIBS += -lrt
|
|
ARM_FLOAT_ABI_HARD = 0
|
|
FORCE_GLES = 1
|
|
SINGLE_PREC_FLAGS = 1
|
|
CPUFLAGS += -DHOST_CPU=0x20000006 -DTARGET_LINUX_ARMv8 -frename-registers
|
|
CFLAGS += -mcpu=cortex-a53 -mtune=cortex-a53 $(CPUFLAGS)
|
|
CXXFLAGS += -mcpu=cortex-a53 -mtune=cortex-a53 $(CPUFLAGS)
|
|
ASFLAGS += $(CFLAGS) -c -frename-registers -fno-strict-aliasing -ffast-math -ftree-vectorize
|
|
PLATFORM_EXT := unix
|
|
WITH_DYNAREC=arm64
|
|
HAVE_GENERIC_JIT = 0
|
|
HAVE_VULKAN = 0
|
|
HAVE_LTCG = 0
|
|
CORE_DEFINES += -DLOW_END
|
|
|
|
#######################################
|
|
|
|
# ARM64 SM1 Odroid C4
|
|
else ifeq ($(platform), odroidc4)
|
|
EXT ?= so
|
|
TARGET := $(TARGET_NAME)_libretro.$(EXT)
|
|
SHARED += -shared -Wl,--version-script=link.T
|
|
LDFLAGS += -Wl,--no-undefined
|
|
fpic = -fPIC
|
|
LIBS += -lrt
|
|
ARM_FLOAT_ABI_HARD = 0
|
|
FORCE_GLES = 1
|
|
SINGLE_PREC_FLAGS = 1
|
|
CPUFLAGS += -DHOST_CPU=0x20000006 -DTARGET_LINUX_ARMv8 -frename-registers
|
|
CFLAGS += -mcpu=cortex-a55 -mtune=cortex-a55 $(CPUFLAGS)
|
|
CXXFLAGS += -mcpu=cortex-a55 -mtune=cortex-a55 $(CPUFLAGS)
|
|
ASFLAGS += $(CFLAGS) -c -frename-registers -fno-strict-aliasing -ffast-math -ftree-vectorize
|
|
PLATFORM_EXT := unix
|
|
WITH_DYNAREC=arm64
|
|
HAVE_GENERIC_JIT = 0
|
|
HAVE_VULKAN = 0
|
|
HAVE_LTCG = 0
|
|
|
|
#######################################
|
|
|
|
# ARM64 (switch-lakka)
|
|
else ifeq ($(platform), arm64)
|
|
EXT ?= so
|
|
TARGET := $(TARGET_NAME)_libretro.$(EXT)
|
|
SHARED += -shared -Wl,--version-script=link.T
|
|
LDFLAGS += -Wl,--no-undefined
|
|
fpic = -fPIC
|
|
LIBS += -lrt
|
|
ARM_FLOAT_ABI_HARD = 0
|
|
FORCE_GLES = 1
|
|
SINGLE_PREC_FLAGS = 1
|
|
CPUFLAGS += -DTARGET_LINUX_ARMv8 -frename-registers
|
|
CFLAGS += $(CPUFLAGS)
|
|
CXXFLAGS += $(CPUFLAGS)
|
|
ASFLAGS += $(CFLAGS) -c -frename-registers -fno-strict-aliasing -ffast-math -ftree-vectorize
|
|
PLATFORM_EXT := unix
|
|
WITH_DYNAREC=arm64
|
|
HAVE_GENERIC_JIT = 0
|
|
HAVE_LTCG = 0
|
|
LDFLAGS := $(filter-out -flto, $(LDFLAGS))
|
|
CFLAGS := $(filter-out -flto, $(CFLAGS))
|
|
CXXFLAGS := $(filter-out -flto, $(CXXFLAGS))
|
|
#######################################
|
|
|
|
# nvidia developer jetson nano kit (jetson-nano)
|
|
else ifeq ($(platform), jetson-nano)
|
|
EXT ?= so
|
|
TARGET := $(TARGET_NAME)_libretro.$(EXT)
|
|
SHARED += -shared -Wl,--version-script=link.T
|
|
LDFLAGS += -Wl,--no-undefined
|
|
fpic = -fPIC
|
|
LIBS += -lrt
|
|
ARM_FLOAT_ABI_HARD = 0
|
|
SINGLE_PREC_FLAGS = 1
|
|
CPUFLAGS += -DTARGET_LINUX_ARMv8 -frename-registers
|
|
CFLAGS += -march=armv8-a+crc -mtune=cortex-a57 -mcpu=cortex-a57+crc+fp+simd $(CPUFLAGS)
|
|
CXXFLAGS += -march=armv8-a+crc -mtune=cortex-a57 -mcpu=cortex-a57+crc+fp+simd $(CPUFLAGS)
|
|
ASFLAGS += $(CFLAGS) -c -frename-registers -fno-strict-aliasing -ffast-math -ftree-vectorize
|
|
PLATFORM_EXT := unix
|
|
ARCH=arm
|
|
WITH_DYNAREC=arm64
|
|
HAVE_GENERIC_JIT = 0
|
|
HAVE_VULKAN = 1
|
|
HAVE_LTCG = 0
|
|
LDFLAGS := $(filter-out -flto, $(LDFLAGS))
|
|
CFLAGS := $(filter-out -flto, $(CFLAGS))
|
|
CXXFLAGS := $(filter-out -flto, $(CXXFLAGS))
|
|
|
|
# Nintendo Switch (Libnx)
|
|
else ifeq ($(platform), libnx)
|
|
include $(DEVKITPRO)/libnx/switch_rules
|
|
CC_AS = aarch64-none-elf-as
|
|
TARGET := $(TARGET_NAME)_libretro_$(platform).a
|
|
DEFINES := -DSWITCH=1 -D__SWITCH__=1 -fcommon -DHAVE_LIBNX=1 -DTARGET_LIBNX -DTARGET_NO_OPENMP -DFEAT_NO_RWX_PAGES
|
|
CFLAGS := $(DEFINES) -fPIE -I$(LIBNX)/include/ -I$(PORTLIBS)/include/ -isystem$(CORE_DIR)/core/deps/switch/ -ffunction-sections -fdata-sections -ftls-model=local-exec
|
|
CPUFLAGS += -march=armv8-a -mtune=cortex-a57 -mtp=soft -mcpu=cortex-a57+crc+fp+simd -ffast-math -frename-registers -funroll-loops -ftree-vectorize
|
|
CFLAGS += $(CPUFLAGS) -DTARGET_LIBNX -DTARGET_NO_AREC
|
|
WITH_DYNAREC=arm64
|
|
HAVE_GENERIC_JIT = 0
|
|
STATIC_LINKING = 1
|
|
ENABLE_MODEM = 0
|
|
HAVE_LTCG = 0
|
|
NO_NVMEM = 1
|
|
# stubs
|
|
SOURCES_C += $(CORE_DIR)/core/deps/switch/stubs.c
|
|
#######################################
|
|
|
|
# Odroid-N2
|
|
else ifeq ($(platform), odroid-n2)
|
|
EXT ?= so
|
|
TARGET := $(TARGET_NAME)_libretro.$(EXT)
|
|
SHARED += -shared -Wl,--version-script=link.T
|
|
LDFLAGS += -Wl,--no-undefined
|
|
fpic = -fPIC
|
|
LIBS += -lrt
|
|
ARM_FLOAT_ABI_HARD = 0
|
|
FORCE_GLES = 1
|
|
SINGLE_PREC_FLAGS = 1
|
|
CPUFLAGS += -DTARGET_LINUX_ARMv8 -frename-registers
|
|
CFLAGS += -mcpu=cortex-a73 -mtune=cortex-a73.cortex-a53 $(CPUFLAGS)
|
|
CXXFLAGS += -mcpu=cortex-a73 -mtune=cortex-a73.cortex-a53 $(CPUFLAGS)
|
|
ASFLAGS += $(CFLAGS) -c -frename-registers -fno-strict-aliasing -ffast-math -ftree-vectorize
|
|
PLATFORM_EXT := unix
|
|
WITH_DYNAREC=arm64
|
|
HAVE_GENERIC_JIT = 0
|
|
HAVE_LTCG = 0
|
|
|
|
# Libre Computer La Frite
|
|
else ifeq ($(platform), mali-drm-gles2)
|
|
EXT ?= so
|
|
TARGET := $(TARGET_NAME)_libretro.$(EXT)
|
|
SHARED += -shared -Wl,--version-script=link.T
|
|
LDFLAGS += -Wl,--no-undefined
|
|
fpic = -fPIC
|
|
LIBS += -lrt
|
|
ARM_FLOAT_ABI_HARD = 0
|
|
FORCE_GLES = 1
|
|
SINGLE_PREC_FLAGS = 1
|
|
CPUFLAGS += -march=armv8-a
|
|
CFLAGS += -mtune=cortex-a53 $(CPUFLAGS)
|
|
PLATFORM_EXT := unix
|
|
WITH_DYNAREC=arm64
|
|
HAVE_GENERIC_JIT = 0
|
|
HAVE_LTCG = 0
|
|
|
|
# Amlogic S905/S905X/S912 (AMLGXBB/AMLGXL/AMLGXM) e.g. Khadas VIM1/2 / S905X2 (AMLG12A) & S922X/A311D (AMLG12B) e.g. Khadas VIM3 - 32-bit userspace
|
|
else ifneq (,$(findstring AMLG,$(platform)))
|
|
EXT ?= so
|
|
TARGET := $(TARGET_NAME)_libretro.$(EXT)
|
|
SHARED += -shared -Wl,--version-script=link.T
|
|
LDFLAGS += -Wl,--no-undefined
|
|
fpic = -fPIC
|
|
LIBS += -lrt
|
|
ARM_FLOAT_ABI_HARD = 1
|
|
FORCE_GLES = 1
|
|
SINGLE_PREC_FLAGS = 1
|
|
|
|
CPUFLAGS += -DNO_ASM -DARM_ASM -frename-registers -ftree-vectorize
|
|
CFLAGS += -march=armv8-a+crc -mfloat-abi=hard -mfpu=neon-fp-armv8 $(CPUFLAGS)
|
|
CXXFLAGS += -march=armv8-a+crc -mfloat-abi=hard -mfpu=neon-fp-armv8 $(CPUFLAGS)
|
|
|
|
ifneq (,$(findstring AMLG12,$(platform)))
|
|
ifneq (,$(findstring AMLG12B,$(platform)))
|
|
CFLAGS += -mtune=cortex-a73.cortex-a53
|
|
CXXFLAGS += -mtune=cortex-a73.cortex-a53
|
|
else
|
|
CFLAGS += -mtune=cortex-a53
|
|
CXXFLAGS += -mtune=cortex-a53
|
|
endif
|
|
else ifneq (,$(findstring AMLGX,$(platform)))
|
|
CFLAGS += -mtune=cortex-a53
|
|
CXXFLAGS += -mtune=cortex-a53
|
|
CORE_DEFINES += -DLOW_END
|
|
endif
|
|
|
|
ASFLAGS += $(CFLAGS) -c -frename-registers -fno-strict-aliasing -ffast-math -ftree-vectorize
|
|
|
|
PLATFORM_EXT := unix
|
|
WITH_DYNAREC=arm
|
|
HAVE_GENERIC_JIT = 0
|
|
|
|
# Rockchip RK3288 e.g. Asus Tinker Board / RK3328 e.g. PINE64 Rock64 / RK3399 e.g. PINE64 RockPro64 - 32-bit userspace
|
|
else ifneq (,$(findstring RK,$(platform)))
|
|
EXT ?= so
|
|
TARGET := $(TARGET_NAME)_libretro.$(EXT)
|
|
SHARED += -shared -Wl,--version-script=link.T
|
|
fpic = -fPIC
|
|
LIBS += -lrt
|
|
ARM_FLOAT_ABI_HARD = 1
|
|
FORCE_GLES = 1
|
|
SINGLE_PREC_FLAGS = 1
|
|
CPUFLAGS += -DNO_ASM -DARM_ASM -frename-registers -ftree-vectorize
|
|
HAVE_LTCG = 0
|
|
|
|
ifneq (,$(findstring RK33,$(platform)))
|
|
CFLAGS += -march=armv8-a+crc -mfpu=neon-fp-armv8
|
|
CXXFLAGS += -march=armv8-a+crc -mfpu=neon-fp-armv8
|
|
|
|
ifneq (,$(findstring RK3399,$(platform)))
|
|
CFLAGS += -mtune=cortex-a72.cortex-a53
|
|
CXXFLAGS += -mtune=cortex-a72.cortex-a53
|
|
else ifneq (,$(findstring RK3328,$(platform)))
|
|
CFLAGS += -mtune=cortex-a53
|
|
CXXFLAGS += -mtune=cortex-a53
|
|
CORE_DEFINES += -DLOW_END
|
|
endif
|
|
|
|
ifeq ($(HAVE_CLANG),0)
|
|
CFLAGS += -mvectorize-with-neon-quad
|
|
CXXFLAGS += -mvectorize-with-neon-quad
|
|
endif
|
|
else ifneq (,$(findstring RK3288,$(platform)))
|
|
CFLAGS += -march=armv7ve -mtune=cortex-a17 -mfpu=neon-vfpv4
|
|
CXXFLAGS += -march=armv7ve -mtune=cortex-a17 -mfpu=neon-vfpv4
|
|
endif
|
|
|
|
CFLAGS += -mfloat-abi=hard $(CPUFLAGS)
|
|
CXXFLAGS += -mfloat-abi=hard $(CPUFLAGS)
|
|
|
|
ASFLAGS += $(CFLAGS) -c -frename-registers -fno-strict-aliasing -ffast-math -ftree-vectorize
|
|
PLATFORM_EXT := unix
|
|
WITH_DYNAREC=arm
|
|
HAVE_GENERIC_JIT = 0
|
|
|
|
# RockPro64
|
|
else ifeq ($(platform), rockpro64)
|
|
EXT ?= so
|
|
TARGET := $(TARGET_NAME)_libretro.$(EXT)
|
|
SHARED += -shared -Wl,--version-script=link.T
|
|
fpic = -fPIC
|
|
LIBS += -lrt
|
|
ARM_FLOAT_ABI_HARD = 1
|
|
FORCE_GLES = 1
|
|
SINGLE_PREC_FLAGS = 1
|
|
CPUFLAGS += -DNO_ASM -DARM_ASM -frename-registers -ftree-vectorize
|
|
CFLAGS += -marm -mfloat-abi=hard -mcpu=cortex-a72 -mtune=cortex-a72.cortex-a53 -mfpu=neon-fp-armv8 $(CPUFLAGS)
|
|
CXXFLAGS += -marm -mfloat-abi=hard -mcpu=cortex-a72 -mtune=cortex-a72.cortex-a53 -mfpu=neon-fp-armv8 $(CPUFLAGS)
|
|
ifeq ($(HAVE_CLANG),0)
|
|
CFLAGS += -mvectorize-with-neon-quad
|
|
CXXFLAGS += -mvectorize-with-neon-quad
|
|
endif
|
|
ASFLAGS += $(CFLAGS) -c -frename-registers -fno-strict-aliasing -ffast-math -ftree-vectorize
|
|
PLATFORM_EXT := unix
|
|
WITH_DYNAREC=arm
|
|
HAVE_GENERIC_JIT = 0
|
|
HAVE_LTCG = 0
|
|
|
|
# Tinkerboard
|
|
else ifeq ($(platform), tinkerboard)
|
|
EXT ?= so
|
|
TARGET := $(TARGET_NAME)_libretro.$(EXT)
|
|
SHARED += -shared -Wl,--version-script=link.T
|
|
fpic = -fPIC
|
|
LIBS += -lrt
|
|
ARM_FLOAT_ABI_HARD = 1
|
|
FORCE_GLES = 1
|
|
SINGLE_PREC_FLAGS = 1
|
|
CPUFLAGS += -DNO_ASM -DARM_ASM -frename-registers -ftree-vectorize
|
|
CFLAGS += -marm -mfpu=neon-vfpv4 -mtune=cortex-a17 -mfloat-abi=hard $(CPUFLAGS)
|
|
CXXFLAGS += -marm -mfpu=neon-vfpv4 -mtune=cortex-a17 -mfloat-abi=hard $(CPUFLAGS)
|
|
ASFLAGS += $(CFLAGS) -c -frename-registers -fno-strict-aliasing -ffast-math -ftree-vectorize
|
|
PLATFORM_EXT := unix
|
|
WITH_DYNAREC=arm
|
|
HAVE_GENERIC_JIT = 0
|
|
|
|
# ODROIDs
|
|
else ifneq (,$(findstring odroid,$(platform)))
|
|
EXT ?= so
|
|
TARGET := $(TARGET_NAME)_libretro.$(EXT)
|
|
BOARD ?= $(shell cat /proc/cpuinfo | grep -i odroid | awk '{print $$3}')
|
|
SHARED += -shared -Wl,--version-script=link.T
|
|
fpic = -fPIC
|
|
LIBS += -lrt
|
|
ARM_FLOAT_ABI_HARD = 1
|
|
FORCE_GLES = 1
|
|
SINGLE_PREC_FLAGS = 1
|
|
HAVE_LTCG = 0
|
|
|
|
CPUFLAGS += -DNO_ASM -DARM_ASM -frename-registers -ftree-vectorize
|
|
CFLAGS += -marm -mfloat-abi=hard $(CPUFLAGS)
|
|
CXXFLAGS += -marm -mfloat-abi=hard $(CPUFLAGS)
|
|
|
|
ifneq (,$(findstring ODROIDC,$(BOARD)))
|
|
# ODROID-C1
|
|
MFLAGS += -mcpu=cortex-a5
|
|
else ifneq (,$(findstring ODROID-XU,$(BOARD)))
|
|
# ODROID-XU3, XU4 & XU3 Lite
|
|
ifeq ($(HAVE_CLANG),1)
|
|
MFLAGS += -mcpu=cortex-a15 -mtune=cortex-a15.cortex-a7 -mfpu=neon-vfpv4
|
|
else
|
|
MFLAGS += -mcpu=cortex-a15 -mtune=cortex-a15.cortex-a7 -mfpu=neon-vfpv4 -mvectorize-with-neon-quad
|
|
endif
|
|
else
|
|
# ODROID-U2, -U3, -X & -X2
|
|
MFLAGS += -mcpu=cortex-a9 -mfpu=neon
|
|
endif
|
|
|
|
#Since we are using GCC, we use the CFLAGS and we add some extra parameters to be able to compile (taken from reicast/reicast-emulator)
|
|
ASFLAGS += $(CFLAGS) $(MFLAGS) -c -frename-registers -fno-strict-aliasing -ffast-math -ftree-vectorize
|
|
|
|
PLATFORM_EXT := unix
|
|
WITH_DYNAREC=arm
|
|
HAVE_GENERIC_JIT = 0
|
|
|
|
# i.MX6
|
|
else ifneq (,$(findstring imx6,$(platform)))
|
|
EXT ?= so
|
|
TARGET := $(TARGET_NAME)_libretro.$(EXT)
|
|
SHARED += -shared -Wl,--version-script=link.T
|
|
fpic = -fPIC
|
|
FORCE_GLES = 1
|
|
LIBS += -lrt
|
|
CPUFLAGS += -DNO_ASM
|
|
PLATFORM_EXT := unix
|
|
WITH_DYNAREC=arm
|
|
HAVE_GENERIC_JIT = 0
|
|
|
|
# OS X
|
|
else ifneq (,$(findstring osx,$(platform)))
|
|
EXT ?= dylib
|
|
TARGET := $(TARGET_NAME)_libretro.$(EXT)
|
|
SHARED += -dynamiclib
|
|
OSXVER = `sw_vers -productVersion | cut -d. -f 2`
|
|
OSX_LT_MAVERICKS = `(( $(OSXVER) <= 9)) && echo "YES"`
|
|
fpic += -mmacosx-version-min=10.7
|
|
LDFLAGS += -stdlib=libc++
|
|
fpic = -fPIC
|
|
CFLAGS += -DHAVE_GLSYM_PRIVATE
|
|
SINGLE_PREC_FLAGS=1
|
|
PLATCFLAGS += -D__MACOSX__ -DOSX
|
|
GL_LIB := -framework OpenGL
|
|
PLATFORM_EXT := unix
|
|
# Vulkan through the frontend's MoltenVK
|
|
HAVE_VULKAN = 1
|
|
# Target Dynarec. What is built for goes by arch (arm: Apple silicon),
|
|
# not by the machine doing the building, so that either can be built
|
|
# on either.
|
|
ifeq ($(ARCH), $(filter $(ARCH), ppc))
|
|
WITH_DYNAREC =
|
|
else ifeq ($(arch),arm)
|
|
# Apple silicon: the ARM64 recompilers, with their code in MAP_JIT
|
|
# memory (HOST_APPLE_JIT in core/build.h). A frontend run with the
|
|
# hardened runtime needs the com.apple.security.cs.allow-jit
|
|
# entitlement for it; without it the interpreters are used.
|
|
ARCH = arm64
|
|
WITH_DYNAREC = arm64
|
|
HAVE_GENERIC_JIT = 0
|
|
OSX_ARCHFLAGS = -arch arm64
|
|
else
|
|
ARCH = x86_64
|
|
WITH_DYNAREC = x86_64
|
|
HAVE_GENERIC_JIT = 0
|
|
OSX_ARCHFLAGS = -arch x86_64
|
|
endif
|
|
# CROSS_COMPILE=1: the SDK and the target triple come from the caller
|
|
ifeq ($(CROSS_COMPILE),1)
|
|
OSX_ARCHFLAGS = -target $(LIBRETRO_APPLE_PLATFORM) -isysroot $(LIBRETRO_APPLE_ISYSROOT)
|
|
endif
|
|
CFLAGS += $(OSX_ARCHFLAGS)
|
|
LDFLAGS += $(OSX_ARCHFLAGS)
|
|
HAVE_OPENMP=0
|
|
|
|
# iOS and tvOS, 64-bit ARM. Apple's systems give no memory that is both
|
|
# writable and executable there, so no recompiler: the interpreters.
|
|
else ifneq (,$(filter ios-arm64 tvos-arm64,$(platform)))
|
|
EXT ?= dylib
|
|
ifeq ($(platform),tvos-arm64)
|
|
TARGET := $(TARGET_NAME)_libretro_tvos.$(EXT)
|
|
APPLE_SDK := appletvos
|
|
APPLE_MINVER := -mtvos-version-min=13.0
|
|
else
|
|
TARGET := $(TARGET_NAME)_libretro_ios.$(EXT)
|
|
APPLE_SDK := iphoneos
|
|
APPLE_MINVER := -miphoneos-version-min=13.0
|
|
endif
|
|
ifeq ($(IOSSDK),)
|
|
IOSSDK := $(shell xcodebuild -version -sdk $(APPLE_SDK) Path)
|
|
endif
|
|
CC = clang -arch arm64 -isysroot $(IOSSDK) $(APPLE_MINVER)
|
|
CXX = clang++ -arch arm64 -isysroot $(IOSSDK) $(APPLE_MINVER)
|
|
SHARED += -dynamiclib
|
|
LDFLAGS += -stdlib=libc++
|
|
fpic = -fPIC
|
|
GLES = 1
|
|
GL_LIB := -framework OpenGLES
|
|
HAVE_VULKAN = 1
|
|
SINGLE_PREC_FLAGS = 1
|
|
PLATFORM_EXT := unix
|
|
ARCH = arm64
|
|
WITH_DYNAREC =
|
|
HAVE_GENERIC_JIT = 0
|
|
NO_REC = 1
|
|
HOST_CPU_FLAGS = -DHOST_CPU=$(HOST_CPU_ARM64)
|
|
HAVE_OPENMP = 0
|
|
|
|
# iOS
|
|
else ifneq (,$(findstring ios,$(platform)))
|
|
EXT ?= dylib
|
|
ifeq ($(IOSSDK),)
|
|
IOSSDK := $(shell xcodebuild -version -sdk iphoneos Path)
|
|
endif
|
|
|
|
TARGET := $(TARGET_NAME)_libretro_ios.$(EXT)
|
|
DEFINES += -DIOS
|
|
GLES = 1
|
|
WITH_DYNAREC=
|
|
PLATFORM_EXT := unix
|
|
#HOST_CPU_FLAGS = -DHOST_CPU=$(HOST_CPU_ARM)
|
|
|
|
PLATCFLAGS += -DHAVE_POSIX_MEMALIGN -DNO_ASM
|
|
PLATCFLAGS += -DIOS -marm
|
|
CPUFLAGS += -DNO_ASM -DARM -D__arm__ -DARM_ASM -D__NEON_OPT
|
|
CPUFLAGS += -marm -mcpu=cortex-a8 -mfpu=neon -mfloat-abi=softfp
|
|
SHARED += -dynamiclib
|
|
|
|
fpic = -fPIC
|
|
GL_LIB := -framework OpenGLES
|
|
|
|
CC = clang -arch armv7 -isysroot $(IOSSDK)
|
|
CC_AS = perl ./tools/gas-preprocessor.pl $(CC)
|
|
CXX = clang++ -arch armv7 -isysroot $(IOSSDK)
|
|
ifeq ($(platform),ios9)
|
|
CC += -miphoneos-version-min=8.0
|
|
CC_AS += -miphoneos-version-min=8.0
|
|
CXX += -miphoneos-version-min=8.0
|
|
PLATCFLAGS += -miphoneos-version-min=8.0
|
|
else
|
|
CC += -miphoneos-version-min=5.0
|
|
CC_AS += -miphoneos-version-min=5.0
|
|
CXX += -miphoneos-version-min=5.0
|
|
PLATCFLAGS += -miphoneos-version-min=5.0
|
|
endif
|
|
HAVE_OPENMP=0
|
|
|
|
# Theos iOS
|
|
else ifneq (,$(findstring theos_ios,$(platform)))
|
|
DEPLOYMENT_IOSVERSION = 5.0
|
|
TARGET = iphone:latest:$(DEPLOYMENT_IOSVERSION)
|
|
ARCHS = armv7
|
|
TARGET_IPHONEOS_DEPLOYMENT_VERSION=$(DEPLOYMENT_IOSVERSION)
|
|
THEOS_BUILD_DIR := objs
|
|
include $(THEOS)/makefiles/common.mk
|
|
|
|
LIBRARY_NAME = $(TARGET_NAME)_libretro_ios
|
|
DEFINES += -DIOS
|
|
FORCE_GLES = 1
|
|
WITH_DYNAREC=arm
|
|
HAVE_GENERIC_JIT = 0
|
|
|
|
PLATCFLAGS += -DHAVE_POSIX_MEMALIGN -DNO_ASM
|
|
PLATCFLAGS += -DIOS -marm
|
|
CPUFLAGS += -DNO_ASM -DARM -D__arm__ -DARM_ASM -D__NEON_OPT -DNOSSE
|
|
|
|
# Android
|
|
else ifneq (,$(findstring android,$(platform)))
|
|
fpic = -fPIC
|
|
EXT ?= so
|
|
TARGET := $(TARGET_NAME)_libretro_android.$(EXT)
|
|
SHARED += -shared -Wl,--version-script=link.T -Wl,--no-undefined -Wl,--warn-common
|
|
|
|
CC = arm-linux-androideabi-gcc
|
|
CXX = arm-linux-androideabi-g++
|
|
WITH_DYNAREC=arm
|
|
HAVE_GENERIC_JIT = 0
|
|
FORCE_GLES = 1
|
|
PLATCFLAGS += -DANDROID
|
|
CPUCFLAGS += -DNO_ASM
|
|
CPUFLAGS += -marm -mcpu=cortex-a8 -mfpu=neon -mfloat-abi=softfp -D__arm__ -DARM_ASM -D__NEON_OPT
|
|
CFLAGS += -DANDROID
|
|
|
|
PLATFORM_EXT := unix
|
|
HAVE_VULKAN = 1
|
|
|
|
# QNX
|
|
else ifeq ($(platform), qnx)
|
|
fpic = -fPIC
|
|
EXT ?= so
|
|
TARGET := $(TARGET_NAME)_libretro_$(platform).$(EXT)
|
|
SHARED += -shared -Wl,--version-script=link.T -Wl,--no-undefined -Wl,--warn-common
|
|
|
|
CC = qcc -Vgcc_ntoarmv7le
|
|
CC_AS = qcc -Vgcc_ntoarmv7le
|
|
CXX = QCC -Vgcc_ntoarmv7le
|
|
AR = QCC -Vgcc_ntoarmv7le
|
|
WITH_DYNAREC=arm
|
|
HAVE_GENERIC_JIT = 0
|
|
FORCE_GLES = 1
|
|
DEFINES += -DTHREADED_RENDERING_DEFAULT
|
|
PLATCFLAGS += -DNO_ASM -D__BLACKBERRY_QNX__
|
|
CPUFLAGS += -marm -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=softfp -D__arm__ -DARM_ASM -D__NEON_OPT
|
|
CFLAGS += -D__QNX__
|
|
|
|
PLATFORM_EXT := unix
|
|
|
|
# ARM
|
|
else ifneq (,$(findstring armv,$(platform)))
|
|
EXT ?= so
|
|
TARGET := $(TARGET_NAME)_libretro.$(EXT)
|
|
SHARED += -shared -Wl,--version-script=link.T -Wl,--no-undefined
|
|
fpic := -fPIC
|
|
# not -DARM: the recompiler's emitter is in a namespace of that name
|
|
CPUFLAGS += -DNO_ASM -D__arm__ -DARM_ASM -DNOSSE
|
|
WITH_DYNAREC=arm
|
|
HAVE_GENERIC_JIT = 0
|
|
PLATCFLAGS += -DARM
|
|
ifneq (,$(findstring gles,$(platform)))
|
|
FORCE_GLES = 1
|
|
endif
|
|
ifneq (,$(findstring cortexa5,$(platform)))
|
|
CPUFLAGS += -marm -mcpu=cortex-a5
|
|
else ifneq (,$(findstring cortexa8,$(platform)))
|
|
CPUFLAGS += -marm -mcpu=cortex-a8
|
|
else ifneq (,$(findstring cortexa9,$(platform)))
|
|
CPUFLAGS += -marm -mcpu=cortex-a9
|
|
else ifneq (,$(findstring cortexa15a7,$(platform)))
|
|
CPUFLAGS += -marm -mcpu=cortex-a15.cortex-a7
|
|
else
|
|
CPUFLAGS += -marm
|
|
endif
|
|
ifneq (,$(findstring neon,$(platform)))
|
|
CPUFLAGS += -D__NEON_OPT -mfpu=neon
|
|
endif
|
|
ifneq (,$(findstring softfloat,$(platform)))
|
|
CPUFLAGS += -mfloat-abi=softfp
|
|
else ifneq (,$(findstring hardfloat,$(platform)))
|
|
CPUFLAGS += -mfloat-abi=hard
|
|
endif
|
|
# Every other ARM target hands its CPUFLAGS on like this. This one did
|
|
# not, so that -marm, the FPU, the float ABI and ARM_ASM never reached
|
|
# the compiler: it built with the toolchain's defaults, and where those
|
|
# are not NEON the recompiler's assembly file did not assemble at all.
|
|
CFLAGS += $(CPUFLAGS)
|
|
CXXFLAGS += $(CPUFLAGS)
|
|
ASFLAGS += $(CFLAGS) -c
|
|
DEFINES += -DTHREADED_RENDERING_DEFAULT
|
|
|
|
# LG webOS, 32-bit ARM (the SDK's arm-webos-linux-gnueabi toolchain: the
|
|
# softfp float ABI, which calls as soft-float code does). OpenGL ES 2 only:
|
|
# no Vulkan, no OpenMP.
|
|
else ifeq ($(platform), webos)
|
|
EXT ?= so
|
|
TARGET := $(TARGET_NAME)_libretro.$(EXT)
|
|
SHARED += -shared -Wl,--version-script=link.T -Wl,--no-undefined
|
|
fpic := -fPIC
|
|
# -ldl: the SDK links its libglibc_polyfills.a into every library, and
|
|
# its aligned_alloc() looks the C library's up with dlsym()
|
|
LIBS += -lrt -ldl
|
|
FORCE_GLES = 1
|
|
HAVE_VULKAN = 0
|
|
HAVE_OPENMP = 0
|
|
SINGLE_PREC_FLAGS = 1
|
|
CPUFLAGS += -marm -march=armv7-a -mfpu=neon -mfloat-abi=softfp -D__arm__ -DARM_ASM -DNOSSE -DNO_ASM
|
|
CFLAGS += $(CPUFLAGS)
|
|
CXXFLAGS += $(CPUFLAGS)
|
|
PLATFORM_EXT := unix
|
|
ARCH = arm
|
|
WITH_DYNAREC = arm
|
|
HAVE_GENERIC_JIT = 0
|
|
|
|
# emscripten
|
|
else ifeq ($(platform), emscripten)
|
|
EXT ?= bc
|
|
TARGET := $(TARGET_NAME)_libretro_$(platform).$(EXT)
|
|
FORCE_GLES := 1
|
|
WITH_DYNAREC=
|
|
CPUFLAGS += -Dasm=asmerror -D__asm__=asmerror -DNO_ASM -DNOSSE
|
|
SINGLE_THREAD := 1
|
|
PLATCFLAGS += -Drglgen_resolve_symbols_custom=reicast_rglgen_resolve_symbols_custom \
|
|
-Drglgen_resolve_symbols=reicast_rglgen_resolve_symbols
|
|
|
|
NO_REC=0
|
|
PLATFORM_EXT := unix
|
|
#HAVE_SHARED_CONTEXT := 1
|
|
|
|
# Windows
|
|
else
|
|
ifneq ($(HAVE_GL2), 1)
|
|
HAVE_GL3 = 1
|
|
endif
|
|
EXT ?= dll
|
|
HAVE_GENERIC_JIT = 0
|
|
HAVE_CDROM = 1
|
|
TARGET := $(TARGET_NAME)_libretro.$(EXT)
|
|
LDFLAGS += -shared -static-libgcc -static-libstdc++ -Wl,--version-script=link.T -lwinmm -lgdi32
|
|
GL_LIB := -lopengl32
|
|
LIBS := -lws2_32 -liphlpapi
|
|
PLATFORM_EXT := win32
|
|
SINGLE_PREC_FLAGS=1
|
|
CC ?= gcc
|
|
CXX ?= g++
|
|
WINDOWS_BUILD = 1
|
|
# win64 and win32 name the CPU built for, whatever the machine is
|
|
ifeq ($(platform), win64)
|
|
WITH_DYNAREC = x86_64
|
|
else ifeq ($(platform), win32)
|
|
WITH_DYNAREC = x86
|
|
endif
|
|
ifeq ($(WITH_DYNAREC), x86)
|
|
LDFLAGS += -m32
|
|
CFLAGS += -m32
|
|
endif
|
|
HAVE_VULKAN = 1
|
|
HAVE_D3D11 ?= 1
|
|
HAVE_D3D9 ?= 1
|
|
HAVE_D3D12 ?= 1
|
|
|
|
endif
|
|
|
|
ifeq ($(STATIC_LINKING),1)
|
|
fpic=
|
|
SHARED=
|
|
endif
|
|
|
|
ifeq ($(SINGLE_PREC_FLAGS),1)
|
|
CORE_DEFINES += -fno-builtin-sqrtf
|
|
endif
|
|
|
|
ifeq ($(ARMV7A_FLAGS),1)
|
|
MFLAGS += -marm -march=armv7-a
|
|
ASFLAGS += -march=armv7-a
|
|
endif
|
|
|
|
ifeq ($(ARMV7_CORTEX_A9_FLAGS),1)
|
|
MFLAGS += -mcpu=cortex-a9
|
|
endif
|
|
|
|
ifeq ($(ARM_FLOAT_ABI_HARD),1)
|
|
MFLAGS += -mfloat-abi=hard
|
|
ASFLAGS += -mfloat-abi=hard
|
|
CFLAGS += -DARM_HARDFP
|
|
endif
|
|
|
|
ifneq (,$(filter $(WITH_DYNAREC), x86_64 x64))
|
|
HOST_CPU_FLAGS = -DHOST_CPU=$(HOST_CPU_X64)
|
|
HAVE_LTCG = 0
|
|
endif
|
|
|
|
ifeq ($(WITH_DYNAREC), x86)
|
|
HOST_CPU_FLAGS = -DHOST_CPU=$(HOST_CPU_X86)
|
|
endif
|
|
|
|
ifeq ($(WITH_DYNAREC), arm)
|
|
HOST_CPU_FLAGS = -DHOST_CPU=$(HOST_CPU_ARM)
|
|
endif
|
|
|
|
ifneq (,$(filter $(WITH_DYNAREC), arm64 aarch64))
|
|
HOST_CPU_FLAGS = -DHOST_CPU=$(HOST_CPU_ARM64)
|
|
endif
|
|
|
|
ifeq ($(WITH_DYNAREC), mips)
|
|
HOST_CPU_FLAGS = -DHOST_CPU=$(HOST_CPU_MIPS)
|
|
endif
|
|
|
|
# No recompiler for this processor (WITH_DYNAREC empty, or one there is
|
|
# none for): the generic CPU
|
|
ifeq ($(HOST_CPU_FLAGS),)
|
|
HOST_CPU_FLAGS = -DHOST_CPU=$(HOST_CPU_GENERIC)
|
|
endif
|
|
|
|
ifeq ($(FORCE_GLES),1)
|
|
GLES = 1
|
|
GL_LIB := -lGLESv2
|
|
else ifneq (,$(findstring gles,$(platform)))
|
|
GLES = 1
|
|
GL_LIB := -lGLESv2
|
|
else ifeq ($(WINDOWS_BUILD), 1)
|
|
GL_LIB := -lopengl32
|
|
else ifneq (,$(findstring osx,$(platform)))
|
|
GL_LIB := -framework OpenGL
|
|
else ifneq (,$(findstring ios,$(platform)))
|
|
GL_LIB := -framework OpenGLES
|
|
else ifeq ($(GL_LIB),)
|
|
GL_LIB := -lGL
|
|
endif
|
|
|
|
CFLAGS += $(HOST_CPU_FLAGS)
|
|
CXXFLAGS += $(HOST_CPU_FLAGS)
|
|
RZDCY_CFLAGS += $(HOST_CPU_FLAGS)
|
|
|
|
# The SH4's floating point is done in the host's, and has to come out the
|
|
# same to the bit on every host: what a game works out is in its memory, and
|
|
# a netplay peer, or a state taken to another machine, has to have it too.
|
|
# So no multiply and add made into one fused multiply-add where the code
|
|
# has two operations (it rounds once where the code rounds twice: an ARM
|
|
# host's compiler does that unasked, an x86-64 one does not), and on 32-bit
|
|
# x86 the SSE unit and not the x87, whose registers keep more bits than a
|
|
# float has and which does not go by the rounding mode the SH4 sets (in
|
|
# MXCSR, hw/sh4/sh4_core_regs.cpp): games set rounding towards zero. And
|
|
# none of fast-math, which the platforms above that ask for -Ofast or
|
|
# -ffast-math would have: it lets the compiler reorder sums, which then come
|
|
# out another way (this comes after their flags, and wins).
|
|
ifeq (,$(findstring msvc,$(platform)))
|
|
CORE_DEFINES += -ffp-contract=off -fno-fast-math
|
|
ifeq ($(HOST_CPU_FLAGS),-DHOST_CPU=$(HOST_CPU_X86))
|
|
CORE_DEFINES += -msse2 -mfpmath=sse
|
|
endif
|
|
endif
|
|
|
|
# The OpenGL per-pixel renderer needs OpenGL 4.3, which is desktop OpenGL
|
|
# only. It is built wherever the core is built for desktop OpenGL 3 and up.
|
|
# Whether it is used is up to the Alpha Sorting core option: set to
|
|
# per-pixel, the core asks the frontend for a 4.3 context, and goes back to
|
|
# the per-triangle renderer if there is none to be had.
|
|
ifeq ($(HAVE_GL3), 1)
|
|
ifneq ($(GLES), 1)
|
|
HAVE_GL4 = 1
|
|
endif
|
|
endif
|
|
|
|
include Makefile.common
|
|
|
|
ifeq ($(WITH_DYNAREC), x86)
|
|
HAVE_LTCG = 0
|
|
endif
|
|
|
|
ifeq ($(DEBUG_ASAN),1)
|
|
DEBUG = 1
|
|
DEBUG_UBSAN = 0
|
|
LDFLAGS += -lasan -fsanitize=address
|
|
CFLAGS += -fsanitize=address
|
|
endif
|
|
|
|
ifeq ($(DEBUG_UBSAN),1)
|
|
DEBUG = 1
|
|
CFLAGS += -fsanitize=undefined
|
|
LDFLAGS += -lubsan -fsanitize=undefined
|
|
endif
|
|
|
|
ifeq ($(DEBUG),1)
|
|
OPTFLAGS := -O0
|
|
LDFLAGS += -g
|
|
CFLAGS += -g
|
|
else
|
|
ifneq (,$(findstring msvc,$(platform)))
|
|
OPTFLAGS := -O2
|
|
else ifneq (,$(findstring classic_arm,$(platform)))
|
|
OPTFLAGS := -O2
|
|
else ifeq (,$(findstring classic_arm,$(platform)))
|
|
OPTFLAGS := -O3
|
|
endif
|
|
|
|
CORE_DEFINES += -DNDEBUG
|
|
LDFLAGS += -DNDEBUG
|
|
|
|
ifeq ($(HAVE_LTCG), 1)
|
|
CORE_DEFINES += -flto
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(HAVE_GL3), 1)
|
|
HAVE_CORE = 1
|
|
CORE_DEFINES += -DHAVE_GL3
|
|
endif
|
|
|
|
RZDCY_CFLAGS += $(CFLAGS) -c $(OPTFLAGS) -frename-registers -ftree-vectorize -fomit-frame-pointer
|
|
|
|
ifeq ($(WITH_DYNAREC), arm)
|
|
ifneq (,$(findstring odroid,$(platform)))
|
|
BOARD ?= $(shell cat /proc/cpuinfo | grep -i odroid | awk '{print $$3}')
|
|
ifneq (,$(findstring ODROIDC,$(BOARD)))
|
|
# ODROID-C1
|
|
RZDCY_CFLAGS += -marm -mcpu=cortex-a5
|
|
else ifneq (,$(findstring ODROID-XU,$(BOARD)))
|
|
# ODROID-XU3, XU4 & XU3 Lite
|
|
RZDCY_CFLAGS += -marm -mcpu=cortex-a15 -mtune=cortex-a15.cortex-a7 -mfpu=neon-vfpv4
|
|
else
|
|
# ODROID-U2, -U3, -X & -X2
|
|
RZDCY_CFLAGS += -marm -mcpu=cortex-a9 -mfpu=neon
|
|
endif
|
|
else
|
|
RZDCY_CFLAGS += -march=armv7-a -mcpu=cortex-a9 -mfpu=vfpv3-d16
|
|
endif
|
|
RZDCY_CFLAGS += -DTARGET_LINUX_ARMELv7
|
|
else
|
|
RZDCY_CFLAGS += -DTARGET_LINUX_x86
|
|
endif
|
|
|
|
ifeq ($(NO_THREADS),1)
|
|
CORE_DEFINES += -DTARGET_NO_THREADS
|
|
else
|
|
CORE_DEFINES += -DHAVE_THREADS
|
|
NEED_PTHREAD=1
|
|
endif
|
|
|
|
ifeq ($(NO_REC),1)
|
|
CORE_DEFINES += -DTARGET_NO_REC
|
|
endif
|
|
|
|
|
|
ifeq ($(NO_EXCEPTIONS),1)
|
|
CORE_DEFINES += -DTARGET_NO_EXCEPTIONS=1
|
|
endif
|
|
|
|
ifeq ($(NO_NVMEM),1)
|
|
CORE_DEFINES += -DTARGET_NO_NVMEM=1
|
|
endif
|
|
|
|
RZDCY_CXXFLAGS := $(RZDCY_CFLAGS) -fexceptions -fno-rtti -std=gnu++11
|
|
|
|
ifeq (,$(findstring msvc,$(platform)))
|
|
CORE_DEFINES += -funroll-loops
|
|
endif
|
|
|
|
ifeq ($(HAVE_GL4), 1)
|
|
CORE_DEFINES += -DHAVE_GL4
|
|
endif
|
|
|
|
ifeq ($(HAVE_CORE), 1)
|
|
CORE_DEFINES += -DCORE
|
|
endif
|
|
|
|
ifeq ($(HAVE_TEXUPSCALE), 1)
|
|
CORE_DEFINES += -DHAVE_TEXUPSCALE
|
|
ifeq ($(HAVE_OPENMP), 1)
|
|
CFLAGS += -fopenmp
|
|
CXXFLAGS += -fopenmp
|
|
LDFLAGS += -fopenmp
|
|
else
|
|
CFLAGS += -DTARGET_NO_OPENMP
|
|
CXXFLAGS += -DTARGET_NO_OPENMP
|
|
endif
|
|
ifeq ($(WINDOWS_BUILD), 1)
|
|
LDFLAGS_END += -Wl,-Bstatic -lgomp -lwsock32 -lws2_32 -liphlpapi
|
|
endif
|
|
NEED_CXX11=1
|
|
NEED_PTHREAD=1
|
|
endif
|
|
|
|
ifeq ($(NEED_PTHREAD), 1)
|
|
LIBS += -lpthread
|
|
endif
|
|
|
|
ifeq ($(HAVE_GL), 1)
|
|
ifeq ($(GLES),1)
|
|
CORE_DEFINES += -DHAVE_OPENGLES -DHAVE_OPENGLES2
|
|
else
|
|
CORE_DEFINES += -DHAVE_OPENGL
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(HAVE_VULKAN), 1)
|
|
CORE_DEFINES += -DHAVE_VULKAN
|
|
endif
|
|
|
|
ifeq ($(HAVE_D3D11), 1)
|
|
CORE_DEFINES += -DHAVE_D3D11
|
|
endif
|
|
|
|
ifeq ($(HAVE_D3D9), 1)
|
|
CORE_DEFINES += -DHAVE_D3D9
|
|
endif
|
|
|
|
ifeq ($(HAVE_D3D12), 1)
|
|
CORE_DEFINES += -DHAVE_D3D12
|
|
endif
|
|
|
|
ifeq ($(DEBUG), 1)
|
|
HAVE_GENERIC_JIT = 0
|
|
endif
|
|
|
|
ifeq ($(HAVE_GENERIC_JIT), 1)
|
|
CORE_DEFINES += -DTARGET_NO_JIT
|
|
NEED_CXX11=1
|
|
endif
|
|
|
|
ifeq ($(NEED_CXX11), 1)
|
|
CXXFLAGS += -std=c++11
|
|
endif
|
|
|
|
# Content files are memory-mapped where the platform has mmap().
|
|
ifeq ($(WINDOWS_BUILD), 1)
|
|
else ifeq ($(platform), libnx)
|
|
else ifeq ($(platform), emscripten)
|
|
else
|
|
HAVE_MMAP ?= 1
|
|
endif
|
|
ifeq ($(HAVE_MMAP), 1)
|
|
CORE_DEFINES += -DHAVE_MMAP
|
|
endif
|
|
|
|
ifeq ($(HAVE_CHD),1)
|
|
CORE_DEFINES += -DHAVE_CHD -DHAVE_RCHD -DHAVE_RCHD_DEFLATE -DHAVE_RCHD_LZMA -DHAVE_RCHD_FLAC -DHAVE_RCHD_ZSTD -DHAVE_RFLAC -DHAVE_RZSTD
|
|
endif
|
|
|
|
RZDCY_CFLAGS += $(CORE_DEFINES)
|
|
RZDCY_CXXFLAGS += $(CORE_DEFINES)
|
|
CFLAGS += $(CORE_DEFINES)
|
|
CXXFLAGS += $(CORE_DEFINES)
|
|
|
|
CFLAGS += $(OPTFLAGS) -c
|
|
CFLAGS += -fno-strict-aliasing
|
|
CXXFLAGS += -fno-rtti -fpermissive -fno-operator-names
|
|
LIBS += -lm
|
|
|
|
PREFIX ?= /usr/local
|
|
|
|
ifneq (,$(findstring arm, $(ARCH)))
|
|
CC_AS = ${CC_PREFIX}${CC} #The ngen_arm.S must be compiled with gcc, not as
|
|
endif
|
|
# The recompilers' assembly files include build.h and need what the C++ is
|
|
# built with, HOST_CPU above all: without it the 32-bit one leaves out the
|
|
# sound processor's entry point, and the link fails. That goes by what is
|
|
# being built for, not by the machine doing the building, which is all
|
|
# that was looked at - so a 32-bit ARM core could not be cross-built.
|
|
#
|
|
# Only where a compiler does the assembling, though. A platform that sets
|
|
# the assembler itself to a bare "as" (libnx does, for the 64-bit file, which
|
|
# has nothing for a preprocessor in it) is given what it was given before:
|
|
# "as" knows no -D, and stops at the first one.
|
|
ifneq (,$(findstring arm, $(ARCH))$(filter arm arm64,$(WITH_DYNAREC)))
|
|
ifeq (,$(filter as %-as,$(notdir $(firstword $(CC_AS)))))
|
|
ASFLAGS += $(CFLAGS)
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(PGO_MAKE),1)
|
|
CFLAGS += -fprofile-generate -pg
|
|
LDFLAGS += -fprofile-generate
|
|
else
|
|
CFLAGS += -fomit-frame-pointer
|
|
endif
|
|
|
|
ifeq ($(PGO_USE),1)
|
|
CFLAGS += -fprofile-use
|
|
endif
|
|
|
|
ifeq ($(LTO_TEST),1)
|
|
CFLAGS += -flto -fwhole-program
|
|
LDFLAGS +=-flto -fwhole-program
|
|
endif
|
|
|
|
CFLAGS += $(fpic)
|
|
CXXFLAGS += $(fpic)
|
|
LDFLAGS += $(fpic)
|
|
|
|
OBJECTS := $(SOURCES_CXX:.cpp=.o) $(SOURCES_C:.c=.o) $(SOURCES_ASM:.S=.o)
|
|
OBJECTS:=$(OBJECTS:.cc=.o)
|
|
|
|
ifneq (,$(findstring msvc,$(platform)))
|
|
OBJOUT = -Fo
|
|
LINKOUT = -out:
|
|
LD = link.exe
|
|
else
|
|
LD = $(CXX)
|
|
endif
|
|
|
|
all: $(TARGET)
|
|
$(TARGET): $(OBJECTS)
|
|
ifeq ($(STATIC_LINKING), 1)
|
|
$(AR) rcs $@ $(OBJECTS)
|
|
else
|
|
$(LD) $(MFLAGS) $(fpic) $(SHARED) $(LDFLAGS) $(OBJECTS) $(LDFLAGS_END) $(GL_LIB) $(LIBS) -o $@
|
|
endif
|
|
|
|
# Header dependencies. Every compile also writes a .d file naming the
|
|
# headers it read, and those are read back in here, so that changing a
|
|
# header rebuilds what includes it. Without this a build that is not from
|
|
# scratch can link objects made against two versions of the same header.
|
|
# For compilers that take GCC's options, which leaves out MSVC and QNX's qcc.
|
|
ifeq (,$(findstring msvc,$(platform))$(findstring qnx,$(platform)))
|
|
DEPFLAGS = -MMD -MP
|
|
-include $(OBJECTS:.o=.d)
|
|
endif
|
|
|
|
%.o: %.cpp
|
|
@$(if $(E), $(shell echo echo CXX $<),)
|
|
$(CXX) $(INCFLAGS) $(CFLAGS) $(MFLAGS) $(CXXFLAGS) $(DEPFLAGS) $< -o $@
|
|
|
|
%.o: %.cc
|
|
@$(if $(E), $(shell echo echo CXX $<),)
|
|
$(CXX) $(INCFLAGS) $(CFLAGS) $(MFLAGS) $(CXXFLAGS) $(DEPFLAGS) $< -o $@
|
|
|
|
%.o: %.c
|
|
@$(if $(E), $(shell echo echo CC $<),)
|
|
$(CC) $(INCFLAGS) $(CFLAGS) $(MFLAGS) $(DEPFLAGS) $< -o $@
|
|
|
|
%.o: %.S
|
|
@$(if $(E), $(shell echo echo CC $<),)
|
|
$(CC_AS) $(ASFLAGS) $(INCFLAGS) $< -o $@
|
|
|
|
clean:
|
|
rm -f $(OBJECTS) $(OBJECTS:.o=.d) $(TARGET)
|
|
|