Skip to content

Commit afe615a

Browse files
authored
Merge pull request #15932 from bryanforbes/fix/xenia-edge-build
fix(xenia-edge): fix build
2 parents 02cc594 + 78b9bf9 commit afe615a

7 files changed

Lines changed: 289 additions & 6 deletions

File tree

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
Allow importing a prebuilt host xenia-shader-cc
2+
3+
xenia-shader-cc is a build-time host tool (GLSL/XeSL -> SPIR-V -> embedded
4+
.h) that links the bundled glslang frontend + SPIRV-Tools. When
5+
cross-compiling (e.g. x86_64 target on an aarch64 build host), CMake builds
6+
this tool for the *target* arch, so it can't run during the build, and it
7+
also recompiles glslang/SPIRV-Tools needlessly.
8+
9+
Add a -DXENIA_HOST_SHADER_CC=<path> escape hatch: when set, import that
10+
prebuilt build-machine binary as the xenia-shader-cc target and skip building
11+
the bundled glslang frontend + SPIRV-Tools entirely. buildroot compiles the
12+
tool natively against host-glslang and passes its path in.
13+
14+
The bundled glslang-spirv runtime static library (used by the emulator
15+
itself) is untouched.
16+
17+
Signed-off-by: batocera
18+
19+
diff --git a/third_party/CMakeLists.txt b/third_party/CMakeLists.txt
20+
--- a/third_party/CMakeLists.txt
21+
+++ b/third_party/CMakeLists.txt
22+
@@ -193,6 +193,14 @@
23+
set(_xe_use_host_shader_cc TRUE)
24+
endif()
25+
26+
+# A prebuilt xenia-shader-cc compiled for the build machine can be supplied via
27+
+# -DXENIA_HOST_SHADER_CC=<path> (e.g. when cross-compiling x86_64 on an aarch64
28+
+# host, where a target-arch tool can't run during the build). When set, import
29+
+# it and skip building the bundled glslang frontend + SPIRV-Tools entirely.
30+
+if(XENIA_HOST_SHADER_CC)
31+
+ set(_xe_use_host_shader_cc TRUE)
32+
+endif()
33+
+
34+
if(NOT _xe_use_host_shader_cc)
35+
36+
# ==============================================================================
37+
@@ -425,7 +433,17 @@
38+
endif()
39+
if(MSVC)
40+
target_compile_options(xenia-shader-cc PRIVATE /EHsc)
41+
+endif()
42+
+
43+
+elseif(XENIA_HOST_SHADER_CC) # use an externally-provided prebuilt host tool
44+
+
45+
+if(NOT EXISTS "${XENIA_HOST_SHADER_CC}")
46+
+ message(FATAL_ERROR
47+
+ "XENIA_HOST_SHADER_CC=${XENIA_HOST_SHADER_CC} does not exist.")
48+
endif()
49+
+add_executable(xenia-shader-cc IMPORTED GLOBAL)
50+
+set_target_properties(xenia-shader-cc PROPERTIES
51+
+ IMPORTED_LOCATION "${XENIA_HOST_SHADER_CC}")
52+
53+
else() # _xe_use_host_shader_cc: x64→ARM64 cross-compile, use native build's binary
54+

package/batocera/emulators/xenia-edge/Config.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
config BR2_PACKAGE_XENIA_EDGE
22
bool "xenia-edge"
3-
select BR2_PACKAGE_ALSA_LIB
43
select BR2_PACKAGE_FFMPEG
4+
select BR2_PACKAGE_IMGUI
55
select BR2_PACKAGE_FMT
66
select BR2_PACKAGE_LZ4
77
select BR2_PACKAGE_PYTHON_TOML

package/batocera/emulators/xenia-edge/xenia-edge.mk

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,14 @@ XENIA_EDGE_LICENSE = BSD
1212
XENIA_EDGE_LICENSE_FILE = LICENSE
1313
XENIA_EDGE_EMULATOR_INFO = xenia-edge.emulator.yml
1414

15-
XENIA_EDGE_DEPENDENCIES += alsa-lib ffmpeg fmt sdl3 glslang host-clang host-ninja imgui
15+
XENIA_EDGE_DEPENDENCIES += host-clang host-glslang host-shader-slang
16+
XENIA_EDGE_DEPENDENCIES += ffmpeg fmt sdl3 glslang imgui
1617
XENIA_EDGE_DEPENDENCIES += libcurl libgtk3 lz4 python-toml vulkan-headers vulkan-loader
1718

1819
XENIA_EDGE_CMAKE_BACKEND = ninja
1920

21+
XENIA_EDGE_CONF_ENV += SLANGC_PATH=$(HOST_DIR)/bin/slangc
22+
2023
XENIA_EDGE_CONF_OPTS += -DCMAKE_C_COMPILER=$(HOST_DIR)/bin/clang
2124
XENIA_EDGE_CONF_OPTS += -DCMAKE_CXX_COMPILER=$(HOST_DIR)/bin/clang++
2225
XENIA_EDGE_CONF_OPTS += -DCMAKE_EXE_LINKER_FLAGS="-lm -lstdc++"
@@ -25,11 +28,29 @@ XENIA_EDGE_CONF_OPTS += -DXENIA_BUILD_TESTS=OFF
2528
XENIA_EDGE_CONF_OPTS += -DXENIA_BUILD_MISC=OFF
2629
XENIA_EDGE_CONF_OPTS += -DXENIA_ENABLE_LTO=OFF
2730
XENIA_EDGE_CONF_OPTS += -DXENIA_USE_SYSTEM_SDL3=ON
31+
XENIA_EDGE_CONF_OPTS += -DXENIA_HOST_SHADER_CC=$(BUILD_DIR)/xenia-edge-$(XENIA_EDGE_VERSION)/host_tools/xenia-shader-cc
2832

29-
define XENIA_EDGE_DOWNLOAD_SLANG
30-
cd $(@D) && python3 ./xenia-build.py slang
33+
# xenia-shader-cc is a build-time host tool (GLSL/XeSL -> SPIR-V -> embedded
34+
# .h). We cross-compile x86_64 on an aarch64 host, so letting the project's
35+
# CMake build it with the target toolchain produces an x86_64 binary that
36+
# can't run during the build (and needlessly recompiles glslang/SPIRV-Tools).
37+
# Instead, compile it natively for the build machine against buildroot's
38+
# host-glslang / host-spirv-tools and import it (003-import-prebuilt-host-shader-cc.patch).
39+
define XENIA_EDGE_BUILD_HOST_SHADER_CC
40+
mkdir -p $(@D)/host_tools
41+
$(HOSTCXX) -O2 -std=c++17 \
42+
-I$(HOST_DIR)/include \
43+
-I$(HOST_DIR)/include/glslang \
44+
-I$(@D)/third_party/glslang/StandAlone \
45+
$(@D)/tools/build/shader_cc.cc \
46+
-o $(@D)/host_tools/xenia-shader-cc \
47+
-L$(HOST_DIR)/lib -Wl,-rpath,$(HOST_DIR)/lib \
48+
-Wl,--no-as-needed \
49+
-lSPIRV -lglslang-default-resource-limits -lglslang \
50+
-lSPIRV-Tools-opt -lSPIRV-Tools -lpthread
3151
endef
32-
XENIA_EDGE_PRE_CONFIGURE_HOOKS += XENIA_EDGE_DOWNLOAD_SLANG
52+
53+
XENIA_EDGE_PRE_CONFIGURE_HOOKS += XENIA_EDGE_BUILD_HOST_SHADER_CC
3354

3455
define XENIA_EDGE_GEN_VERSION_H
3556
mkdir -p $(@D)
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
From: Batocera build
2+
Subject: [PATCH] cmake: resolve system dependency target names
3+
4+
Several slang targets link against non-namespaced target names that only
5+
exist when the dependency is built in-tree:
6+
7+
- tools/gfx links "Vulkan-Headers"
8+
- source/slang-glslang links "SPIRV" and "SPIRV-Tools-link"
9+
10+
When building against the system packages (SLANG_USE_SYSTEM_VULKAN_HEADERS,
11+
SLANG_USE_SYSTEM_GLSLANG) those dependencies expose different names:
12+
13+
- VulkanHeaders package exports Vulkan::Headers
14+
- glslang package exports glslang::SPIRV
15+
- SPIRV-Tools-link lives in its own CMake package slang never find_package()s
16+
17+
CMake then cannot resolve the bare names to imported targets and passes
18+
them verbatim to the linker as -lVulkan-Headers / -lSPIRV /
19+
-lSPIRV-Tools-link (with no -L), causing "cannot find -l..." failures even
20+
though the libraries/headers are installed.
21+
22+
Mirror slang's existing glslang alias handling: provide the expected
23+
non-namespaced names by aliasing the namespaced targets and by
24+
find_package()-ing the SPIRV-Tools-link package.
25+
26+
--- a/CMakeLists.txt
27+
+++ b/CMakeLists.txt
28+
@@ -528,6 +528,9 @@
29+
30+
if(${SLANG_USE_SYSTEM_VULKAN_HEADERS})
31+
find_package(VulkanHeaders REQUIRED)
32+
+ if(NOT TARGET Vulkan-Headers)
33+
+ add_library(Vulkan-Headers ALIAS Vulkan::Headers)
34+
+ endif()
35+
endif()
36+
37+
if(${SLANG_USE_SYSTEM_SPIRV_TOOLS})
38+
@@ -539,6 +542,12 @@
39+
if(NOT TARGET glslang)
40+
add_library(glslang ALIAS glslang::glslang)
41+
endif()
42+
+ if(NOT TARGET SPIRV)
43+
+ add_library(SPIRV ALIAS glslang::SPIRV)
44+
+ endif()
45+
+ if(NOT TARGET SPIRV-Tools-link)
46+
+ find_package(SPIRV-Tools-link REQUIRED)
47+
+ endif()
48+
endif()
49+
50+
if(SLANG_ENABLE_DXIL)
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
From: Batocera build
2+
Subject: [PATCH] cmake: build bundled miniz as a static library
3+
4+
miniz's own CMakeLists.txt creates an untyped library
5+
(add_library(miniz ${miniz_SOURCE}) with no STATIC/SHARED keyword), so it
6+
follows BUILD_SHARED_LIBS. In a buildroot build BUILD_SHARED_LIBS is ON, so
7+
the bundled miniz is built as libminiz.so.* and becomes a runtime
8+
dependency of libslang and of the host generator tools (slangc /
9+
slang-bootstrap fail with "libminiz.so.3: cannot open shared object file"
10+
because that .so is not installed alongside the generators).
11+
12+
Force the bundled miniz to build statically. Note miniz declares
13+
cmake_minimum_required(VERSION 3.5...3.12), which caps its policies below
14+
CMP0077 (added in 3.13); its option(BUILD_SHARED_LIBS ...) therefore uses
15+
the OLD behavior and ignores a plain normal variable, falling back to the
16+
cached -DBUILD_SHARED_LIBS=ON. Setting CMAKE_POLICY_DEFAULT_CMP0077 NEW
17+
makes option() honor our BUILD_SHARED_LIBS OFF. miniz already has
18+
POSITION_INDEPENDENT_CODE ON, so the static archive links cleanly into the
19+
shared libslang, and the separate libminiz.so.* dependency disappears.
20+
21+
This only applies to the bundled build; SLANG_USE_SYSTEM_MINIZ is
22+
unaffected (the block is already guarded by it).
23+
24+
--- a/external/CMakeLists.txt
25+
+++ b/external/CMakeLists.txt
26+
@@ -41,6 +41,18 @@
27+
28+
# Miniz
29+
if(NOT ${SLANG_USE_SYSTEM_MINIZ})
30+
+ # Build the bundled miniz as a static (PIC) library so it is absorbed into
31+
+ # libslang instead of producing a separate libminiz.so.* runtime dependency.
32+
+ #
33+
+ # miniz declares cmake_minimum_required(VERSION 3.5...3.12), which caps its
34+
+ # policies below CMP0077 (added in 3.13). Its option(BUILD_SHARED_LIBS ...)
35+
+ # therefore uses the OLD behavior and ignores the normal variable we set
36+
+ # below, falling back to the cached -DBUILD_SHARED_LIBS=ON and producing a
37+
+ # shared libminiz. Force CMP0077 NEW so option() honors our setting.
38+
+ set(_prev_cmp0077 "${CMAKE_POLICY_DEFAULT_CMP0077}")
39+
+ set(_prev_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})
40+
+ set(CMAKE_POLICY_DEFAULT_CMP0077 NEW)
41+
+ set(BUILD_SHARED_LIBS OFF)
42+
if(NOT SLANG_OVERRIDE_MINIZ_PATH)
43+
add_subdirectory(miniz EXCLUDE_FROM_ALL ${system})
44+
else()
45+
@@ -51,6 +63,8 @@
46+
${system}
47+
)
48+
endif()
49+
+ set(BUILD_SHARED_LIBS ${_prev_BUILD_SHARED_LIBS})
50+
+ set(CMAKE_POLICY_DEFAULT_CMP0077 "${_prev_cmp0077}")
51+
set_property(TARGET miniz PROPERTY POSITION_INDEPENDENT_CODE ON)
52+
# Work around https://github.com/richgel999/miniz/pull/292
53+
get_target_property(miniz_c_launcher miniz C_COMPILER_LAUNCHER)
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
################################################################################
2+
#
3+
# shader-slang
4+
#
5+
################################################################################
6+
HOST_SHADER_SLANG_VERSION = v2026.8
7+
HOST_SHADER_SLANG_SITE = https://github.com/shader-slang/slang.git
8+
HOST_SHADER_SLANG_SITE_METHOD = git
9+
HOST_SHADER_SLANG_GIT_SUBMODULES = YES
10+
HOST_SHADER_SLANG_LICENSE = Apache-2.0
11+
HOST_SHADER_SLANG_LICENSE_FILE = LICENSE
12+
HOST_SHADER_SLANG_CMAKE_BACKEND = ninja
13+
SHADER_SLANG_SUPPORTS_IN_SOURCE_BUILD = NO
14+
15+
HOST_SHADER_SLANG_DEPENDENCIES += host-lz4 host-vulkan-headers \
16+
host-spirv-headers host-spirv-tools host-glslang
17+
18+
HOST_SHADER_SLANG_GENERATORS_BUILDDIR = $(HOST_SHADER_SLANG_SRCDIR)/build-host-generators
19+
HOST_SHADER_SLANG_GENERATORS_DIR = $(HOST_SHADER_SLANG_SRCDIR)/host-generators
20+
21+
HOST_SHADER_SLANG_CONF_OPTS += -B$(HOST_SHADER_SLANG_BUILDDIR)
22+
HOST_SHADER_SLANG_CONF_OPTS += -DSLANG_GENERATORS_PATH=$(HOST_SHADER_SLANG_GENERATORS_DIR)/bin
23+
HOST_SHADER_SLANG_CONF_OPTS += -DSLANG_ENABLE_GFX=OFF
24+
HOST_SHADER_SLANG_CONF_OPTS += -DSLANG_ENABLE_TESTS=OFF
25+
HOST_SHADER_SLANG_CONF_OPTS += -DSLANG_ENABLE_EXAMPLES=OFF
26+
HOST_SHADER_SLANG_CONF_OPTS += -DSLANG_USE_SYSTEM_LZ4=ON
27+
HOST_SHADER_SLANG_CONF_OPTS += -DSLANG_USE_SYSTEM_VULKAN_HEADERS=ON
28+
HOST_SHADER_SLANG_CONF_OPTS += -DSLANG_USE_SYSTEM_SPIRV_HEADERS=ON
29+
HOST_SHADER_SLANG_CONF_OPTS += -DSLANG_USE_SYSTEM_SPIRV_TOOLS=ON
30+
HOST_SHADER_SLANG_CONF_OPTS += -DSLANG_USE_SYSTEM_GLSLANG=ON
31+
HOST_SHADER_SLANG_CONF_OPTS += -DSLANG_SLANG_LLVM_FLAVOR=USE_SYSTEM_LLVM
32+
# glslang >= 15 installs its headers nested under <prefix>/include/glslang/
33+
# (e.g. include/glslang/SPIRV/GlslangToSpv.h), but slang-glslang.cpp includes
34+
# them as "SPIRV/GlslangToSpv.h" assuming the glslang source-tree layout where
35+
# SPIRV/ is at the include root. The exported glslang CMake target only adds
36+
# <prefix>/include, so add the nested dir to the include search path too.
37+
HOST_SHADER_SLANG_CONF_OPTS += -DCMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES=$(HOST_DIR)/include/glslang
38+
39+
HOST_SHADER_SLANG_BUILD_OPTS += --config Release
40+
41+
# Configure the host generators build directory. This is done before the main build so that
42+
# the generators are available for the main build.
43+
define HOST_SHADER_SLANG_CONFIGURE_GENERATORS
44+
mkdir -p $(HOST_SHADER_SLANG_GENERATORS_BUILDDIR) && \
45+
rm -f $(HOST_SHADER_SLANG_GENERATORS_BUILDDIR)/CMakeCache.txt && \
46+
cd $(HOST_SHADER_SLANG_GENERATORS_BUILDDIR) && \
47+
PATH=$(BR_PATH) \
48+
PKG_CONFIG="$(PKG_CONFIG_HOST_BINARY)" \
49+
PKG_CONFIG_SYSROOT_DIR="/" \
50+
PKG_CONFIG_LIBDIR="$(HOST_DIR)/lib/pkgconfig:$(HOST_DIR)/share/pkgconfig" \
51+
PKG_CONFIG_ALLOW_SYSTEM_CFLAGS=1 \
52+
PKG_CONFIG_ALLOW_SYSTEM_LIBS=1 \
53+
$(HOST_SHADER_SLANG_CONF_ENV) $(BR2_CMAKE) \
54+
$(HOST_SHADER_SLANG_SRCDIR) \
55+
-G$(HOST_SHADER_SLANG_GENERATOR) \
56+
-DCMAKE_MAKE_PROGRAM="$(HOST_SHADER_SLANG_GENERATOR_PROGRAM)" \
57+
-DCMAKE_FIND_ROOT_PATH="$(HOST_DIR)" \
58+
-DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM="BOTH" \
59+
-DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY="BOTH" \
60+
-DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE="BOTH" \
61+
-DCMAKE_INSTALL_PREFIX="$(HOST_DIR)" \
62+
-DCMAKE_C_FLAGS="$(HOST_CFLAGS)" \
63+
-DCMAKE_CXX_FLAGS="$(HOST_CXXFLAGS)" \
64+
-DCMAKE_EXE_LINKER_FLAGS="-Wl,-rpath,$(HOST_SHADER_SLANG_GENERATORS_DIR)/lib $(HOST_LDFLAGS)" \
65+
-DCMAKE_SHARED_LINKER_FLAGS="-Wl,-rpath,$(HOST_SHADER_SLANG_GENERATORS_DIR)/lib $(HOST_LDFLAGS)" \
66+
-DCMAKE_C_COMPILER="$(CMAKE_HOST_C_COMPILER)" \
67+
-DCMAKE_CXX_COMPILER="$(CMAKE_HOST_CXX_COMPILER)" \
68+
$(if $(CMAKE_HOST_C_COMPILER_LAUNCHER),\
69+
-DCMAKE_C_COMPILER_LAUNCHER="$(CMAKE_HOST_C_COMPILER_LAUNCHER)" \
70+
-DCMAKE_CXX_COMPILER_LAUNCHER="$(CMAKE_HOST_CXX_COMPILER_LAUNCHER)" \
71+
) \
72+
-DCMAKE_COLOR_MAKEFILE=OFF \
73+
-DBUILD_DOC=OFF \
74+
-DBUILD_DOCS=OFF \
75+
-DBUILD_EXAMPLE=OFF \
76+
-DBUILD_EXAMPLES=OFF \
77+
-DBUILD_TEST=OFF \
78+
-DBUILD_TESTS=OFF \
79+
-DBUILD_TESTING=OFF \
80+
-DBUILD_SHARED_LIBS=ON \
81+
-DSLANG_SLANG_LLVM_FLAVOR=DISABLE \
82+
-DSLANG_ENABLE_SLANG_RHI=OFF \
83+
-DSLANG_ENABLE_GFX=OFF \
84+
-DSLANG_ENABLE_TESTS=OFF \
85+
$(CMAKE_QUIET)
86+
endef
87+
88+
HOST_SHADER_SLANG_PRE_CONFIGURE_HOOKS += HOST_SHADER_SLANG_CONFIGURE_GENERATORS
89+
90+
# Build the host generators. This is done before the main build so that the generators are available
91+
# for the main build.
92+
define HOST_SHADER_SLANG_BUILD_GENERATORS
93+
$(HOST_MAKE_ENV) $(HOST_SHADER_SLANG_BUILD_ENV) $(BR2_CMAKE) \
94+
--build $(HOST_SHADER_SLANG_GENERATORS_BUILDDIR) \
95+
-j$(PARALLEL_JOBS)
96+
mkdir -p $(HOST_SHADER_SLANG_GENERATORS_DIR) && \
97+
$(HOST_MAKE_ENV) $(HOST_SHADER_SLANG_BUILD_ENV) \
98+
$(BR2_CMAKE) --install $(HOST_SHADER_SLANG_GENERATORS_BUILDDIR) \
99+
--prefix $(HOST_SHADER_SLANG_GENERATORS_DIR) \
100+
--component generators
101+
endef
102+
103+
HOST_SHADER_SLANG_PRE_BUILD_HOOKS += HOST_SHADER_SLANG_BUILD_GENERATORS
104+
105+
$(eval $(host-cmake-package))

0 commit comments

Comments
 (0)