Files
RetroArch/Makefile.webos
T
Codex 7a3bcbdc28 media: route image and movie activation to the internal viewer
Open supported external media in the fullscreen menu viewer and keep image confirmation there across all four menu drivers. Disable the legacy imageviewer core in normal build configurations while preserving its sources and Griffin guard.
2026-10-24 01:00:53 +02:00

482 lines
13 KiB
Makefile

include version.all
ifneq ($(filter $(CROSS_COMPILE),arm-webos-linux-gnueabi- aarch64-webos-linux-gnu-),$(CROSS_COMPILE))
$(error You need webOS toolchain to build this. See https://github.com/webosbrew/native-toolchain)
endif
ifdef SDKTARGETSYSROOT
$(warning "OE-based toolchain isn't supported anymore. Please use https://github.com/webosbrew/native-toolchain")
STAGING_DIR = $(SDKTARGETSYSROOT)
else ifndef STAGING_DIR
$(error "Can't find buildroot based toolchain. Please use https://github.com/webosbrew/native-toolchain")
endif
WEBOS_FREETYPE_CONFIG ?= $(STAGING_DIR)/usr/bin/freetype-config
WEBOS_INC_DIR ?= $(STAGING_DIR)/usr/include
WEBOS_USR_LIB_DIR ?= $(STAGING_DIR)/usr/lib
WEBOS_LIB_DIR ?= $(STAGING_DIR)/lib
ADD_SDL2_LIB ?= 0
ADD_SDL3_LIB ?= 0
SDL2_PREBUILT_ARCHIVE ?= https://github.com/webosbrew/SDL-webOS/releases/download/release-2.30.12-webos.5/SDL2-2.30.12-webos-abi.tar.gz
SDL3_PREBUILT_ARCHIVE ?= https://github.com/webosbrew/SDL-webOS/releases/download/release-3.4.16-webos.5/SDL3-3.4.16-webos.5.tar.gz
64TO32_BRIDGE_DIR ?= /media/developer/apps/usr/palm/applications/org.webosbrew.bridge-64to32
ELF_INTERPRETER_BIN ?= /lib/ld-linux-aarch64.so.1
SET_ELF_INTERPRETER ?= 0
REPACK_64_IPK_FOR_MENU ?= 0
SET_BUILD_ID ?= 0
#########################
#########################
APP_PACKAGE_NAME ?= com.retroarch.webos
ARES_PACKAGE_ARGS ?=
IPK_VERSION := $(shell grep '\#define PACKAGE_VERSION' version.all | sed -E 's/.*"([0-9]+\.[0-9]+\.[0-9]+)".*/\1/')
WEBOS = 1
DEBUG ?= 0
HAVE_CLOUDSYNC = 1
HAVE_SCREENSHOTS = 1
HAVE_REWIND = 1
HAVE_7ZIP = 1
HAVE_ACCESSIBILITY = 1
HAVE_AL = 0
HAVE_ALSA ?= 1
HAVE_ANGLE = 0
HAVE_AUDIOIO = 0
HAVE_AUDIOMIXER = 1
HAVE_BLISSBOX = 0
HAVE_BSV_MOVIE = 1
HAVE_RFLAC = 1
HAVE_DSP_FILTER = 1
HAVE_VIDEO_FILTER = 1
HAVE_STATIC_VIDEO_FILTERS = 1
HAVE_STATIC_AUDIO_FILTERS = 1
HAVE_FILTERS_BUILTIN = 1
# The cleanroom network stack, as on the desktop builds: the crypto,
# the encrypted keychain, the TLS 1.2/1.3 client and the SMB2/3 client
# with Kerberos; plus the NFSv3/v4 client. Needs nothing but sockets.
HAVE_CRYPTO = 1
HAVE_KEYCHAIN = 1
HAVE_RETROSSL = 1
HAVE_RETROSMB = 1
HAVE_RETRONFS = 1
HAVE_C99 = 1
HAVE_CC = 1
HAVE_CC_RESAMPLER = 1
HAVE_NEAREST_RESAMPLER = 1
HAVE_CHD = 1
# Read CHD images with the built-in reader rather than libchdr. Keep
# this on its own line: make keeps the whitespace before a trailing
# comment, and Makefile.common tests this with ifeq, which compares the
# string -- "1 " is not "1" and the flag silently does nothing.
HAVE_RCHD = 1
HAVE_COMMAND = 1
HAVE_CXX = 1
HAVE_RMP3 = 1
HAVE_DYNAMIC = 1
HAVE_DYLIB = 1
HAVE_EGL ?= 0
HAVE_FREETYPE ?= 1
HAVE_GDI = 0
HAVE_GETADDRINFO = 1
HAVE_GETOPT_LONG = 1
HAVE_GLSL ?= 1
HAVE_GLSLANG = 0
HAVE_GLSLANG_HLSL = 0
HAVE_GLSLANG_OGLCOMPILER = 0
HAVE_GLSLANG_OSDEPENDENT = 0
HAVE_GLSLANG_SPIRV = 0
HAVE_GLSLANG_SPIRV_TOOLS = 0
HAVE_GLSLANG_SPIRV_TOOLS_OPT = 0
HAVE_HID = 1
HAVE_RMODTRACKER = 1
HAVE_IMAGEVIEWER = 0
HAVE_XKBCOMMON ?= 0
HAVE_LANGEXTRA = 1
HAVE_LIBRETRODB = 1
HAVE_MENU = 1
HAVE_MENU_COMMON = 1
HAVE_NEON = 0
HAVE_NETWORKING = 1
HAVE_IFINFO = 1
HAVE_NETWORK_CMD = 1
HAVE_NETPLAYDISCOVERY = 1
HAVE_NETWORKGAMEPAD = 1
HAVE_GFX_WIDGETS = 1
HAVE_MMAP = 1
HAVE_ONLINE_UPDATER = 1
HAVE_OPENDINGUX_FBDEV = 0
HAVE_OPENGL = 0
HAVE_OPENGL1 = 0
HAVE_OPENGL_CORE = 0
HAVE_OPENGLES ?= 1
HAVE_OPENGLES3 ?= 0
HAVE_OPENGLES3_1 ?= 0
HAVE_OPENGLES3_2 ?= 0
HAVE_OPENSSL = 0
HAVE_OVERLAY = 1
HAVE_PULSE ?= 1
HAVE_RBMP = 1
HAVE_RJPEG = 1
HAVE_RPILED = 0
HAVE_RPNG = 1
HAVE_RWEBP = 1
HAVE_RDDS = 1
HAVE_RUNAHEAD = 1
HAVE_SDL = 0
HAVE_SDL2 ?= 1
HAVE_SDL3 ?= 0
HAVE_SHADERPIPELINE = 1
HAVE_STB_IMAGE = 1
HAVE_RVORBIS = 1
HAVE_STDIN_CMD = 1
HAVE_THREADS = 1
HAVE_TINYALSA ?= 0
ifeq ($(findstring arm64,$(ARCH)),arm64)
HAVE_UDEV ?= 1
else
# udev is only supported on webOS 4 and above
HAVE_UDEV ?= 0
endif
HAVE_RGUI = 1
HAVE_MATERIALUI = 0
HAVE_XMB = 1
HAVE_OZONE = 1
HAVE_RZSTD = 1
HAVE_CONFIGFILE = 1
HAVE_PATCH = 1
HAVE_CHEATS = 1
HAVE_CHEEVOS = 1
HAVE_LIBSHAKE = 1
HAVE_UPDATE_ASSETS = 1
HAVE_UPDATE_CORES = 1
HAVE_UPDATE_CORE_INFO = 1
HAVE_USERLAND ?= 0
HAVE_WEBOS_EXTRA_PROTOS ?= 0
HAVE_CORE_INFO_CACHE = 1
HAVE_WAYLAND ?= 0
HAVE_WAYLAND_BACKPORT ?= 1
HAVE_64TO32BIT_BRIDGE ?= 0
OS = Linux
TARGET = retroarch
OBJ :=
LINK := $(CC)
DEF_FLAGS += -ffunction-sections -fdata-sections
DEF_FLAGS += -I. -Ideps -DWEBOS=1 -MMD
DEF_FLAGS += -Wall -Wno-unused-variable
LIBS := -ldl -lrt -pthread
ifeq ($(findstring arm64,$(ARCH)),arm64)
ARCHFLAGS := -mcpu=cortex-a53
IPK_ARCH := aarch64
else
ARCHFLAGS := -mcpu=cortex-a9 -mtune=cortex-a53 -mfloat-abi=softfp
HAVE_NEON = 1
IPK_ARCH := arm
endif
CFLAGS := $(ARCHFLAGS)
CFLAGS += -DWEBOS_APP_ID=\"$(APP_PACKAGE_NAME)\"
CXXFLAGS := $(ARCHFLAGS) -fno-exceptions -fno-rtti -std=c++11 -D__STDC_CONSTANT_MACROS
ASFLAGS := $(ARCHFLAGS)
LDFLAGS := -Wl,-rpath=\$$ORIGIN/lib,--gc-sections
ifeq ($(SET_BUILD_ID),1)
LDFLAGS += -Wl,--build-id=sha1
endif
ifeq ($(HAVE_64TO32BIT_BRIDGE),1)
LDFLAGS += -Wl,-rpath=$(64TO32_BRIDGE_DIR)/lib
endif
INCLUDE_DIRS = -I$(WEBOS_INC_DIR)
LIBRARY_DIRS = -L$(WEBOS_USR_LIB_DIR)
DEFINES := -DRARCH_INTERNAL -D_FILE_OFFSET_BITS=64 -UHAVE_STATIC_DUMMY
DEFINES += -DHAVE_C99=1 -DHAVE_CXX=1 -D_GNU_SOURCE
DEFINES += -DHAVE_GETOPT_LONG=1 -DHAVE_DYNAMIC=1
DEFINES += -DHAVE_FILTERS_BUILTIN
DEFINES += -DHAVE_NETWORKING -DHAVE_IFINFO -DHAVE_ONLINE_UPDATER -DHAVE_UPDATE_ASSETS -DHAVE_UPDATE_CORES
DEFINES += -DHAVE_NETWORKGAMEPAD
ifeq ($(HAVE_FREETYPE),1)
DEFINES += -DHAVE_FREETYPE
endif
DEFINES += -DHAVE_UPDATE_CORE_INFO
EGL_LIBS = -lEGL
OPENGLES_LIBS = -lGLESv2
XKBCOMMON_LIBS = -lxkbcommon
WAYLAND_PROTO_SCRIPT := ./gfx/common/wayland/generate_wayland_protos.sh
ifeq ($(HAVE_XKBCOMMON), 1)
DEFINES += -DHAVE_XKBCOMMON=1
endif
ifneq (,$(filter 1,$(HAVE_OPENGLES3) $(HAVE_OPENGLES3_1) $(HAVE_OPENGLES3_2)))
DEFINES += -DHAVE_OPENGLES3
endif
ifeq ($(HAVE_OPENGLES3_1),1)
DEFINES += -DHAVE_OPENGLES3_1
endif
ifeq ($(HAVE_OPENGLES3_2),1)
DEFINES += -DHAVE_OPENGLES3_2
endif
ifeq ($(HAVE_WAYLAND),1)
DEFINES += -DHAVE_WAYLAND=1
WAYLAND_LIBS += -lwayland-client -lwayland-cursor
ifeq ($(HAVE_EGL),1)
WAYLAND_LIBS += -lwayland-egl
endif
endif
ifeq ($(HAVE_WEBOS_EXTRA_PROTOS),1)
DEFINES += -DHAVE_WEBOS_EXTRA_PROTOS=1
endif
ifeq ($(HAVE_USERLAND),1)
DEFINES += -DHAVE_USERLAND
WAYLAND_LIBS += -lhelpers
endif
ifeq ($(HAVE_UDEV),1)
UDEV_LIBS = -ludev
UDEV_CFLAGS = -DHAVE_UDEV
endif
ifeq ($(HAVE_ALSA),1)
DEFINES += -DHAVE_ALSA
LIBS += -lasound
ifeq ($(HAVE_TINYALSA),1)
DEFINES += -DHAVE_TINYALSA
endif
endif
ifeq ($(HAVE_PULSE),1)
DEFINES += -DHAVE_PULSE
endif
ifeq ($(HAVE_SDL2),1)
DEFINES += -DHAVE_SDL2
endif
ifeq ($(HAVE_SDL3),1)
DEFINES += -DHAVE_SDL3
endif
ifeq ($(SET_ELF_INTERPRETER), 1)
ELF_INTERPRETER ?= $(64TO32_BRIDGE_DIR)$(ELF_INTERPRETER_BIN)
endif
PKG_CONFIG=pkg-config
SDL2_CFLAGS := $(shell $(PKG_CONFIG) --cflags sdl2)
SDL2_LIBS := $(shell $(PKG_CONFIG) --libs sdl2)
PULSE_LIBS = $(shell $(PKG_CONFIG) --libs libpulse)
FREETYPE_CFLAGS := $(shell $(PKG_CONFIG) --cflags freetype2)
FREETYPE_LIBS := $(shell $(PKG_CONFIG) --libs freetype2)
FONTCONFIG_CFLAGS := $(shell $(PKG_CONFIG) --cflags fontconfig)
FONTCONFIG_LIBS := $(shell $(PKG_CONFIG) --libs fontconfig)
MMAP_LIBS = -lc
ifeq ($(HAVE_NEON),1)
NEON_CFLAGS += -mfpu=neon
NEON_ASFLAGS += -mfpu=neon
endif
NETWORKING_LIBS = -lc
OBJDIR_BASE := obj-unix
ifeq ($(DEBUG), 1)
OBJDIR := $(OBJDIR_BASE)/debug
DEF_FLAGS += -O0 -g -DDEBUG -D_DEBUG
else
OBJDIR := $(OBJDIR_BASE)/release
DEF_FLAGS += -O2 -DNDEBUG
endif
include Makefile.common
# Only version_git.c reads the commit hash: on every other command
# line it would make a new commit miss ccache's direct mode.
ifneq ($(GIT_VERSION),)
DEFINES := $(filter-out -DGIT_VERSION=%,$(DEFINES))
$(OBJDIR)/version_git.o: DEFINES += -DGIT_VERSION=$(GIT_VERSION)
endif
DEF_FLAGS += $(INCLUDE_DIRS)
LDFLAGS += $(CFLAGS) $(CXXFLAGS) $(DEF_FLAGS)
CFLAGS += $(DEF_FLAGS)
CXXFLAGS += $(DEF_FLAGS)
HEADERS = $(wildcard */*/*.h) $(wildcard */*.h) $(wildcard *.h)
ifneq ($(V),1)
Q := @
endif
RARCH_OBJ := $(addprefix $(OBJDIR)/,$(OBJ))
ifeq ($(findstring arm64,$(ARCH)),arm64)
IPK_TITLE := RetroArch (64-bit)
else
IPK_TITLE := RetroArch
endif
define APPINFO
{
"id": "$(APP_PACKAGE_NAME)",
"version": "$(IPK_VERSION)",
"vendor": "webosbrew.org",
"title": "$(IPK_TITLE)",
"icon": "icon160.png",
"main": "retroarch",
"iconColor": "#333333",
"type": "native",
"appDescription": "Emulation frontend",
"cloudgame_active": true,
"useAllMouseButtons": true,
"useAllKeyboardKeys": true
}
endef
export APPINFO
all: $(TARGET) ipk
define INFO
ASFLAGS: $(ASFLAGS)
CC: $(CC)
CFLAGS: $(CFLAGS)
CPPFLAGS: $(CPPFLAGS)
CXX: $(CXX)
CXXFLAGS: $(CXXFLAGS)
DEFINES: $(DEFINES)
LDFLAGS: $(LDFLAGS)
LIBRARY_DIRS: $(LIBRARY_DIRS)
LIBS: $(LIBS)
LINK: $(LINK)
OBJCFLAGS: $(OBJCFLAGS)
RARCH_OBJ: $(RARCH_OBJ)
endef
export INFO
info:
ifneq ($(V),1)
@echo "$$INFO"
endif
-include $(RARCH_OBJ:.o=.d)
SYMBOL_MAP := -Wl,-Map=output.map
prebuild:
ifeq ($(HAVE_WAYLAND),1)
@echo "Generating Wayland protocols..."
@$(SHELL) $(WAYLAND_PROTO_SCRIPT)
endif
$(TARGET): $(RARCH_OBJ)
@$(if $(Q), $(shell echo echo LD $@),)
$(Q)$(LINK) -o $@ $(RARCH_OBJ) $(LIBS) $(LDFLAGS) $(LIBRARY_DIRS)
$(OBJDIR)/%.o: %.c
@mkdir -p $(dir $@)
@$(if $(Q), $(shell echo echo CC $<),)
$(Q)$(CC) $(CPPFLAGS) $(CFLAGS) $(DEFINES) -c -o $@ $<
$(OBJDIR)/%.o: %.cpp
@mkdir -p $(dir $@)
@$(if $(Q), $(shell echo echo CXX $<),)
$(Q)$(CXX) $(CPPFLAGS) $(CXXFLAGS) $(DEFINES) -MMD -c -o $@ $<
$(OBJDIR)/%.o: %.m
@mkdir -p $(dir $@)
@$(if $(Q), $(shell echo echo OBJC $<),)
$(Q)$(CXX) $(OBJCFLAGS) $(DEFINES) -MMD -c -o $@ $<
$(OBJDIR)/%.o: %.S $(HEADERS)
@mkdir -p $(dir $@)
@$(if $(Q), $(shell echo echo AS $<),)
$(Q)$(CC) $(CFLAGS) $(ASFLAGS) $(DEFINES) -c -o $@ $<
clean:
@$(if $(Q), echo $@,)
$(Q)rm -rf $(OBJDIR_BASE)
$(Q)rm -f $(TARGET)
$(Q)rm -f *.d
$(Q)rm -rf SDL
$(Q)rm -rf SDL.tmp
$(Q)rm -f SDL2-prebuilt.tar.gz.tmp
$(Q)rm -rf SDL3
$(Q)rm -rf SDL3.tmp
$(Q)rm -f SDL3-prebuilt.tar.gz.tmp
$(Q)rm -rf webos/*.ipk
$(Q)rm -rf webos/dist
sdl2: $(TARGET)
ifeq ($(ADD_SDL2_LIB), 1)
@if [ ! -f SDL/lib/libSDL2-2.0.so.0 ]; then \
echo "Downloading SDL2 prebuilt"; \
rm -rf SDL.tmp SDL2-prebuilt.tar.gz.tmp; \
mkdir -p SDL.tmp; \
curl -fsSL --retry 5 --retry-all-errors --retry-delay 5 --connect-timeout 30 \
-o SDL2-prebuilt.tar.gz.tmp $(SDL2_PREBUILT_ARCHIVE) \
|| { echo "error: SDL2 prebuilt download failed: $(SDL2_PREBUILT_ARCHIVE)"; \
rm -rf SDL.tmp SDL2-prebuilt.tar.gz.tmp; exit 1; }; \
tar -C SDL.tmp -zxf SDL2-prebuilt.tar.gz.tmp \
|| { echo "error: SDL2 prebuilt archive is corrupt or truncated"; \
rm -rf SDL.tmp SDL2-prebuilt.tar.gz.tmp; exit 1; }; \
rm -f SDL2-prebuilt.tar.gz.tmp; \
mv SDL.tmp SDL; \
else \
echo "SDL2 prebuilt already exists, skipping download"; \
fi
endif
sdl3: $(TARGET)
ifeq ($(ADD_SDL3_LIB), 1)
@if [ ! -f SDL3/lib/libSDL3.so.0 ]; then \
echo "Downloading SDL3 prebuilt"; \
rm -rf SDL3.tmp SDL3-prebuilt.tar.gz.tmp; \
mkdir -p SDL3.tmp; \
curl -fsSL --retry 5 --retry-all-errors --retry-delay 5 --connect-timeout 30 \
-o SDL3-prebuilt.tar.gz.tmp $(SDL3_PREBUILT_ARCHIVE) \
|| { echo "error: SDL3 prebuilt download failed: $(SDL3_PREBUILT_ARCHIVE)"; \
rm -rf SDL3.tmp SDL3-prebuilt.tar.gz.tmp; exit 1; }; \
tar -C SDL3.tmp -zxf SDL3-prebuilt.tar.gz.tmp \
|| { echo "error: SDL3 prebuilt archive is corrupt or truncated"; \
rm -rf SDL3.tmp SDL3-prebuilt.tar.gz.tmp; exit 1; }; \
rm -f SDL3-prebuilt.tar.gz.tmp; \
mv SDL3.tmp SDL3; \
else \
echo "SDL3 prebuilt already exists, skipping download"; \
fi
endif
ipk: prebuild $(TARGET) sdl2 sdl3
rm -rf webos/dist
mkdir -p webos/dist/lib
ifeq ($(SET_ELF_INTERPRETER), 1)
patchelf --set-interpreter $(ELF_INTERPRETER) $(TARGET)
endif
echo "$$APPINFO" > webos/dist/appinfo.json
# BSD cp (macOS) has no -t; put the destination last.
cp -vf $(TARGET) webos/icon160.png webos/dist/
cp -vf $(WEBOS_USR_LIB_DIR)/libstdc++.so.6 webos/dist/lib/
ifeq ($(HAVE_XKBCOMMON), 1)
cp -vf $(WEBOS_USR_LIB_DIR)/libxkbcommon.so.0 webos/dist/lib/
endif
cp -vf $(WEBOS_LIB_DIR)/libatomic.so.1 webos/dist/lib/
ifeq ($(ADD_SDL2_LIB), 1)
cp -vf SDL/lib/libSDL2-2.0.so.0 webos/dist/lib/
endif
ifeq ($(ADD_SDL3_LIB), 1)
cp -vf SDL3/lib/libSDL3.so.0 webos/dist/lib/
endif
ifneq ($(DEBUG), 1)
$(STRIP) webos/dist/$(TARGET)
endif
cd webos && ares-package dist $(ARES_PACKAGE_ARGS)
ifeq ($(REPACK_64_IPK_FOR_MENU), 1)
./webos/patch-aarch64-in-ipk.sh webos/$(APP_PACKAGE_NAME)_$(IPK_VERSION)_$(IPK_ARCH).ipk
rm webos/$(APP_PACKAGE_NAME)_$(IPK_VERSION)_$(IPK_ARCH).ipk
mv webos/$(APP_PACKAGE_NAME)_$(IPK_VERSION)_$(IPK_ARCH)-patched.ipk webos/$(APP_PACKAGE_NAME)_$(IPK_VERSION)_$(IPK_ARCH).ipk
endif
install: ipk
ares-install webos/$(APP_PACKAGE_NAME)_$(IPK_VERSION)_$(ARCH).ipk
launch: install
ares-launch $(APP_PACKAGE_NAME)
.PHONY: all clean prebuild ipk
print-%:
@echo '$*=$($*)'