Files
fuse-libretro/Makefile.libretro
LibretroAdmin 7a3b7befdb Build with -ffunction-sections: 1796176 -> 1592424 bytes, 11.3% off
This core links whole vendored trees for the sake of a few entry points.
libspectrum calls BZ2_bzBuffToBuffDecompress and BZ2_bzDecompress*, and
nothing else in bzip2: its compression half and the FILE* API are dead.
Of libretro-common only the VFS, path and string helpers are used;
filestream_vscanf, filestream_copy and
fill_pathname_abbreviated_or_relative are not. Without -ffunction-sections
the linker's unit is the whole object file, so one live symbol keeps every
dead one beside it.

Trimming those functions out of the vendored sources would work and is the
wrong fix. Divergence between this tree's deps/libretro-common and
upstream is exactly what broke the six build-static jobs three commits
ago, and hand-editing bzip2's internals to split decompress from compress
buys the same problem in a second dependency. Give the linker per-symbol
granularity and let it decide instead of the source.

Dropped from the shared build, verified with nm: BZ2_hbMakeCodeLengths,
mainSort, fallbackSort, bzopen_or_bzdopen, filestream_vscanf,
filestream_copy, fill_pathname_abbreviated_or_relative. The export set is
unchanged - the same 47 retro_* symbols before and after, diffed
symbol for symbol.

Static-linking platforms get the compile flags but not --gc-sections: they
produce an archive and it is the frontend's link that resolves it, so the
sections are there for RetroArch's linker to use. The findstring guard on
SHARED keeps the link flag off emscripten, which sets no SHARED, and
theos_ios, which links through its own rules.
2026-08-11 18:06:00 +02:00

612 lines
19 KiB
Makefile

CORE_DIR = .
BUILD_DIR = build
ifeq ($(platform),android_arm64-v8a)
include $(BUILD_DIR)/Makefile.android_arm64-v8a
else ifeq ($(platform),android_armeabi)
include $(BUILD_DIR)/Makefile.android_armeabi
else ifeq ($(platform),android_armeabi-v7a)
include $(BUILD_DIR)/Makefile.android_armeabi-v7a
else ifeq ($(platform),android_mips)
include $(BUILD_DIR)/Makefile.android_mips
else ifeq ($(platform),android_mips64)
include $(BUILD_DIR)/Makefile.android_mips64
else ifeq ($(platform),android_x86)
include $(BUILD_DIR)/Makefile.android_x86
else ifeq ($(platform),android_x86_64)
include $(BUILD_DIR)/Makefile.android_x86_64
else ifeq ($(platform),linux-portable_x86)
include $(BUILD_DIR)/Makefile.linux-portable_x86
else ifeq ($(platform),linux-portable_x86_64)
include $(BUILD_DIR)/Makefile.linux-portable_x86_64
else ifeq ($(platform),linux_x86)
include $(BUILD_DIR)/Makefile.linux_x86
else ifeq ($(platform),linux_x86_64)
include $(BUILD_DIR)/Makefile.linux_x86_64
else ifeq ($(platform),mingw_x86)
include $(BUILD_DIR)/Makefile.mingw_x86
else ifeq ($(platform),mingw_x86_64)
include $(BUILD_DIR)/Makefile.mingw_x86_64
else ifeq ($(platform),osx_x86)
include $(BUILD_DIR)/Makefile.osx_x86
else ifeq ($(platform),osx_x86_64)
include $(BUILD_DIR)/Makefile.osx_x86_64
else ifeq ($(platform),ps3_ppc)
include $(BUILD_DIR)/Makefile.ps3_ppc
else ifeq ($(platform),wii_ppc)
include $(BUILD_DIR)/Makefile.wii_ppc
else ifeq ($(platform),windows_x86)
include $(BUILD_DIR)/Makefile.windows_x86
else ifeq ($(platform),windows_x86_64)
include $(BUILD_DIR)/Makefile.windows_x86_64
else
TARGET_NAME := fuse
LOG_PERFORMANCE = 0
HAVE_COMPAT = 0
SOURCES_C :=
SOURCES_CXX :=
LIBS :=
ifeq ($(platform),)
platform = unix
ifeq ($(shell uname -a),)
platform = win
else ifneq ($(findstring MINGW,$(shell uname -a)),)
platform = win
else ifneq ($(findstring Darwin,$(shell uname -a)),)
platform = osx
else ifneq ($(findstring win,$(shell uname -a)),)
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 = intel
ifeq ($(shell uname -p),arm64)
arch = arm
endif
ifeq ($(shell uname -p),powerpc)
arch = ppc
endif
else ifneq ($(findstring MINGW,$(shell uname -a)),)
system_platform = win
endif
CC_AS ?= $(CC)
LIBM := -lm
# Unix
ifneq (,$(findstring unix,$(platform)))
TARGET := $(TARGET_NAME)_libretro.so
fpic := -fPIC
SHARED := -shared -Wl,-version-script=build/link.T -Wl,-no-undefined
else ifneq (,$(findstring linux-portable,$(platform)))
TARGET := $(TARGET_NAME)_libretro.so
fpic := -fPIC -nostdlib
LIBM :=
SHARED := -shared -Wl,-version-script=build/link.T
# Raspberry Pi 1
else ifeq ($(platform), rpi1)
TARGET := $(TARGET_NAME)_libretro.so
fpic = -fPIC
SHARED := -shared -Wl,-version-script=build/link.T -Wl,-no-undefined
PLATFORM_DEFINES += -marm -mfpu=vfp -mfloat-abi=hard -march=armv6j
PLATFORM_DEFINES += -fomit-frame-pointer -ffast-math
PLATFORM_DEFINES += -DARM
# Raspberry Pi 2
else ifeq ($(platform), rpi2)
TARGET := $(TARGET_NAME)_libretro.so
fpic = -fPIC
SHARED := -shared -Wl,-version-script=build/link.T -Wl,-no-undefined
PLATFORM_DEFINES += -marm -mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard
PLATFORM_DEFINES += -fomit-frame-pointer -ffast-math
PLATFORM_DEFINES += -DARM
HAVE_NEON = 1
# Raspberry Pi 3
else ifeq ($(platform), rpi3)
TARGET := $(TARGET_NAME)_libretro.so
fpic = -fPIC
SHARED := -shared -Wl,-version-script=build/link.T -Wl,-no-undefined
PLATFORM_DEFINES += -marm -mcpu=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard
PLATFORM_DEFINES += -fomit-frame-pointer -ffast-math
PLATFORM_DEFINES += -DARM
HAVE_NEON = 1
# Raspberry Pi 3 (64 bits)
else ifeq ($(platform), rpi3_64)
TARGET := $(TARGET_NAME)_libretro.so
fpic = -fPIC
SHARED := -shared -Wl,-version-script=build/link.T -Wl,-no-undefined
PLATFORM_DEFINES += -march=armv8-a+crc+simd -mtune=cortex-a53
PLATFORM_DEFINES += -fomit-frame-pointer -ffast-math
PLATFORM_DEFINES += -DARM
HAVE_NEON = 1
# Raspberry Pi 4 (64 bits)
else ifeq ($(platform), rpi4_64)
TARGET := $(TARGET_NAME)_libretro.so
fpic = -fPIC
SHARED := -shared -Wl,-version-script=build/link.T -Wl,-no-undefined
PLATFORM_DEFINES += -march=armv8-a+crc+simd -mtune=cortex-a72
PLATFORM_DEFINES += -fomit-frame-pointer -ffast-math
PLATFORM_DEFINES += -DARM
HAVE_NEON = 1
# Classic Platforms ####################
# Platform affix = classic_<ISA>_<µARCH>
# Help at https://modmyclassic.com/comp
# (armv7 a7, hard point, neon based) ###
# NESC, SNESC, C64 mini
else ifeq ($(platform), classic_armv7_a7)
TARGET := $(TARGET_NAME)_libretro.so
fpic := -fPIC
SHARED :=-shared -Wl,--version-script=build/link.T -Wl,--no-undefined
PLATFORM_DEFINES += -DARM -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 += $(PLATFORM_DEFINES)
CPPFLAGS += $(PLATFORM_DEFINES)
ASFLAGS += $(PLATFORM_DEFINES)
HAVE_NEON = 1
ifeq ($(shell echo `$(CC) -dumpversion` "< 4.9" | bc -l), 1)
CFLAGS += -march=armv7-a
else
CFLAGS += -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
#######################################
# (armv8 a35, hard point, neon based) ###
# PlayStation Classic
else ifeq ($(platform), classic_armv8_a35)
TARGET := $(TARGET_NAME)_libretro.so
fpic := -fPIC
SHARED := -shared -Wl,--version-script=build/link.T -Wl,--no-undefined
CFLAGS += -DARM -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)
CPPFLAGS += $(CFLAGS)
HAVE_NEON = 1
ARCH = arm
LDFLAGS += -lrt
LDFLAGS += -marm -mcpu=cortex-a35 -mfpu=neon-fp-armv8 -mfloat-abi=hard -Ofast -flto -fuse-linker-plugin
#######################################
# OS X
else ifeq ($(platform), osx)
TARGET := $(TARGET_NAME)_libretro.dylib
fpic := -fPIC
SHARED := -dynamiclib
OSXVER = `sw_vers -productVersion | cut -d. -f 2`
OSX_LT_MAVERICKS = `(( $(OSXVER) <= 9)) && echo "YES"`
ifeq ($(OSX_LT_MAVERICKS),YES)
fpic += -mmacosx-version-min=10.2
endif
ifeq ($(arch),ppc)
CFLAGS += -DWORDS_BIGENDIAN -DMSB_FIRST
endif
ifeq ($(CROSS_COMPILE),1)
TARGET_RULE = -target $(LIBRETRO_APPLE_PLATFORM) -isysroot $(LIBRETRO_APPLE_ISYSROOT)
CFLAGS += $(TARGET_RULE)
LDFLAGS += $(TARGET_RULE)
endif
# iOS
else ifneq (,$(findstring ios,$(platform)))
TARGET := $(TARGET_NAME)_libretro_ios.dylib
fpic := -fPIC
SHARED := -dynamiclib
MINVERSION :=
ifeq ($(IOSSDK),)
IOSSDK := $(shell xcodebuild -version -sdk iphoneos Path)
endif
ifeq ($(platform),ios-arm64)
CC = cc -arch arm64 -isysroot $(IOSSDK)
CXX = c++ -arch arm64 -isysroot $(IOSSDK)
else
CC = cc -arch armv7 -isysroot $(IOSSDK)
CXX = c++ -arch armv7 -isysroot $(IOSSDK)
endif
CC_AS = perl ./tools/gas-preprocessor.pl $(CC)
ifeq ($(platform),$(filter $(platform),ios9 ios-arm64))
MINVERSION = -miphoneos-version-min=8.0
else
MINVERSION = -miphoneos-version-min=5.0
endif
PLATFORM_DEFINES := $(MINVERSION)
LDFLAGS += $(MINVERSION)
ifeq ($(platform),ios-arm64)
PLATFORM_DEFINES += -D_IOS_ARM64
endif
else ifeq ($(platform), tvos-arm64)
TARGET := $(TARGET_NAME)_libretro_tvos.dylib
fpic := -fPIC
SHARED := -dynamiclib
ifeq ($(IOSSDK),)
IOSSDK := $(shell xcodebuild -version -sdk appletvos Path)
endif
PLATFORM_DEFINES += -D_IOS_ARM64
CC = cc -arch arm64 -isysroot $(IOSSDK)
CXX = c++ -arch arm64 -isysroot $(IOSSDK)
MINVERSION = -mappletvos-version-min=11.0
PLATFORM_DEFINES := $(MINVERSION)
LDFLAGS += $(MINVERSION)
# Theos
else ifeq ($(platform), theos_ios)
DEPLOYMENT_IOSVERSION = 5.0
TARGET = iphone:latest:$(DEPLOYMENT_IOSVERSION)
ARCHS = armv7 armv7s
TARGET_IPHONEOS_DEPLOYMENT_VERSION=$(DEPLOYMENT_IOSVERSION)
THEOS_BUILD_DIR := objs
include $(THEOS)/makefiles/common.mk
LIBRARY_NAME = $(TARGET_NAME)_libretro_ios
# QNX
else ifeq ($(platform), qnx)
TARGET := $(TARGET_NAME)_libretro_qnx.so
fpic := -fPIC
SHARED := -lcpp -lm -shared -Wl,-version-script=build/link.T
CC = qcc -Vgcc_ntoarmv7le
CC_AS = qcc -Vgcc_ntoarmv7le
CXX = QCC -Vgcc_ntoarmv7le_cpp
AR = QCC -Vgcc_ntoarmv7le
PLATFORM_DEFINES := -D__BLACKBERRY_QNX__ -fexceptions -marm -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=softfp
# Lightweight PS3 Homebrew SDK
else ifneq (,$(filter $(platform), ps3 psl1ght))
TARGET := $(TARGET_NAME)_libretro_$(platform).a
CC = $(PS3DEV)/ppu/bin/ppu-$(COMMONLV)gcc$(EXE_EXT)
CC_AS = $(PS3DEV)/ppu/bin/ppu-$(COMMONLV)gcc$(EXE_EXT)
CXX = $(PS3DEV)/ppu/bin/ppu-$(COMMONLV)g++$(EXE_EXT)
AR = $(PS3DEV)/ppu/bin/ppu-$(COMMONLV)ar$(EXE_EXT)
PLATFORM_DEFINES := -D__PS3__
STATIC_LINKING = 1
HAVE_COMPAT = 1
CFLAGS += -DWORDS_BIGENDIAN -DMSB_FIRST
ifeq ($(platform), psl1ght)
PLATFORM_DEFINES += -D__PSL1GHT__
endif
# PSP
else ifeq ($(platform), psp1)
TARGET := $(TARGET_NAME)_libretro_$(platform).a
CC = psp-gcc$(EXE_EXT)
CC_AS = psp-gcc$(EXE_EXT)
CXX = psp-g++$(EXE_EXT)
AR = psp-ar$(EXE_EXT)
PLATFORM_DEFINES := -DPSP
CFLAGS += -G0
CXXFLAGS += -G0
STATIC_LINKING = 1
HAVE_COMPAT = 1
EXTRA_INCLUDES := -I$(shell psp-config --pspsdk-path)/include
# Xbox 360
else ifeq ($(platform), xenon)
TARGET := $(TARGET_NAME)_libretro_xenon360.a
CC = xenon-gcc$(EXE_EXT)
CC_AS = xenon-gcc$(EXE_EXT)
CXX = xenon-g++$(EXE_EXT)
AR = xenon-ar$(EXE_EXT)
PLATFORM_DEFINES := -D__LIBXENON__
STATIC_LINKING = 1
# Nintendo Game Cube
else ifeq ($(platform), ngc)
TARGET := $(TARGET_NAME)_libretro_$(platform).a
CC = $(DEVKITPPC)/bin/powerpc-eabi-gcc$(EXE_EXT)
CC_AS = $(DEVKITPPC)/bin/powerpc-eabi-gcc$(EXE_EXT)
CXX = $(DEVKITPPC)/bin/powerpc-eabi-g++$(EXE_EXT)
AR = $(DEVKITPPC)/bin/powerpc-eabi-ar$(EXE_EXT)
PLATFORM_DEFINES += -DGEKKO -DHW_DOL -mrvl -mcpu=750 -meabi -mhard-float
PLATFORM_DEFINES += -U__INT32_TYPE__ -U __UINT32_TYPE__ -D__INT32_TYPE__=int
STATIC_LINKING = 1
HAVE_COMPAT = 1
CFLAGS += -DWORDS_BIGENDIAN -DMSB_FIRST
# Nintendo Wii
else ifeq ($(platform), wii)
TARGET := $(TARGET_NAME)_libretro_$(platform).a
CC = $(DEVKITPPC)/bin/powerpc-eabi-gcc$(EXE_EXT)
CC_AS = $(DEVKITPPC)/bin/powerpc-eabi-gcc$(EXE_EXT)
CXX = $(DEVKITPPC)/bin/powerpc-eabi-g++$(EXE_EXT)
AR = $(DEVKITPPC)/bin/powerpc-eabi-ar$(EXE_EXT)
PLATFORM_DEFINES += -DGEKKO -DHW_RVL -mrvl -mcpu=750 -meabi -mhard-float
PLATFORM_DEFINES += -U__INT32_TYPE__ -U __UINT32_TYPE__ -D__INT32_TYPE__=int
STATIC_LINKING = 1
HAVE_COMPAT = 1
CFLAGS += -DWORDS_BIGENDIAN -DMSB_FIRST
# Nintendo WiiU
else ifeq ($(platform), wiiu)
TARGET := $(TARGET_NAME)_libretro_$(platform).a
CC = $(DEVKITPPC)/bin/powerpc-eabi-gcc$(EXE_EXT)
CC_AS = $(DEVKITPPC)/bin/powerpc-eabi-gcc$(EXE_EXT)
CXX = $(DEVKITPPC)/bin/powerpc-eabi-g++$(EXE_EXT)
AR = $(DEVKITPPC)/bin/powerpc-eabi-ar$(EXE_EXT)
PLATFORM_DEFINES += -DGEKKO -DWIIU -DHW_WUP -mcpu=750 -meabi -mhard-float
PLATFORM_DEFINES += -ffunction-sections -fdata-sections -D__wiiu__ -D__wut__
STATIC_LINKING = 1
HAVE_COMPAT = 1
CFLAGS += -DWORDS_BIGENDIAN -DMSB_FIRST
# ARM
else ifneq (,$(findstring armv,$(platform)))
TARGET := $(TARGET_NAME)_libretro.so
fpic := -fPIC
SHARED := -shared -Wl,-version-script=build/link.T
CC = gcc
CC_AS = gcc
CXX = g++
ifneq (,$(findstring cortexa8,$(platform)))
PLATFORM_DEFINES += -marm -mcpu=cortex-a8
else ifneq (,$(findstring cortexa9,$(platform)))
PLATFORM_DEFINES += -marm -mcpu=cortex-a9
endif
PLATFORM_DEFINES += -marm
ifneq (,$(findstring neon,$(platform)))
PLATFORM_DEFINES += -mfpu=neon
HAVE_NEON = 1
endif
ifneq (,$(findstring softfloat,$(platform)))
PLATFORM_DEFINES += -mfloat-abi=softfp
else ifneq (,$(findstring hardfloat,$(platform)))
PLATFORM_DEFINES += -mfloat-abi=hard
endif
PLATFORM_DEFINES += -DARM
# Nintendo Switch (libnx)
else ifeq ($(platform), libnx)
include $(DEVKITPRO)/libnx/switch_rules
TARGET := $(TARGET_NAME)_libretro_$(platform).a
DEFINES := -DSWITCH=1 -U__linux__ -U__linux -DRARCH_INTERNAL
CFLAGS := $(DEFINES) -g \
-O3 \
-fPIE -I$(LIBNX)/include/ -ffunction-sections -fdata-sections -ftls-model=local-exec -Wl,--allow-multiple-definition -specs=$(LIBNX)/switch.specs
CFLAGS += $(INCDIRS)
CFLAGS += $(INCLUDE) -D__SWITCH__ -DHAVE_LIBNX -DARM -march=armv8-a -mtune=cortex-a57 -mtp=soft -fomit-frame-pointer -ffast-math
CXXFLAGS := $(ASFLAGS) $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11
CFLAGS += -std=gnu11
STATIC_LINKING = 1
# emscripten
else ifeq ($(platform), emscripten)
TARGET := $(TARGET_NAME)_libretro_emscripten.bc
# CTR (3DS)
else ifeq ($(platform), ctr)
TARGET := $(TARGET_NAME)_libretro_$(platform).a
CC = $(DEVKITARM)/bin/arm-none-eabi-gcc$(EXE_EXT)
CXX = $(DEVKITARM)/bin/arm-none-eabi-g++$(EXE_EXT)
AR = $(DEVKITARM)/bin/arm-none-eabi-ar$(EXE_EXT)
STATIC_LINKING = 1
CFLAGS += -D_3DS
CXXFLAGS += -D_3DS
CFLAGS += -DARM11
CFLAGS += -march=armv6k -mtune=mpcore -mfloat-abi=hard
CFLAGS += -Wall -mword-relocations
CFLAGS += -fomit-frame-pointer -ffast-math
CXXFLAGS += -DARM11
CXXFLAGS += -march=armv6k -mtune=mpcore -mfloat-abi=hard
CXXFLAGS += -Wall -mword-relocations
CXXFLAGS += -fomit-frame-pointer -ffast-math
# Vita
else ifeq ($(platform), vita)
TARGET := $(TARGET_NAME)_libretro_$(platform).a
CC = arm-vita-eabi-gcc$(EXE_EXT)
CXX = arm-vita-eabi-g++$(EXE_EXT)
AR = arm-vita-eabi-ar$(EXE_EXT)
STATIC_LINKING = 1
CFLAGS += -DVITA -ftree-vectorize -mfloat-abi=hard -ffast-math -fsingle-precision-constant -funroll-loops -fno-short-enums
CXXFLAGS += -DVITA -ftree-vectorize -mfloat-abi=hard -ffast-math -fsingle-precision-constant -funroll-loops -fno-short-enums
# RETROFW
else ifeq ($(platform), retrofw)
TARGET := $(TARGET_NAME)_libretro.so
CC = /opt/retrofw-toolchain/usr/bin/mipsel-linux-gcc
CXX = /opt/retrofw-toolchain/usr/bin/mipsel-linux-g++
AR = /opt/retrofw-toolchain/usr/bin/mipsel-linux-ar
fpic := -fPIC
SHARED := -shared -Wl,-version-script=build/link.T -Wl,-no-undefined
CFLAGS += -fomit-frame-pointer -march=mips32 -mtune=mips32 -mhard-float
CXXFLAGS += -fomit-frame-pointer -march=mips32 -mtune=mips32 -mhard-float
# MIYOO
else ifeq ($(platform), miyoo)
TARGET := $(TARGET_NAME)_libretro.so
CC = /opt/miyoo/usr/bin/arm-linux-gcc
CXX = /opt/miyoo/usr/bin/arm-linux-g++
AR = /opt/miyoo/usr/bin/arm-linux-ar
fpic := -fPIC
SHARED := -shared -Wl,-version-script=build/link.T -Wl,-no-undefined
CFLAGS += -fomit-frame-pointer -march=armv5te -mtune=arm926ej-s
CXXFLAGS += -fomit-frame-pointer -march=armv5te -mtune=arm926ej-s
# GCW0 (OpenDingux and OpenDingux Beta)
else ifeq ($(platform), gcw0)
TARGET := $(TARGET_NAME)_libretro.so
CC = /opt/gcw0-toolchain/usr/bin/mipsel-linux-gcc
CXX = /opt/gcw0-toolchain/usr/bin/mipsel-linux-g++
AR = /opt/gcw0-toolchain/usr/bin/mipsel-linux-ar
fpic := -fPIC
SHARED := -shared -Wl,-version-script=build/link.T -Wl,-no-undefined
CFLAGS += -fomit-frame-pointer -march=mips32 -mtune=mips32r2 -mhard-float
CXXFLAGS += -fomit-frame-pointer -march=mips32 -mtune=mips32r2 -mhard-float
# Windows
else
TARGET := $(TARGET_NAME)_libretro.dll
CC ?= gcc
CC_AS ?= gcc
CXX ?= g++
SHARED := -shared -static-libgcc -static-libstdc++ -Wl,-no-undefined -Wl,-version-script=build/link.T
endif
ifeq ($(HAVE_COMPAT), 1)
PLATFORM_DEFINES += -DHAVE_COMPAT
endif
ifeq ($(DEBUG), 1)
CFLAGS += -O0 -g
CXXFLAGS += -O0 -g
else ifeq ($(platform), emscripten)
CFLAGS += -O2
CXXFLAGS += -O2 -fno-exceptions -fno-rtti -DHAVE_STDINT_H
else
CFLAGS += -O3
CXXFLAGS += -O3 -fno-exceptions -fno-rtti -DHAVE_STDINT_H
endif
ifeq ($(LOG_PERFORMANCE), 1)
CFLAGS += -DLOG_PERFORMANCE
CXXFLAGS += -DLOG_PERFORMANCE
endif
DEFINES := $(PLATFORM_DEFINES)
DEFINES += -DHAVE_CONFIG_H
# Give the linker per-symbol granularity so it can drop what nothing calls.
# This core links whole vendored trees for the sake of a few entry points:
# bzip2 for BZ2_bzBuffToBuffDecompress (its compression half, blocksort and
# the FILE* API included, is never called), libretro-common for the VFS and
# path helpers (filestream_vscanf, filestream_copy and friends are not),
# fuse's own utils_find_file_path/utils_find_auxiliary_file and
# settings_write_config have no callers left after the UI removal. Without
# -ffunction-sections the linker's unit is the whole object file, so one
# live symbol keeps every dead one beside it. Trimming those functions out
# of the vendored sources instead would put this tree further out of step
# with upstream, which is what broke the static-link builds in the first
# place, so let the linker decide rather than the source.
#
# Static-linking platforms get the flags too but not the --gc-sections
# below: they build an archive and it is the frontend's link that resolves
# it, so the sections are there for RetroArch's linker to use.
SECTION_FLAGS := -ffunction-sections -fdata-sections
CFLAGS += $(fpic) $(DEFINES) $(SECTION_FLAGS)
CFLAGS += -Wall
CXXFLAGS += $(fpic) $(DEFINES) $(SECTION_FLAGS)
CXXFLAGS += -Wall
ifneq ($(STATIC_LINKING), 1)
ifneq (,$(findstring -shared,$(SHARED)))
SHARED += -Wl,--gc-sections
endif
endif
LDFLAGS += $(LIBM)
ROMS =
SNAPS =
include build/Makefile.common
HEADERS += $(ROMS:.rom=.h) $(SNAPS:.szx=.h) $(CORE_DIR)/fuse/config.h $(CORE_DIR)/libspectrum/config.h
OBJS += $(SOURCES_C:.c=.o) $(SOURCES_CXX:.cpp=.o)
INCDIRS := $(EXTRA_INCLUDES) $(INCLUDES)
%.o: %.cpp
$(CXX) -c -o $@ $< $(CXXFLAGS) $(INCDIRS)
%.o: %.c
$(CC) -c -o $@ $< $(CFLAGS) $(INCDIRS)
# libretro-common is vendored standalone here rather than sitting inside
# RetroArch's source tree. RARCH_INTERNAL is RetroArch's marker for the
# latter, and compat/strl.h reacts to it by including "../../../config.h",
# a path that only resolves in RetroArch's layout. The libnx platform block
# defines RARCH_INTERNAL for the whole build, so drop it for these objects.
deps/libretro-common/%.o: deps/libretro-common/%.c
$(CC) -c -o $@ $< $(CFLAGS) -URARCH_INTERNAL $(INCDIRS)
%.o: %.S
$(CC_AS) -c -o $@ $< $(CFLAGS) $(INCDIRS)
ifeq ($(platform), theos_ios)
COMMON_FLAGS := -DIOS $(COMMON_DEFINES) $(INCFLAGS) -I$(THEOS_INCLUDE_PATH) -Wno-error
$(LIBRARY_NAME)_CFLAGS += $(CFLAGS) $(COMMON_FLAGS)
$(LIBRARY_NAME)_CXXFLAGS += $(CXXFLAGS) $(COMMON_FLAGS)
${LIBRARY_NAME}_FILES = $(SOURCES_CXX) $(SOURCES_C)
${LIBRARY_NAME}_LIBRARIES = z
include $(THEOS_MAKE_PATH)/library.mk
else
all: $(TARGET)
# Every object depends on the generated config headers: this build has no
# header dependency tracking, so a template change must rebuild the world,
# and under -j the copy rules must run before any compile rather than
# racing them as fellow prerequisites of $(TARGET).
$(OBJS): $(CORE_DIR)/fuse/config.h $(CORE_DIR)/libspectrum/config.h
$(TARGET): $(HEADERS) $(OBJS)
ifeq ($(STATIC_LINKING), 1)
$(AR) rcs $@ $(OBJS)
else
$(CC) -o $@ $(SHARED) $(OBJS) $(LDFLAGS) $(LIBS)
endif
$(CORE_DIR)/fuse/config.h: $(CORE_DIR)/src/config_fuse.h
cp $(CORE_DIR)/src/config_fuse.h $(CORE_DIR)/fuse/config.h
$(CORE_DIR)/libspectrum/config.h: $(CORE_DIR)/src/config_libspectrum.h
cp $(CORE_DIR)/src/config_libspectrum.h $(CORE_DIR)/libspectrum/config.h
$(CORE_DIR)/src/version.c: FORCE
cat $(CORE_DIR)/etc/version.c.templ | sed s/HASH/`git rev-parse HEAD | tr -d "\n"`/g > $@
clean-objs:
rm -f $(OBJS)
clean:
rm -f $(OBJS)
rm -f $(TARGET)
.PHONY: clean clean-objs FORCE
# Remove all built-in implicit rules
.SUFFIXES:
endif
endif