Files
parallel-gx1/Makefile
T
LibretroAdmin a390228b51 GL: no contexts of the core's own, the frontend's libretro GL context alone
The OpenGL renderer draws on the context the frontend hands over
through libretro GL, and the core makes no context of its own: the
platform context code goes, EGL, EGLX11, EGL for Android, WGL, AGL,
BGL and the GLX window, with the shared contexts made for the shader
compiler's threads, and GLContext::Create makes the libretro context
alone. Programs are compiled on the frontend's context, so the OpenGL
backend reports no background compiling and its shader compiler runs
no threads; the shared-context compiler, its glFinish and VAO rebinds
and the driver bug that switched it off go with it. Android no longer
links libEGL.
2026-11-07 01:36:34 +01:00

346 lines
10 KiB
Makefile

DEBUG = 0
HAVE_VULKAN = 1
LINK_STATIC_LIBCPLUSPLUS = 1
LTO ?=
CORE_DIR := .
TARGET_NAME := parallel_gx1
ifeq ($(ECHO),1)
E := 1
endif
# Windows is recognised from the environment every Windows shell sets (all
# MSYS2 environments included, whatever uname -s reports there) or from a
# MinGW-w64 compiler, so a cross build needs only CC/CXX.
ifeq ($(platform),)
platform = unix
UNAME_S := $(shell uname -s 2>/dev/null)
ifeq ($(OS),Windows_NT)
platform = win
else ifeq ($(UNAME_S),)
platform = win
else ifneq ($(findstring Darwin,$(UNAME_S)),)
platform = osx
else ifneq (,$(findstring mingw,$(shell $(CC) -dumpmachine 2>/dev/null)))
platform = win
endif
endif
# make's built-in default compiler is cc, which MinGW-w64 does not ship.
ifneq (,$(filter win win64,$(platform)))
ifeq ($(origin CC),default)
CC := gcc
endif
ifeq ($(origin CXX),default)
CXX := g++
endif
endif
# webOS SDK toolchains are plain Linux cross compilers; their name is what
# tells them apart.
ifneq (,$(findstring webos,$(CC)))
ifneq (,$(findstring unix,$(platform)))
override platform := webos
endif
endif
# ----------------------------------------------------------------------------
# Target architecture: taken from the compiler (or the Apple -arch/-target
# selection), not the host, so cross builds pick the right JIT and SIMD code.
# ----------------------------------------------------------------------------
ifeq ($(platform), osx)
ifeq ($(CROSS_COMPILE),1)
arch := $(firstword $(subst -, ,$(LIBRETRO_APPLE_PLATFORM)))
endif
ifeq ($(arch),)
arch := $(shell uname -m)
endif
else ifneq (,$(filter ios-arm64 tvos-arm64 android-arm64,$(platform)))
arch := arm64
else ifeq ($(platform), android-x86_64)
arch := x86_64
else ifeq ($(arch),)
arch := $(firstword $(subst -, ,$(shell $(CC) -dumpmachine 2>/dev/null)))
ifeq ($(arch),)
arch := $(shell uname -m)
endif
endif
ifneq (,$(filter x86_64 amd64 x64,$(arch)))
ARCH_X86_64 := 1
arch := x86_64
else ifneq (,$(filter aarch64 arm64 arm,$(arch)))
ARCH_ARM64 := 1
arch := arm64
else
$(error Unsupported target architecture '$(arch)': the core builds for x86_64 and arm64)
endif
HAVE_LIBUSB := 0
HAVE_HIDAPI := 0
HAVE_CPPIPC := 0
HAVE_D3D := 0
HAVE_BUNDLED_ICONV := 0
FLAGS :=
CFLAGS :=
CXXFLAGS :=
LDFLAGS :=
LIBS :=
# Unix (Linux) and webOS
ifneq (,$(filter unix webos,$(platform)))
OS_UNIX := 1
TARGET := $(TARGET_NAME)_libretro.so
fpic := -fPIC
SHARED := -shared -Wl,--no-undefined -Wl,--version-script=link.T
ifeq ($(platform), webos)
FLAGS += -D__WEBOS__ -DSKIP_WIMOTESCANNER_THREAD -DSKIP_GCMEMCARD_THREAD \
-DSKIP_SAVESTATE_THREAD -DSKIP_NETWORK_WORKER_THREAD -DSKIP_ASSETLOADER_THREAD \
-DSKIP_WICONNECT24_WORKER_THREAD -DSKIP_RESOURCE_WORKER_THREAD \
-DSKIP_KDSCHEDULER_TIMER_THREAD
HAVE_VULKAN := 0
else
HAVE_LIBUSB := 1
HAVE_HIDAPI := 1
endif
HAVE_CPPIPC := 1
ifeq ($(LINK_STATIC_LIBCPLUSPLUS),1)
LDFLAGS += -static-libgcc -static-libstdc++
endif
LIBS += -lpthread -ldl -lrt
# macOS
else ifeq ($(platform), osx)
OS_APPLE := 1
OS_MACOS := 1
TARGET := $(TARGET_NAME)_libretro.dylib
fpic := -fPIC
SHARED := -dynamiclib
MACOS_MINVER ?= 11.0
ifeq ($(CROSS_COMPILE),1)
TARGET_RULE := -target $(arch)-apple-macos$(MACOS_MINVER) -isysroot $(LIBRETRO_APPLE_ISYSROOT)
else
TARGET_RULE := -arch $(arch) -mmacosx-version-min=$(MACOS_MINVER)
endif
FLAGS += $(TARGET_RULE)
LDFLAGS += $(TARGET_RULE) -Wl,-dead_strip
HAVE_LIBUSB := 1
HAVE_HIDAPI := 1
HAVE_BUNDLED_ICONV := 1
LIBS += -framework AppKit -framework CoreFoundation -framework Foundation \
-framework IOKit -framework CoreServices -framework IOBluetooth \
-framework Security -lobjc -lresolv
# iOS / tvOS
else ifneq (,$(filter ios-arm64 tvos-arm64,$(platform)))
OS_APPLE := 1
OS_IOS := 1
fpic := -fPIC
SHARED := -dynamiclib
ifeq ($(platform), tvos-arm64)
TARGET := $(TARGET_NAME)_libretro_tvos.dylib
MINVER ?= 14.0
ifeq ($(IOSSDK),)
IOSSDK := $(shell xcrun -sdk appletvos -show-sdk-path)
endif
MINVER_FLAG := -mappletvos-version-min=$(MINVER)
else
TARGET := $(TARGET_NAME)_libretro_ios.dylib
IOS_MINVER ?= 14.0
ifeq ($(IOSSDK),)
IOSSDK := $(shell xcrun -sdk iphoneos -show-sdk-path)
endif
MINVER_FLAG := -miphoneos-version-min=$(IOS_MINVER)
endif
CC = cc -arch arm64 -isysroot $(IOSSDK)
CXX = c++ -arch arm64 -isysroot $(IOSSDK)
FLAGS += $(MINVER_FLAG) -DIPHONEOS
LDFLAGS += $(MINVER_FLAG)
HAVE_BUNDLED_ICONV := 1
LIBS += -framework CoreFoundation -framework Foundation -framework IOKit -lobjc -lresolv
# Android (NDK clang)
else ifneq (,$(filter android-arm64 android-x86_64,$(platform)))
OS_ANDROID := 1
TARGET := $(TARGET_NAME)_libretro_android.so
fpic := -fPIC
SHARED := -shared -Wl,--no-undefined -Wl,--version-script=link.T
ifeq ($(platform), android-arm64)
ANDROID_API ?= 21
ANDROID_TRIPLE := aarch64-linux-android$(ANDROID_API)
else
ANDROID_API ?= 24
ANDROID_TRIPLE := x86_64-linux-android$(ANDROID_API)
endif
NDK_ROOT ?= $(ANDROID_NDK_ROOT)
ANDROID_NDK_LLVM ?= $(NDK_ROOT)/toolchains/llvm/prebuilt/linux-x86_64
CC = $(ANDROID_NDK_LLVM)/bin/clang --target=$(ANDROID_TRIPLE)
CXX = $(ANDROID_NDK_LLVM)/bin/clang++ --target=$(ANDROID_TRIPLE)
AR = $(ANDROID_NDK_LLVM)/bin/llvm-ar
FLAGS += -DANDROID -I$(CORE_DIR)/Source/Android -funwind-tables
LDFLAGS += -static-libstdc++
HAVE_BUNDLED_ICONV := 1
LIBS += -landroid -llog -latomic -lm -ldl
# Windows (MinGW-w64, native MSYS2 or cross)
else
OS_WIN := 1
TARGET := $(TARGET_NAME)_libretro.dll
SHARED := -shared -Wl,--no-undefined -Wl,--version-script=link.T
FLAGS += -D_WIN32_WINNT=0x0A00 -DWINVER=0x0A00 \
-DWINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION=0x50000
HAVE_LIBUSB := 1
HAVE_HIDAPI := 1
HAVE_CPPIPC := 1
HAVE_D3D := 1
LDFLAGS += -static-libgcc -static-libstdc++ -static
LIBS += -lsetupapi -lcfgmgr32 -lshlwapi -liphlpapi -lwinmm -lws2_32 -lbcrypt \
-ladvapi32 -lcrypt32 -lsecur32 -lole32 -loleaut32 -luuid -lshell32 \
-luser32 -lgdi32 -lkernel32 -lwinpthread
endif
GEN_DIR := $(CORE_DIR)/obj/gen
OBJ_DIR := $(CORE_DIR)/obj/$(platform)-$(arch)
include Makefile.common
# ----------------------------------------------------------------------------
# Compiler flags
# ----------------------------------------------------------------------------
FLAGS += -D__LIBRETRO__ -D_ARCH_64=1 -D_DEFAULT_SOURCE -DHAS_OPENGL \
-DDATA_DIR=\"/usr/local/share/dolphin-emu/\" -I$(SRC_DIR)
ifeq ($(ARCH_X86_64),1)
FLAGS += -D_M_X86_64=1 -msse2
ifeq ($(OS_MACOS),1)
FLAGS += -mssse3 -march=core2
endif
else
FLAGS += -D_M_ARM_64=1 -march=armv8-a+crc
endif
ifneq (,$(filter 1,$(OS_UNIX) $(OS_APPLE)))
FLAGS += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
endif
ifeq ($(OS_APPLE),1)
FLAGS += -DFMT_EXCEPTIONS=0
endif
ifeq ($(HAVE_VULKAN),1)
FLAGS += -DHAS_VULKAN
endif
ifeq ($(HAVE_LIBUSB),1)
FLAGS += -D__LIBUSB__
endif
FLAGS += -fno-strict-aliasing -fno-exceptions -fomit-frame-pointer
# Everything the core does not export stays hidden; the libretro entry points
# carry visibility("default") through RETRO_API.
ifneq (,$(fpic))
FLAGS += $(fpic) -fno-semantic-interposition
endif
FLAGS += -fvisibility=hidden
CXXFLAGS += -fvisibility-inlines-hidden
ifeq ($(DEBUG), 1)
FLAGS += -O0 -g -D_DEBUG
else
FLAGS += -O3 -DNDEBUG
endif
ifneq ($(LTO),)
FLAGS += $(LTO)
LDFLAGS += $(LTO)
endif
ifneq ($(SANITIZER),)
FLAGS += -fsanitize=$(SANITIZER)
LDFLAGS += -fsanitize=$(SANITIZER)
endif
CFLAGS := $(FLAGS) $(CFLAGS)
CXXFLAGS := $(FLAGS) $(CXXFLAGS)
LDFLAGS += $(fpic) $(SHARED)
# ----------------------------------------------------------------------------
# Objects
# ----------------------------------------------------------------------------
# Objects live under obj/<platform>-<arch>, one tree per target, so the
# submodules stay clean and a second architecture never links the first
# one's objects.
obj_of = $(patsubst %,$(OBJ_DIR)/%.o,$(1))
define LIB_template
$(1)_OBJECTS := $$(call obj_of,$$($(1)_SOURCES_C) $$($(1)_SOURCES_CXX) $$($(1)_SOURCES_ASM) $$($(1)_SOURCES_OBJCXX))
$$($(1)_OBJECTS): GROUP := $(1)
OBJECTS += $$($(1)_OBJECTS)
endef
OBJECTS :=
$(foreach g,$(LIB_GROUPS),$(eval $(call LIB_template,$(g))))
DEPS := $(OBJECTS:.o=.d)
# The toolchain and configuration a tree was built with; a change wipes it,
# since nothing in an object's name says which compiler produced it.
BUILD_TAG := $(CC)|$(CXX)|$(platform)|$(arch)|$(DEBUG)|$(LTO)|$(SANITIZER)|$(HAVE_VULKAN)
BUILD_TAG_STATUS := $(shell \
if [ "`cat $(OBJ_DIR)/.build-tag 2>/dev/null`" != "$(BUILD_TAG)" ]; then \
rm -rf $(OBJ_DIR); mkdir -p $(OBJ_DIR); \
echo "$(BUILD_TAG)" > $(OBJ_DIR)/.build-tag; \
fi)
.DEFAULT_GOAL := all
all: $(TARGET)
-include $(DEPS)
$(OBJECTS): | $(GEN_HEADERS)
# The object list outgrows the 32 KiB Windows command line, so there the
# linker reads it from a response file ($(file) needs GNU make 4.0, which
# MSYS2 and the cross toolchains have; the Xcode make is 3.81).
ifeq ($(OS_WIN),1)
LINK_OBJECTS = @$(OBJ_DIR)/link-objects.rsp
else
LINK_OBJECTS = $(OBJECTS)
endif
$(TARGET): $(OBJECTS)
@$(if $(E),echo LD $@,)
ifeq ($(OS_WIN),1)
$(file >$(OBJ_DIR)/link-objects.rsp,$(OBJECTS))
endif
$(CXX) -o $@ $(LINK_OBJECTS) $(LDFLAGS) $(LIBS)
$(OBJ_DIR)/%.c.o: %.c
@mkdir -p $(@D)
@$(if $(E),echo CC $<,)
$(CC) $(CFLAGS) $($(GROUP)_FLAGS) $($(GROUP)_CFLAGS) $(FILE_FLAGS_$(abspath $<)) -MMD -MP -c $< -o $@
$(OBJ_DIR)/%.cpp.o: %.cpp
@mkdir -p $(@D)
@$(if $(E),echo CXX $<,)
$(CXX) $(CXXFLAGS) $($(GROUP)_FLAGS) $($(GROUP)_CXXFLAGS) $(FILE_FLAGS_$(abspath $<)) -MMD -MP -c $< -o $@
$(OBJ_DIR)/%.cc.o: %.cc
@mkdir -p $(@D)
@$(if $(E),echo CXX $<,)
$(CXX) $(CXXFLAGS) $($(GROUP)_FLAGS) $($(GROUP)_CXXFLAGS) $(FILE_FLAGS_$(abspath $<)) -MMD -MP -c $< -o $@
$(OBJ_DIR)/%.mm.o: %.mm
@mkdir -p $(@D)
@$(if $(E),echo OBJCXX $<,)
$(CXX) -x objective-c++ $(CXXFLAGS) $($(GROUP)_FLAGS) $($(GROUP)_CXXFLAGS) $(FILE_FLAGS_$(abspath $<)) -MMD -MP -c $< -o $@
$(OBJ_DIR)/%.S.o: %.S
@mkdir -p $(@D)
@$(if $(E),echo AS $<,)
$(CC) $(CFLAGS) $($(GROUP)_FLAGS) $(FILE_FLAGS_$(abspath $<)) -MMD -MP -c $< -o $@
clean:
rm -rf $(CORE_DIR)/obj
rm -f $(TARGET)
.PHONY: all clean