From e4c78b3d182f90fdbf39bac4e1173bedec88faea Mon Sep 17 00:00:00 2001 From: vasilito Date: Fri, 31 Jul 2026 13:42:07 +0300 Subject: [PATCH] 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). --- local/recipes/dev/spirv-headers/recipe.toml | 68 ++++++++++ .../dev/spirv-llvm-translator/recipe.toml | 124 ++++++++++++++++++ local/recipes/dev/spirv-tools/recipe.toml | 98 ++++++++++++++ local/recipes/libs/mesa/recipe.toml | 15 +++ recipes/dev/spirv-headers | 1 + recipes/dev/spirv-llvm-translator | 1 + recipes/dev/spirv-tools | 1 + 7 files changed, 308 insertions(+) create mode 100644 local/recipes/dev/spirv-headers/recipe.toml create mode 100644 local/recipes/dev/spirv-llvm-translator/recipe.toml create mode 100644 local/recipes/dev/spirv-tools/recipe.toml create mode 120000 recipes/dev/spirv-headers create mode 120000 recipes/dev/spirv-llvm-translator create mode 120000 recipes/dev/spirv-tools diff --git a/local/recipes/dev/spirv-headers/recipe.toml b/local/recipes/dev/spirv-headers/recipe.toml new file mode 100644 index 0000000000..ca338f5f9d --- /dev/null +++ b/local/recipes/dev/spirv-headers/recipe.toml @@ -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 +''' diff --git a/local/recipes/dev/spirv-llvm-translator/recipe.toml b/local/recipes/dev/spirv-llvm-translator/recipe.toml new file mode 100644 index 0000000000..f9ea3a903a --- /dev/null +++ b/local/recipes/dev/spirv-llvm-translator/recipe.toml @@ -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_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 +''' diff --git a/local/recipes/libs/mesa/recipe.toml b/local/recipes/libs/mesa/recipe.toml index 1e9b8487d0..7969753b49 100644 --- a/local/recipes/libs/mesa/recipe.toml +++ b/local/recipes/libs/mesa/recipe.toml @@ -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", ] diff --git a/recipes/dev/spirv-headers b/recipes/dev/spirv-headers new file mode 120000 index 0000000000..f5cc247e05 --- /dev/null +++ b/recipes/dev/spirv-headers @@ -0,0 +1 @@ +../../local/recipes/dev/spirv-headers \ No newline at end of file diff --git a/recipes/dev/spirv-llvm-translator b/recipes/dev/spirv-llvm-translator new file mode 120000 index 0000000000..08b12d12d7 --- /dev/null +++ b/recipes/dev/spirv-llvm-translator @@ -0,0 +1 @@ +../../local/recipes/dev/spirv-llvm-translator \ No newline at end of file diff --git a/recipes/dev/spirv-tools b/recipes/dev/spirv-tools new file mode 120000 index 0000000000..885352a7aa --- /dev/null +++ b/recipes/dev/spirv-tools @@ -0,0 +1 @@ +../../local/recipes/dev/spirv-tools \ No newline at end of file