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