mesa: add CLC/SPIRV chain (SPIRV-Headers/Tools/LLVM-Translator) + clang21 dep

Shipping the Intel iris/ANV gallium+vulkan drivers turns on Mesa's with_clc
(with_driver_using_cl), which requires, in the native mesa_clc/intel_clc shader
precompile path: LLVMSPIRVLib (SPIRV-LLVM-Translator), SPIRV-Tools, and clang's
C++ libraries. None had recipes. Add three host-built dev recipes modelled on
libclc (built against llvm-native's host LLVM 21, staged into the cross sysroot
so Mesa's pkg-config resolves them):
  - spirv-headers          (SPIR-V grammar + headers; find_package package)
  - spirv-tools            (SPIRV-Tools.pc; SPIRV-Headers via find_package)
  - spirv-llvm-translator  (LLVMSPIRVLib.pc, v21.1.0.0; llvm_release_210 branch)
All three clear the cross-sysroot __libc_start_main leak with the llvm21-style
flag-clearing block in their native toolchain files.

Wire them + clang21 into mesa deps: Mesa resolves dep_clang via
cpp.find_library('clang-cpp', dirs: llvm-config --libdir), which the wrapper
rewrites to the target sysroot/lib, so clang21's target libclang-cpp.so must be
staged there (shared-llvm=enabled avoids needing the static clang libs).

Verified: mesa meson now passes amdgpu, LLVMSPIRVLib, SPIRV-Tools, and clang-cpp
(next gate is libelf for radeonsi).
This commit is contained in:
2026-07-31 13:42:07 +03:00
parent 8a6d8ff2b7
commit e4c78b3d18
7 changed files with 308 additions and 0 deletions
@@ -0,0 +1,68 @@
[package]
name = "spirv-headers"
# SPIR-V machine-readable headers/grammar. Build-only dependency of SPIRV-Tools
# and SPIRV-LLVM-Translator, which are in turn required by Mesa's CLC shader
# precompile path (with_clc, forced by the Intel iris/ANV drivers we ship).
# Version follows the Red Bear OS branch per local/AGENTS.md.
version = "0.3.1"
description = "SPIR-V machine-readable headers and grammar (KhronosGroup/SPIRV-Headers). Consumed at build time by SPIRV-Tools and SPIRV-LLVM-Translator for Mesa's clc tool."
[source]
git = "https://github.com/KhronosGroup/SPIRV-Headers.git"
branch = "main"
shallow_clone = true
[build]
template = "custom"
# Header-only + install-only: SPIRV-Headers ships headers, the SPIR-V grammar
# JSON, and its find_package(SPIRV-Headers) cmake package. Nothing is compiled,
# so the artifact is architecture-neutral; we install it into the (cross) build
# sysroot /usr so the host-native SPIRV-Tools / SPIRV-LLVM-Translator builds
# resolve find_package(SPIRV-Headers) from ${COOKBOOK_SYSROOT}/usr. We still run
# cmake with a HOST toolchain file (not the cross one) so the generated cmake
# package is not tainted with Redox sysroot paths.
dependencies = []
script = '''
DYNAMIC_INIT
# Use a HOST toolchain file: header-only, but keep cmake off the cross sysroot.
generate_cookbook_cmake_file "${COOKBOOK_HOST_TARGET}" "" "/usr" native_spirvhdr.cmake
# Clear the cross-sysroot flags generate_cookbook_cmake_file injects, else the
# host gcc links against the Redox sysroot libc (-L.../sysroot/lib) and fails
# "undefined reference to __libc_start_main". Mirrors llvm21/native.cmake.
cat >> native_spirvhdr.cmake <<'NATIVE_EOF'
set(CMAKE_C_COMPILER "/usr/bin/gcc" CACHE FILEPATH "" FORCE)
set(CMAKE_CXX_COMPILER "/usr/bin/g++" CACHE FILEPATH "" FORCE)
set(CMAKE_C_FLAGS "" CACHE STRING "" FORCE)
set(CMAKE_CXX_FLAGS "" CACHE STRING "" FORCE)
set(CMAKE_C_FLAGS_RELEASE "-O2" CACHE STRING "" FORCE)
set(CMAKE_CXX_FLAGS_RELEASE "-O2" CACHE STRING "" FORCE)
set(CMAKE_EXE_LINKER_FLAGS "" CACHE STRING "" FORCE)
set(CMAKE_SHARED_LINKER_FLAGS "" CACHE STRING "" FORCE)
set(CMAKE_MODULE_LINKER_FLAGS "" CACHE STRING "" FORCE)
set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "" CACHE STRING "" FORCE)
set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "" CACHE STRING "" FORCE)
set(CMAKE_SYSROOT "" CACHE STRING "" FORCE)
set(CMAKE_FIND_ROOT_PATH "" CACHE STRING "" FORCE)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM "NEVER" CACHE STRING "" FORCE)
set(ENV{LDFLAGS} "")
set(ENV{CFLAGS} "")
set(ENV{CXXFLAGS} "")
NATIVE_EOF
COOKBOOK_CMAKE_FLAGS=(
-DCMAKE_TOOLCHAIN_FILE="$(realpath native_spirvhdr.cmake)"
-DCMAKE_BUILD_TYPE=Release
-DCMAKE_INSTALL_PREFIX=/usr
-DCMAKE_INSTALL_LIBDIR=lib
-DCMAKE_INSTALL_INCLUDEDIR=include
-DSPIRV_HEADERS_ENABLE_TESTS=OFF
-DSPIRV_HEADERS_ENABLE_INSTALL=ON
-G Ninja
-Wno-dev
)
"${COOKBOOK_CMAKE}" "${COOKBOOK_SOURCE}" "${COOKBOOK_CMAKE_FLAGS[@]}"
"${COOKBOOK_NINJA}" -j"${COOKBOOK_MAKE_JOBS}"
DESTDIR="${COOKBOOK_STAGE}" "${COOKBOOK_NINJA}" install
'''
@@ -0,0 +1,124 @@
[package]
name = "spirv-llvm-translator"
# SPIRV-LLVM-Translator — provides LLVMSPIRVLib, required by Mesa's CLC path
# (with_clc, forced by the Intel iris/ANV drivers). Translates between LLVM IR
# and SPIR-V; linked into Mesa's native mesa_clc/intel_clc. Must match LLVM 21.
version = "0.3.1"
description = "SPIRV-LLVM-Translator (KhronosGroup) — LLVMSPIRVLib, LLVM IR <-> SPIR-V. Host-built against llvm-native (LLVM 21), consumed by Mesa's native clc tools."
[source]
git = "https://github.com/KhronosGroup/SPIRV-LLVM-Translator.git"
# KhronosGroup tracks LLVM releases on llvm_release_NN0 branches; 21 -> 210.
branch = "llvm_release_210"
shallow_clone = true
[build]
template = "custom"
# Like libclc: a HOST build against llvm-native's complete host LLVM dev tree
# (find_package(LLVM) needs LLVMConfig.cmake + the static component libs, which
# only llvm-native provides — the runtime toolchain ships libLLVM.so only). The
# shipped artifact (libLLVMSPIRVLib + LLVMSPIRVLib.pc) links into Mesa's native
# mesa_clc, so it is a host library staged into the (cross) build sysroot /usr;
# Mesa's target pkg-config resolves dependency('LLVMSPIRVLib') from there.
dependencies = [
"llvm-native",
"spirv-headers",
]
dev-dependencies = [
"llvm-native.dev",
"llvm-native.runtime",
]
script = '''
DYNAMIC_INIT
_SAVED_LDFLAGS="${LDFLAGS:-}"; _SAVED_CFLAGS="${CFLAGS:-}"
_SAVED_CXXFLAGS="${CXXFLAGS:-}"; _SAVED_CPPFLAGS="${CPPFLAGS:-}"
unset LDFLAGS CFLAGS CXXFLAGS CPPFLAGS
HOST_LLVM_PREFIX="${COOKBOOK_SYSROOT}/usr"
HOST_LLVM_CMAKE="${HOST_LLVM_PREFIX}/lib/cmake/llvm"
if [ -x "${HOST_LLVM_PREFIX}/bin/clang" ]; then
HOST_CLANG="${HOST_LLVM_PREFIX}/bin/clang"
elif [ -x "${HOST_LLVM_PREFIX}/bin/clang-21" ]; then
HOST_CLANG="${HOST_LLVM_PREFIX}/bin/clang-21"
else
echo "spirv-llvm-translator: ERROR — host clang not found under ${HOST_LLVM_PREFIX}/bin" >&2
ls -la "${HOST_LLVM_PREFIX}/bin" 2>/dev/null | grep -i clang >&2 || true
exit 1
fi
if [ -x "${HOST_LLVM_PREFIX}/bin/clang++" ]; then
HOST_CLANGXX="${HOST_LLVM_PREFIX}/bin/clang++"
elif [ -x "${HOST_LLVM_PREFIX}/bin/clang++-21" ]; then
HOST_CLANGXX="${HOST_LLVM_PREFIX}/bin/clang++-21"
else
echo "spirv-llvm-translator: ERROR — host clang++ not found" >&2
exit 1
fi
if [ ! -f "${HOST_LLVM_CMAKE}/LLVMConfig.cmake" ]; then
echo "spirv-llvm-translator: ERROR — host LLVMConfig.cmake not found at ${HOST_LLVM_CMAKE} (is llvm-native.dev staged?)" >&2
exit 1
fi
generate_cookbook_cmake_file "${COOKBOOK_HOST_TARGET}" "" "${HOST_LLVM_PREFIX}" native_spirvxlat.cmake
cat >> native_spirvxlat.cmake <<NATIVE_EOF
set(CMAKE_C_COMPILER "${HOST_CLANG}" CACHE FILEPATH "" FORCE)
set(CMAKE_CXX_COMPILER "${HOST_CLANGXX}" CACHE FILEPATH "" FORCE)
set(CMAKE_AR "${HOST_LLVM_PREFIX}/bin/llvm-ar" CACHE FILEPATH "" FORCE)
set(CMAKE_NM "${HOST_LLVM_PREFIX}/bin/llvm-nm" CACHE FILEPATH "" FORCE)
set(CMAKE_RANLIB "${HOST_LLVM_PREFIX}/bin/llvm-ranlib" CACHE FILEPATH "" FORCE)
set(CMAKE_C_FLAGS "" CACHE STRING "" FORCE)
set(CMAKE_CXX_FLAGS "" CACHE STRING "" FORCE)
set(CMAKE_C_FLAGS_RELEASE "-O2" CACHE STRING "" FORCE)
set(CMAKE_CXX_FLAGS_RELEASE "-O2" CACHE STRING "" FORCE)
set(CMAKE_EXE_LINKER_FLAGS "" CACHE STRING "" FORCE)
set(CMAKE_SHARED_LINKER_FLAGS "" CACHE STRING "" FORCE)
set(CMAKE_MODULE_LINKER_FLAGS "" CACHE STRING "" FORCE)
set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "" CACHE STRING "" FORCE)
set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "" CACHE STRING "" FORCE)
set(CMAKE_SYSROOT "" CACHE STRING "" FORCE)
set(CMAKE_FIND_ROOT_PATH "${HOST_LLVM_PREFIX}" CACHE STRING "" FORCE)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM "BYPASS" CACHE STRING "" FORCE)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY "BOTH" CACHE STRING "" FORCE)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE "BOTH" CACHE STRING "" FORCE)
set(LLVM_DIR "${HOST_LLVM_CMAKE}" CACHE PATH "" FORCE)
set(ENV{LDFLAGS} "")
set(ENV{CFLAGS} "")
set(ENV{CXXFLAGS} "")
NATIVE_EOF
# SPIRV-Headers: staged spirv-headers installs its include tree + cmake package
# under the build sysroot /usr. Point the translator at it (source-dir var that
# its CMake accepts, plus CMAKE_PREFIX_PATH for find_package(SPIRV-Headers)).
COOKBOOK_CMAKE_FLAGS=(
-DCMAKE_TOOLCHAIN_FILE="$(realpath native_spirvxlat.cmake)"
-DCMAKE_BUILD_TYPE=Release
-DLLVM_DIR="${HOST_LLVM_CMAKE}"
-DCMAKE_PREFIX_PATH="${HOST_LLVM_PREFIX}"
-DLLVM_EXTERNAL_SPIRV_HEADERS_SOURCE_DIR="${HOST_LLVM_PREFIX}"
-DBUILD_SHARED_LIBS=OFF
-DCMAKE_POSITION_INDEPENDENT_CODE=ON
-DLLVM_SPIRV_INCLUDE_TESTS=OFF
-DCMAKE_INSTALL_PREFIX=/usr
-DCMAKE_INSTALL_LIBDIR=lib
-DCMAKE_INSTALL_INCLUDEDIR=include
-G Ninja
-Wno-dev
)
"${COOKBOOK_CMAKE}" "${COOKBOOK_SOURCE}" "${COOKBOOK_CMAKE_FLAGS[@]}"
"${COOKBOOK_NINJA}" -j"${COOKBOOK_MAKE_JOBS}"
DESTDIR="${COOKBOOK_STAGE}" "${COOKBOOK_NINJA}" install
export LDFLAGS="$_SAVED_LDFLAGS"; export CFLAGS="$_SAVED_CFLAGS"
export CXXFLAGS="$_SAVED_CXXFLAGS"; export CPPFLAGS="$_SAVED_CPPFLAGS"
# Relocate pkgconfig to lib/pkgconfig (cookbook convention mesa uses).
if [ -d "${COOKBOOK_STAGE}/usr/share/pkgconfig" ]; then
mkdir -p "${COOKBOOK_STAGE}/usr/lib/pkgconfig"
for pc in "${COOKBOOK_STAGE}/usr/share/pkgconfig/"*.pc; do
[ -f "$pc" ] || continue
mv "$pc" "${COOKBOOK_STAGE}/usr/lib/pkgconfig/"
done
fi
'''
+98
View File
@@ -0,0 +1,98 @@
[package]
name = "spirv-tools"
# SPIR-V assembler/disassembler/validator/optimizer libraries. Required by
# Mesa's CLC shader precompile path (with_clc, forced by the Intel iris/ANV
# drivers) and by SPIRV-LLVM-Translator. Version follows the branch per AGENTS.
version = "0.3.1"
description = "SPIR-V Tools (KhronosGroup/SPIRV-Tools) — libSPIRV-Tools assembler/validator/optimizer. Host-built, consumed by Mesa's native mesa_clc/intel_clc."
[source]
git = "https://github.com/KhronosGroup/SPIRV-Tools.git"
branch = "main"
shallow_clone = true
[build]
template = "custom"
# SPIRV-Tools produces NATIVE-code libraries linked into Mesa's mesa_clc/intel_clc
# tools, which are built native:true when cross-compiling. So this is a HOST
# build (system gcc/g++, NO cross sysroot), installed into the (cross) build
# sysroot /usr so Mesa's target pkg-config resolves dependency('SPIRV-Tools')
# from ${COOKBOOK_SYSROOT}/usr while the host linker links the host library.
# SPIRV-Headers (its grammar JSON + cmake package) is resolved via find_package
# from the staged spirv-headers dependency (CMAKE_PREFIX_PATH below).
dependencies = [
"spirv-headers",
]
script = '''
DYNAMIC_INIT
_SAVED_LDFLAGS="${LDFLAGS:-}"; _SAVED_CFLAGS="${CFLAGS:-}"
_SAVED_CXXFLAGS="${CXXFLAGS:-}"; _SAVED_CPPFLAGS="${CPPFLAGS:-}"
unset LDFLAGS CFLAGS CXXFLAGS CPPFLAGS
# HOST toolchain file (system gcc/g++); do NOT target the cross sysroot.
generate_cookbook_cmake_file "${COOKBOOK_HOST_TARGET}" "" "/usr" native_spirvtools.cmake
# Clear cross-sysroot flags so host gcc/g++ link against the host libc, not the
# Redox sysroot (else "undefined reference to __libc_start_main"). Mirrors
# llvm21/native.cmake. Keep find-root LIBRARY/INCLUDE "BOTH" so find_package can
# still see the staged SPIRV-Headers under the build sysroot /usr.
cat >> native_spirvtools.cmake <<'NATIVE_EOF'
set(CMAKE_C_COMPILER "/usr/bin/gcc" CACHE FILEPATH "" FORCE)
set(CMAKE_CXX_COMPILER "/usr/bin/g++" CACHE FILEPATH "" FORCE)
set(CMAKE_C_FLAGS "" CACHE STRING "" FORCE)
set(CMAKE_CXX_FLAGS "" CACHE STRING "" FORCE)
set(CMAKE_C_FLAGS_RELEASE "-O2" CACHE STRING "" FORCE)
set(CMAKE_CXX_FLAGS_RELEASE "-O2" CACHE STRING "" FORCE)
set(CMAKE_EXE_LINKER_FLAGS "" CACHE STRING "" FORCE)
set(CMAKE_SHARED_LINKER_FLAGS "" CACHE STRING "" FORCE)
set(CMAKE_MODULE_LINKER_FLAGS "" CACHE STRING "" FORCE)
set(CMAKE_C_IMPLICIT_LINK_DIRECTORIES "" CACHE STRING "" FORCE)
set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "" CACHE STRING "" FORCE)
set(CMAKE_SYSROOT "" CACHE STRING "" FORCE)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM "NEVER" CACHE STRING "" FORCE)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY "BOTH" CACHE STRING "" FORCE)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE "BOTH" CACHE STRING "" FORCE)
set(ENV{LDFLAGS} "")
set(ENV{CFLAGS} "")
set(ENV{CXXFLAGS} "")
NATIVE_EOF
# The staged spirv-headers (its cmake package + grammar JSON) lives under the
# build sysroot /usr. Point find_package(SPIRV-Headers) at it.
HDR_PREFIX="${COOKBOOK_SYSROOT}/usr"
COOKBOOK_CMAKE_FLAGS=(
-DCMAKE_TOOLCHAIN_FILE="$(realpath native_spirvtools.cmake)"
-DCMAKE_BUILD_TYPE=Release
-DCMAKE_PREFIX_PATH="${HDR_PREFIX}"
-DSPIRV-Headers_SOURCE_DIR="${HDR_PREFIX}"
-DSPIRV_SKIP_TESTS=ON
-DSPIRV_SKIP_EXECUTABLES=OFF
-DSPIRV_WERROR=OFF
-DSPIRV_TOOLS_BUILD_STATIC=ON
-DBUILD_SHARED_LIBS=ON
-DCMAKE_POSITION_INDEPENDENT_CODE=ON
-DCMAKE_INSTALL_PREFIX=/usr
-DCMAKE_INSTALL_LIBDIR=lib
-DCMAKE_INSTALL_INCLUDEDIR=include
-G Ninja
-Wno-dev
)
"${COOKBOOK_CMAKE}" "${COOKBOOK_SOURCE}" "${COOKBOOK_CMAKE_FLAGS[@]}"
"${COOKBOOK_NINJA}" -j"${COOKBOOK_MAKE_JOBS}"
DESTDIR="${COOKBOOK_STAGE}" "${COOKBOOK_NINJA}" install
export LDFLAGS="$_SAVED_LDFLAGS"; export CFLAGS="$_SAVED_CFLAGS"
export CXXFLAGS="$_SAVED_CXXFLAGS"; export CPPFLAGS="$_SAVED_CPPFLAGS"
# Relocate any pkgconfig from share/pkgconfig to lib/pkgconfig (cookbook
# convention that mesa's pkg-config lookup uses).
if [ -d "${COOKBOOK_STAGE}/usr/share/pkgconfig" ]; then
mkdir -p "${COOKBOOK_STAGE}/usr/lib/pkgconfig"
for pc in "${COOKBOOK_STAGE}/usr/share/pkgconfig/"*.pc; do
[ -f "$pc" ] || continue
mv "$pc" "${COOKBOOK_STAGE}/usr/lib/pkgconfig/"
done
fi
'''
+15
View File
@@ -42,6 +42,21 @@ dependencies = [
"libwayland",
"linux-kpi",
"llvm21",
# with_clc also links clang's C++ libraries: Mesa resolves clang via
# cpp.find_library('clang-cpp', dirs: llvm-config --libdir), and the
# llvm-config wrapper rewrites libdir to Mesa's target sysroot/lib. So the
# target libclang-cpp.so (clang21's main package) must be staged there;
# with shared-llvm=enabled that satisfies dep_clang without the static libs.
"clang21",
# CLC/SPIRV chain: shipping the Intel iris/ANV drivers turns on with_clc,
# which requires LLVMSPIRVLib (SPIRV-LLVM-Translator) and SPIRV-Tools for the
# native mesa_clc/intel_clc shader-precompile path. Host-built, resolved by
# Mesa's pkg-config from the staged sysroot (see the spirv-* dev recipes).
# spirv-llvm-translator pulls spirv-headers transitively, but list it too so
# the SPIR-V headers Mesa's clc includes are staged deterministically.
"spirv-headers",
"spirv-tools",
"spirv-llvm-translator",
"wayland-protocols",
"zlib",
]