mirror of
https://github.com/libretro/parallel-gx1.git
synced 2026-11-07 04:26:01 -10:00
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.
346 lines
10 KiB
Makefile
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
|