# Disable automatic debuginfo generation to avoid conflicts %global debug_package %{nil} # GitHub archive tarball from tag v%%{version} extracts to mvgal-v%%{version}/ %global ghdir mvgal-v%{version} # DKMS package support - build optional %bcond_without dkms # RHEL 8 / GCC 8 LTO: handled at the cmake level (src/userspace/CMakeLists.txt) # by building libmvgal_core.a objects with -fno-lto, so the LTO plugin never # encounters bytecode it can't process from the static archive. Name: mvgal Version: 0.5.6 Release: 1%{?dist} Summary: Multi-Vendor GPU Aggregation Layer for Linux License: GPL-3.0-only URL: https://github.com/TheCreateGM/mvgal # Source from GitHub archive Source0: https://github.com/TheCreateGM/mvgal/archive/refs/tags/v%{version}.tar.gz # Vendored Rust dependencies for offline COPR builds (no network access) # OpenCL support is conditional - enable by default, disable with --without opencl %bcond_without opencl BuildRequires: gcc BuildRequires: gcc-c++ BuildRequires: make BuildRequires: cmake >= 3.20 %if 0%{?suse_version} BuildRequires: ninja %else BuildRequires: ninja-build %endif BuildRequires: libdrm-devel BuildRequires: systemd-devel BuildRequires: pciutils-devel BuildRequires: pkgconfig(pciaccess) BuildRequires: vulkan-headers BuildRequires: pkgconfig(vulkan) BuildRequires: opencl-headers BuildRequires: ocl-icd-devel BuildRequires: rust BuildRequires: cargo BuildRequires: kernel-devel %if 0%{?rhel} == 8 # ORC unwinder needs libelf for kernel module build BuildRequires: elfutils-libelf-devel %endif # DKMS support - optional %if %{with dkms} BuildRequires: dkms %endif Requires: libdrm Requires: systemd %if 0%{?suse_version} Requires: libvulkan1 %else %if 0%{?mageia} Requires: lib64vulkan-loader1 %else Requires: vulkan-loader %endif %endif Obsoletes: mvgallibs <= 0.1.0 Provides: libmvgal = %{version} # Note: If you have Moore Threads (MTT) GPU drivers installed and see # ldconfig warnings like "/lib64/libmupp*.so.1 is not a symbolic link", # those are caused by a packaging issue in the MTT driver itself - the # .so.1 files are regular files instead of symlinks to versioned libraries. # This is unrelated to MVGAL. Contact Moore Threads or your distro packager # to fix the MTT driver package. %description MVGAL (Multi-Vendor GPU Aggregation Layer) enables heterogeneous GPUs (AMD, NVIDIA, Intel, Moore Threads) to function as a single logical compute and rendering device. Features: - Unified abstraction for multiple GPUs - Smart scheduling with AFR, SFR, and Hybrid strategies - DMA-BUF based cross-GPU memory management - Vulkan layer for transparent API interception - OpenCL and CUDA support (experimental) - Daemon for background GPU management %prep %setup -q -n mvgal-v%{version} # Vendored Rust dependencies for offline cargo builds (in git vendor/) mkdir -p .cargo cat > .cargo/config.toml << 'EOF' [source.crates-io] replace-with = "vendored-sources" [source.vendored-sources] directory = "vendor" EOF %build # Find kernel build directory for kernel module (kernel-devel provides one # entry in /lib/modules//build or /usr/src/kernels/ in mock/COPR # chroots). The /lib/modules//build symlink is only present when the # kernel meta-package is installed; kernel-devel alone puts headers under # /usr/src/kernels/. Mageia uses /usr/src/linux-. # Search all known paths using shell variable expansion. KERNEL_BUILD_DIR="" for _d in /lib/modules/[0-9]*/build /usr/lib/modules/[0-9]*/build /usr/src/kernels/[0-9]* /usr/src/linux-[0-9]*; do [ -d "$_d" ] && { KERNEL_BUILD_DIR="$_d"; break; } done %if 0%{?rhel} == 8 # cmake-rpm-macros on RHEL 8 (cmake 3.26 EPEL) has broken %%cmake macro # that emits "does in-source builds." as literal arguments. # Invoke cmake directly instead, then strip -flto for GCC 8. cmake \ -DCMAKE_C_FLAGS_RELEASE:STRING=-DNDEBUG \ -DCMAKE_CXX_FLAGS_RELEASE:STRING=-DNDEBUG \ -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \ -DCMAKE_INSTALL_PREFIX:PATH=%{_prefix} \ -DINCLUDE_INSTALL_DIR:PATH=%{_includedir} \ -DLIB_INSTALL_DIR:PATH=%{_libdir} \ -DSYSCONF_INSTALL_DIR:PATH=%{_sysconfdir} \ -DSHARE_INSTALL_PREFIX:PATH=%{_datadir} \ -DLIB_SUFFIX=64 \ -DBUILD_SHARED_LIBS:BOOL=ON \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_LIBDIR=%{_libdir} \ -DMVGAL_BUILD_KERNEL=ON \ -DKERNEL_HEADERS:PATH="${KERNEL_BUILD_DIR}" \ -DMVGAL_BUILD_RUNTIME=ON \ -DMVGAL_BUILD_API=ON \ -DMVGAL_BUILD_TOOLS=ON \ -DMVGAL_BUILD_TESTS=OFF \ -DMVGAL_ENABLE_RUST=ON \ -DMVGAL_BUILD_GAMING=ON # RHEL 8 / GCC 8: strip -flto from cmake-generated build files. # Use individual find commands (no \(\)) to avoid RHEL 8 RPM parser bug. # Use . because RHEL 8 cmake does in-source builds. find . -type f -name 'flags.make' -exec sed -i 's/-flto[^ ]*//g' {} \; 2>/dev/null || : find . -type f -name 'build.make' -exec sed -i 's/-flto[^ ]*//g' {} \; 2>/dev/null || : find . -type f -name '*.link.txt' -exec sed -i 's/-flto[^ ]*//g' {} \; 2>/dev/null || : find . -type f -name '*.rsp' -exec sed -i 's/-flto[^ ]*//g' {} \; 2>/dev/null || : %else %cmake \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_LIBDIR=%{_libdir} \ -DMVGAL_BUILD_KERNEL=ON \ -DKERNEL_HEADERS:PATH="${KERNEL_BUILD_DIR}" \ -DMVGAL_BUILD_RUNTIME=ON \ -DMVGAL_BUILD_API=ON \ -DMVGAL_BUILD_TOOLS=ON \ -DMVGAL_BUILD_TESTS=OFF \ -DMVGAL_ENABLE_RUST=ON \ -DMVGAL_BUILD_GAMING=ON %endif %cmake_build %install rm -rf %{buildroot} %cmake_install # cmake --install places kernel module at a machine-specific path under # BUILDROOT (e.g. $BUILDROOT/build-dir/lib/modules/...) instead of the # canonical /usr/lib/modules/. Remove all cmake-installed .ko from # BUILDROOT here so only the manually-placed ones in /usr/lib/modules/ # (see below) survive. The %{_builddir} cleanup is done AFTER the # install loop below (we need the source-tree .ko files to copy first). find %{buildroot} -name '*.ko' -delete 2>/dev/null || : # Install kernel modules (built by cmake mvgal-kernel custom target) # The multi-module Kbuild produces: mvgal.ko, mvgal_ntsync.ko, # and vendor modules (mvgal_nvidia.ko, mvgal_amd.ko, mvgal_intel.ko). # kernel-devel provides one entry in /lib/modules/ or /usr/src/kernels/ in COPR # mock chroots. The /lib/modules//build symlink is only present when the # kernel meta-package is installed; kernel-devel alone puts headers under # /usr/src/kernels/. Mageia uses /usr/src/linux-. # Search all known paths using shell variable expansion. KERNEL_RELEASE="" for _d in /lib/modules/[0-9]* /usr/lib/modules/[0-9]* /usr/src/kernels/[0-9]* /usr/src/linux-[0-9]*; do [ -d "$_d" ] && { KERNEL_RELEASE=$(basename "$_d"); break; } done # Generate file list for kernel modules so we can use %files -f # (files-list approach instead of glob because Mageia's RPM errors on # unmatched %files globs when kernel-devel is unavailable — the glob # %{_prefix}/lib/modules/*/... has nothing to match) rm -f /tmp/kernel-module.list if [ -n "$KERNEL_RELEASE" ]; then MODULE_DIR="%{buildroot}%{_prefix}/lib/modules/${KERNEL_RELEASE}/kernel/drivers/gpu/drm/mvgal" install -d "$MODULE_DIR" for ko in "%{_builddir}/%{ghdir}/kernel/"*.ko; do [ -f "$ko" ] || continue install -m 644 "$ko" "$MODULE_DIR/" echo "%%{_prefix}/lib/modules/${KERNEL_RELEASE}/kernel/drivers/gpu/drm/mvgal/$(basename $ko)" >> /tmp/kernel-module.list done fi # Clean up .ko files from %{_builddir} now that they've been copied to # BUILDROOT (cmake --install placed them in the source tree on some chroots). find %{_builddir}/%{ghdir} -name '*.ko' -delete 2>/dev/null || : if [ ! -s /tmp/kernel-module.list ]; then # No kernel-devel in this chroot (e.g. Mageia Cauldron) — create file list # with a %dir anchor for a directory we always own, so the -f file is # never empty (Mageia's RPM rejects empty %files -f files entirely). echo "%%dir %%{_prefix}/lib/mvgal" > /tmp/kernel-module.list fi # Install load/unload scripts if cmake didn't (skipped when kernel/CMakeLists.txt # returns early, e.g. kernel headers not found for target kernel on openSUSE # Tumbleweed or other chroots where cmake's find_path fails) if [ ! -f "%{buildroot}%{_bindir}/mvgal-load" ] && [ -f "%{_builddir}/%{ghdir}/config/load-module.sh" ]; then install -m 755 "%{_builddir}/%{ghdir}/config/load-module.sh" \ "%{buildroot}%{_bindir}/mvgal-load" fi if [ ! -f "%{buildroot}%{_bindir}/mvgal-unload" ] && [ -f "%{_builddir}/%{ghdir}/config/unload-module.sh" ]; then install -m 755 "%{_builddir}/%{ghdir}/config/unload-module.sh" \ "%{buildroot}%{_bindir}/mvgal-unload" fi # Install config file install -d %{buildroot}%{_sysconfdir}/mvgal install -m 644 %{_builddir}/%{ghdir}/config/mvgal.conf %{buildroot}%{_sysconfdir}/mvgal/mvgal.conf # Install kernel module auto-load config (loads mvgal + mvgal_ntsync on boot). # Conditional: append to kernel-module.list so %%files -f picks it up only when # the file exists in the source tarball. Without this, a stale cached tarball # (COPR-dist-git) that lacks the file causes rpmbuild to fail at SRPM creation # because %%files unconditionally requires it. install -d %{buildroot}%{_prefix}/lib/modules-load.d if [ -f "%{_builddir}/%{ghdir}/config/modules-load.d/mvgal.conf" ]; then install -m 644 %{_builddir}/%{ghdir}/config/modules-load.d/mvgal.conf \ %{buildroot}%{_prefix}/lib/modules-load.d/mvgal.conf echo "%%{_prefix}/lib/modules-load.d/mvgal.conf" >> /tmp/kernel-module.list fi # Install systemd service file install -d %{buildroot}%{_unitdir} install -m 644 %{_builddir}/%{ghdir}/packaging/rpm/mvgal-daemon.service %{buildroot}%{_unitdir}/mvgal-daemon.service # Install D-Bus policy file install -d %{buildroot}%{_sysconfdir}/dbus-1/system.d install -m 644 %{_builddir}/%{ghdir}/config/org.mvgal.MVGAL.conf %{buildroot}%{_sysconfdir}/dbus-1/system.d/org.mvgal.MVGAL.conf # Install OpenCL ICD registration file (ocl-icd loader reads this at runtime) %if %{with opencl} install -d %{buildroot}%{_sysconfdir}/OpenCL/vendors echo "%{_libdir}/libmvgal_opencl.so" > %{buildroot}%{_sysconfdir}/OpenCL/vendors/mvgal.icd %endif # Create symlink for daemon binary name expected by service file ln -sf mvgald %{buildroot}%{_bindir}/mvgal-daemon # ldconfig drop-in so the dynamic linker finds mvgal libraries install -d %{buildroot}%{_sysconfdir}/ld.so.conf.d echo "%{_libdir}" > %{buildroot}%{_sysconfdir}/ld.so.conf.d/mvgal.conf # Create log directory (owned by package) install -d -m 0755 %{buildroot}%{_localstatedir}/log/mvgal %post # ldconfig - update the dynamic linker cache for libmvgal.so.* # Using /sbin/ldconfig directly here (not the macro) so we can also # handle the runtime directory creation in the same scriptlet. # The ldconfig_scriptlets macro would generate a separate post -p /sbin/ldconfig # which conflicts with our custom post; instead we call ldconfig explicitly. /sbin/ldconfig 2>&1 | grep -v "is not a symbolic link" || true # Create runtime directory (tmpfiles.d would be cleaner but this works # across all supported distros without extra dependencies) install -d -m 0755 /var/run/mvgal 2>/dev/null || true install -d -m 0755 /var/log/mvgal 2>/dev/null || true if [ -d /run/systemd/system ]; then systemctl daemon-reload > /dev/null 2>&1 || : # Enable the service so mvgald.service aliases work and auto-start on boot systemctl enable mvgal-daemon.service > /dev/null 2>&1 || : fi # Update kernel module dependency database so modprobe mvgal works /sbin/depmod -a >/dev/null 2>&1 || : %preun if [ $1 -eq 0 ] && [ -d /run/systemd/system ]; then systemctl stop mvgal-daemon.service > /dev/null 2>&1 || : systemctl disable mvgal-daemon.service > /dev/null 2>&1 || : fi %postun if [ $1 -eq 0 ] && [ -d /run/systemd/system ]; then systemctl daemon-reload > /dev/null 2>&1 || : fi # Refresh ldconfig cache after uninstall, suppress unrelated MTT warnings /sbin/ldconfig 2>&1 | grep -v "is not a symbolic link" || true # Update kernel module dependency database /sbin/depmod -a >/dev/null 2>&1 || : %files -f /tmp/kernel-module.list # Kernel module via generated file list (above). Contains either the module path # (when built with kernel-devel) or a %dir anchor (when kernel-devel is absent, # e.g. Mageia Cauldron — Mageia's RPM rejects unmatched %files globs). # Daemon binary (with symlink for service file compatibility) %{_bindir}/mvgald %{_bindir}/mvgal-daemon # CLI tools %{_bindir}/mvgal %{_bindir}/mvgal-info %{_bindir}/mvgal-status %{_bindir}/mvgal-bench %{_bindir}/mvgal-compat %{_bindir}/mvgal-config %{_bindir}/mvgal-steam-setup %{_bindir}/mvgal-hw-validate # Additional tools enabled by MVGAL_BUILD_TOOLS=ON %{_bindir}/mvgal-probe %{_bindir}/mvgal_amd_external_mem %{_bindir}/cross_vendor_compute %{_bindir}/mvgal-dmabuf-matrix # Kernel module load/unload helpers %{_bindir}/mvgal-load %{_bindir}/mvgal-unload # Core library (static) %{_libdir}/libmvgal_core.a # libmvgal UAPI wrapper shared library (from tools/libmvgal/) %{_libdir}/libmvgal.so* # CMake config files for libmvgal %{_libdir}/cmake/mvgal/ # API interception libraries %{_libdir}/libVK_LAYER_MVGAL.so* %{_libdir}/libmvgal_d3d.so* %{_libdir}/libmvgal_metal.so* %{_libdir}/libmvgal_webgpu.so* %{_libdir}/libmvgal_gl.so* %{_libdir}/libmvgal_wow64.so* # GPU vendor wrapper shared libraries %{_libdir}/libmvgal_hip.so* %{_libdir}/libmvgal_nvml.so* %{_libdir}/libmvgal_ppl.so* %{_libdir}/libmvgal_radeon_ld.so* %{_libdir}/libmvgal_sycl.so* %{_libdir}/libmvgal_vaapi.so* # Additional static libraries %{_libdir}/libmvgal_prometheus.a %{_libdir}/libmvgal_sycl_backend.a # Conditionally built (OpenCL support - enabled by default) %if %{with opencl} %{_libdir}/libmvgal_opencl.so* %{_sysconfdir}/OpenCL/vendors/mvgal.icd %endif # Conditionally built (Vulkan ICD) %{_libdir}/mvgal_vulkan_icd.so* # Vulkan layer manifest %{_datadir}/vulkan/implicit_layer.d/VK_LAYER_MVGAL.json %{_datadir}/vulkan/icd.d/mvgal_icd.json # Config file %config(noreplace) %{_sysconfdir}/mvgal/mvgal.conf # Kernel module auto-load config (loads mvgal + mvgal_ntsync on boot). # This path is appended to /tmp/kernel-module.list at install time only when # the file exists in the source tree (see %%install above). If the source # tarball lacks the file (e.g. stale COPR-dist-git cache), the path is simply # omitted rather than causing rpmbuild failure. # # Systemd service %{_unitdir}/mvgal-daemon.service # D-Bus policy %config(noreplace) %{_sysconfdir}/dbus-1/system.d/org.mvgal.MVGAL.conf # ldconfig config %config(noreplace) %{_sysconfdir}/ld.so.conf.d/mvgal.conf # Log directory (created in the install section) %dir %{_localstatedir}/log/mvgal # pkexec and DKMS helper scripts %{_prefix}/lib/mvgal/mvgal-pkexec-helper.sh %{_prefix}/lib/mvgal/mtt-dkms-installer.sh %{_datadir}/mvgal/scripts/mtt-dkms-installer.sh # udev rules %{_prefix}/lib/udev/rules.d/99-mvgal.rules # PolicyKit policy %{_datadir}/polkit-1/actions/org.freedesktop.policykit.mvgal.policy # Development headers %{_includedir}/mvgal/ # Documentation %{_docdir}/mvgal/ %changelog * Mon Jun 15 2026 AxoGM - 0.5.6-1 - spec: fix Release tag — replace literal backslash-t chars with real tab characters (caused "Illegal char '\' (0x5c)" rpmbuild error at SRPM creation, blocking all COPR chroots before they even start) - spec: fix %%changelog order — move Mon Jun 15 entry before Sun Jun 14 (rpmbuild enforces descending chronological order) - Version bump to 0.5.6 (v0.5.5 tag was broken — spec had bad Release line) * Mon Jun 15 2026 AxoGM - 0.5.5-1 - spec: make modules-load.d %%files entry conditional via kernel-module.list append (previously: unconditional %%files entry caused rpmbuild failure when source tarball lacked config/modules-load.d/mvgal.conf) - mvgal_ntsync.c: add #include for C89 kernel compat (RHEL 8 kernel 4.18 with -std=gnu89; module_init/exit macros undefined on older kernels where linux/miscdevice.h doesn't pull it transitively) - Version bump to 0.5.5 (force fresh COPR-dist-git tarball) - systemd: fix Type=forking → Type=simple, Wants=multi-user.target (service file had contradictory Type=forking with --no-daemon flag) - systemd: add ExecStartPre=/sbin/modprobe mvgal to auto-load kernel module before daemon starts (fixes "is mvgal loaded?" on boot) - systemd: add Alias=mvgald.service so `systemctl start mvgald` works - spec: install config/modules-load.d/mvgal.conf to auto-load mvgal and mvgal_ntsync kernel modules on boot - spec: enable mvgal-daemon.service in %%post scriptlet so it auto-starts on boot after package install * Sun Jun 14 2026 AxoGM - 0.5.5-1 - Bump to 0.5.5 to force fresh COPR-dist-git source tarball - spec: make modules-load.d/mvgal.conf install conditional (-f guard) - kernel/mvgal_ntsync.c: add missing #include - Fixes EL8 build: module_init/module_exit/MODULE_LICENSE macros undefined - Fixes all chroots: cached v0.5.4 tarball lacks modules-load.d file * Sun Jun 14 2026 AxoGM - 0.5.4-3 - Use MODULE_IMPORT_NS("DMA_BUF") string form unconditionally (fixes CentOS Stream 10 / kernel 6.12.0 build failure) * Sat Jun 13 2026 AxoGM - 0.5.4-2 - Fix MODULE_IMPORT_NS version boundary: kernel 6.12+ (not 7.0+) enforces the sizeof-based static_assert that requires a string literal. Guard now uses KERNEL_VERSION(6,12,0) (CentOS Stream 10 ships 6.12). * Fri Jun 12 2026 AxoGM - 0.5.3-1 - Fix kernel 7.0+ regression: MODULE_IMPORT_NS(DMA_BUF) guarded with LINUX_VERSION_CODE >= KERNEL_VERSION(5,14,0) && < KERNEL_VERSION(7,0,0). Kernel 7.0+ changed the MODULE_IMPORT_NS macro (moduleparam.h static assert requiring compile-time expression). Bare DMA_BUF undeclared there. Only emit on 5.14-6.x (RHEL 9/EL9) where modpost enforces namespace imports for dma-buf symbols. * Fri Jun 12 2026 AxoGM - 0.5.2-4 - Fix RHEL 9 kernel module build error: move loop-scoped 'int j' to function-top declaration in mvgal_ntsync.c (C89 compat - RHEL 9 kernel uses -std=gnu89 with -Werror=declaration-after-statement) - Fix RHEL 9 kernel modpost: MODULE_IMPORT_NS parameter is an unquoted symbol, not a string literal. Change "DMA_BUF" to DMA_BUF in all vendor .c and _main.c files (mvgal_nvidia, mvgal_amd, mvgal_intel, mvgal_mtt). On modern kernels both forms are accepted; on RHEL 9's 5.14 kernel only the unquoted form compiles. * Thu Jun 11 2026 AxoGM - 0.5.2-3 - Fix RHEL 9 modpost namespace check: add MODULE_IMPORT_NS("DMA_BUF") back into vendor impl .c files (mvgal_nvidia.c, mvgal_amd.c, mvgal_intel.c). RHEL 9's 5.14 kernel modpost checks per-object-file namespace imports; a single MODULE_IMPORT_NS in *_main.c does not satisfy the check for symbols used in other .o files of the same module. Both the .c and _main.c files now contain MODULE_IMPORT_NS("DMA_BUF"), which is harmless on modern kernels (duplicates are merged) and required on RHEL 9. * Thu Jun 11 2026 AxoGM - 0.5.2-2 - Fix %%prep failure: add -n mvgal-v%%{version} to %%setup so it matches GitHub's archive directory naming (mvgal-v0.5.2 not mvgal-0.5.2) - Fix tarball creation: use --prefix=mvgal-v0.5.2/ in git archive to match GitHub's archive structure * Thu Jun 11 2026 AxoGM - 0.5.2-1 - Fix .ko install ordering: move find %{_builddir} -name '*.ko' -delete to AFTER the install loop (was running before, so kernel module .ko files were deleted from the source tree before the spec could install them, resulting in RPMs with no .ko files and broken kernel module packages) * Thu Jun 11 2026 AxoGM - 0.5.1-1 - Fix MODULE_IMPORT_NS("DMA_BUF") placement: move from vendor impl .c files to vendor *_main.c entry points (mvgal_nvidia_main.c, mvgal_amd_main.c, mvgal_intel_main.c) where MODULE_LICENSE lives — kernel modpost requires namespace import in the same compilation unit as the module declaration * Thu Jun 11 2026 AxoGM - 0.5.0-1 - Multi-module refactoring: split kernel into per-vendor modules (mvgal.ko core, mvgal_ntsync.ko, vendor modules) - Fix 9 kernel build warnings (unused functions/variables) - Update MODULE_AUTHOR to 'AxoGM' across all kernel modules - Fix cmake .ko filenames to match Kbuild output (mvgal.ko not mvgal_core.ko) - Install all kernel modules via generated file list * Thu Jun 11 2026 AxoGM - 0.4.0-7 - Fix: add missing 'void *bo' field to struct mvgal_nvidia_alloc (struct was defined in header without the bo member, causing 'no member named bo' error on all chroots) * Thu Jun 11 2026 AxoGM - 0.4.0-8 - Fix COPR build failure: add %%{_bindir}/mvgal-hw-validate to %%files (built by tools/CMakeLists.txt but missing from packaging manifest) * Thu Jun 11 2026 AxoGM - 0.4.0-7 - Fix kernel module struct mvgal_nvidia_alloc missing 'void *bo' member * Thu Jun 11 2026 AxoGM - 0.4.0-6 - Fix: previous 0.4.0-5 changes were uncommitted - git archive shipped stale tarball without the dma-buf-map.h removal * Thu Jun 11 2026 AxoGM - 0.4.0-5 - Fix kernel module build on kernel >= 5.19: remove dead include from all 4 vendor files (mvgal_amd.c, mvgal_intel.c, mvgal_nvidia.c, mvgal_mtt.c); renamed to upstream and MVGAL never used any symbol from that header * Tue Jun 09 2026 AxoGM - 0.4.0-4 - Fix Mageia Cauldron build: use %%files -f with generated file list (Mageia's RPM errors on unmatched %%files globs when kernel-devel absent; previous glob-based approach failed with "File not found: ...*.ko") - Fallback file list uses %%dir %%{_prefix}/lib/mvgal anchor so the -f file is never empty (Mageia also rejects empty %%files -f files) * Sun Jun 07 2026 AxoGM - 0.4.0-2 - Fix almalinux-kitten-10 build: set COPR per-chroot --without dkms (dkms not available in those repos; EPEL chroot variant has it) * Sun May 31 2026 AxoGM - 0.2.19-1 - Kernel full stack fix: pass MVGAL_BUILD_FULL_STACK=1 to make in CMake - Fix modpost undefined symbols (mvgal_set_power_state, mvgal_logical_device) - Bump Version to 0.2.19 * Sun May 31 2026 AxoGM - 0.2.9-1 - Update Version to 0.2.9 - Fix unclosed %if in changelog * Sat May 30 2026 AxoGM - 0.2.7-2 - Add DKMS support with --with-dkms build option - Update DKMS configuration for full stack build * Sat May 30 2026 AxoGM - 0.2.7-1 - Fix GCC 15+ preprocessor rejecting RHEL_RELEASE_VERSION(9,0) even with defined() guard. Use #ifndef RHEL_RELEASE_VERSION fallback define instead. - Version bump to 0.2.7 - Fix class_create on EL9: kernel 5.14 backports the 1-arg class_create API from kernel 6.4. Guard with defined(RHEL_RELEASE_CODE) check alongside LINUX_VERSION_CODE in both mvgal_main.c and mvgal_core.c. - Fix kernel module build on EL8: add BuildRequires: elfutils-libelf-devel for ORC unwinder support. - Fix unpackaged mvgal-load/mvgal-unload on openSUSE Tumbleweed: add fallback install in spec %%install section when cmake skips them (kernel/CMakeLists.txt returns early when KERNEL_HEADERS not found). * Sat May 30 2026 AxoGM - 0.2.17-1 - Lower MODULE_IMPORT_NS threshold to 6.12.0 for RHEL 10 compatibility * Sat May 30 2026 AxoGM - 0.2.16-1 - Fix MODULE_IMPORT_NS syntax for older kernels (DMA_BUF as symbol) * Sat May 30 2026 AxoGM - 0.2.15-1 - Include linux/pci-p2pdma.h for compatibility with older kernels (RHEL 9) * Sat May 30 2026 AxoGM - 0.2.14-1 - Fix kernel module redefinition of mvgal_detect_all_p2p in mvgal_device.c - Fix kernel module warnings (unused variables, unused label, double unlock) - Package missing libmvgal_wow64.so library * Sat May 30 2026 AxoGM - 0.2.13-1 - Fix duplicated code in mvgal_device.c - remove orphaned code block - Remove mistakenly duplicated code outside any function * Sat May 30 2026 AxoGM - 0.2.12-1 - Fix missing linux/version.h include in mvgal_device.c - LINUX_VERSION_CODE and KERNEL_VERSION macros require this header * Sat May 30 2026 AxoGM - 0.2.11-1 - Fix kernel module build: enable MVGAL_BUILD_FULL_STACK=1 for full kernel module - Build full kernel module stack including power management and core symbols * Sat May 30 2026 AxoGM - 0.2.10-1 - Fix kernel module build: add mvgal_power.c to MODULE_SOURCES (was missing, caused undefined symbol errors) - Add mvgal_power.h to MODULE_HEADERS * Sat May 30 2026 AxoGM - 0.2.9-1 - Fix kernel module build: add mvgal_power.c to MODULE_SOURCES (was missing, caused undefined symbol errors) - Add mvgal_power.h to MODULE_HEADERS * Sat May 30 2026 AxoGM - 0.2.8-1 - Fix kernel module build on Mageia 9: add /usr/src/linux-* to kernel header search paths - Fix empty kernel-module.list error by adding comment line instead of empty file - Mageia uses /usr/src/linux- instead of /usr/src/kernels/ for kernel headers * Sat May 30 2026 AxoGM - 0.2.7-1 - Fix GCC 15+ preprocessor rejecting RHEL_RELEASE_VERSION(9,0) even with defined() guard. Use #ifndef RHEL_RELEASE_VERSION fallback define instead. - Version bump to 0.2.7 * Sat May 30 2026 AxoGM - 0.2.6-1 - Fix RHEL_RELEASE_VERSION undefined on non-RHEL (Fedora 42/43/44, Amazon Linux 2023) GCC 15+ preprocessor rejects RHEL_RELEASE_VERSION(9,0) as syntax error when RHEL_RELEASE_VERSION is not defined. Add defined(RHEL_RELEASE_VERSION) guard. - Version bump to 0.2.6 * Sat May 30 2026 AxoGM - 0.2.5-1 - Version bump to 0.2.5 - Fix class_create on EL9: kernel 5.14 backports the 1-arg class_create API from kernel 6.4. Guard with defined(RHEL_RELEASE_CODE) check alongside LINUX_VERSION_CODE in both mvgal_main.c and mvgal_core.c. - Fix kernel module build on EL8: add BuildRequires: elfutils-libelf-devel for ORC unwinder support. - Fix unpackaged mvgal-load/mvgal-unload on openSUSE Tumbleweed: add fallback install in spec %%install section when cmake skips them (kernel/CMakeLists.txt returns early when KERNEL_HEADERS not found). * Sun May 24 2026 AxoGM - 0.2.3-12 - Fix kernel module not built in COPR mock: kernel-devel alone puts headers under /usr/src/kernels/, NOT /lib/modules//build (the build symlink only exists when the full kernel meta-package is installed). Add /usr/src/kernels/* to search paths for KERNEL_BUILD_DIR (%%build) and KERNEL_RELEASE (%%install). Switch from ls to portable for/glob loop to avoid empty-directory colon noise. * Sun May 24 2026 AxoGM - 0.2.3-10 - Fix unpackaged files: remove cmake-installed mvgal.ko (wrong path under BUILDROOT) via find -delete in %%install; add %%{_bindir}/mvgal-load and %%{_bindir}/mvgal-unload to %%files. Bump Release to 10. * Sun May 24 2026 AxoGM - 0.2.3-9 - Fix kernel module install: manually install mvgal.ko in %%install section with dynamic file list (%%files -f) instead of relying on cmake's install(CODE COMPONENT kernel) which didn't place .ko into BUILDROOT. Empty file list created when .ko not built, so rpmbuild doesn't error. Bump Release to 9. * Sun May 24 2026 AxoGM - 0.2.3-8 - Enable kernel module (MVGAL_BUILD_KERNEL=ON) for all chroots. Add BuildRequires: kernel-devel and pass KERNEL_HEADERS from the spec so the find_path in kernel/CMakeLists.txt resolves to the mock/COPR chroot's kernel-devel instead of the build host's uname -r. Fix kernel module install path from %{_libdir}/modules/ (lib64) to lib/modules/ (correct). Add depmod -a to %%post/%%postun for modprobe mvgal support. * Sun May 24 2026 AxoGM - 0.2.3-7 - Fix RHEL 8 linker error: mvgald missing libmvgal_core.a on in-source cmake builds (cmake 3.26 EPEL). Use add_dependencies(mvgald mvgal_core) for build ordering and $ generator expression for absolute library path, which works in both in-source and out-of-source builds. * Thu May 21 2026 AxoGM - 0.2.3-6 - Enable MVGAL_BUILD_GAMING=ON on Fedora and all non-RHEL targets (%%else branch in %%build section) so Gaming integration shows as ON in COPR builds for Fedora, openSUSE, CentOS Stream, Amazon Linux, etc. This was previously only set in the %%if rhel == 8 branch. * Thu May 21 2026 AxoGM - 0.2.3-5 - GCC 8 LTO: guard -flto with version check (GCC < 9) in root CMakeLists.txt so the LTO option is never emitted for RHEL 8 / GCC 8 builds. Removes the need for spec-level sed stripping of -flto from generated build files. - Enable MVGAL_BUILD_GAMING=ON on RHEL 8 for Steam/Proton gaming integration. - mvgal_ai.c excluded from mvgal_core unless MVGAL_BUILD_GAMING=ON; gaming API functions only compiled when gaming integration is active. * Tue May 19 2026 AxoGM - 0.2.3-4 - Fix RHEL 8 linker error: add mvgal_ai.c to mvgal_core static library in src/userspace/CMakeLists.txt, link mvgal_core into mvgald. cmake refuses to compile source files listed via absolute or ../ paths from a different source tree (previous attempt). Reorder root CMakeLists.txt so src/userspace is processed before runtime, ensuring mvgal_core target exists for linking. * Tue May 19 2026 AxoGM - 0.2.3-2 - Fix RHEL 8 %%cmake macro breakage: cmake-rpm-macros 3.26 from EPEL emits "does in-source builds." as literal cmake arguments. Bypass %%cmake on RHEL 8 and invoke cmake directly with equivalent flags. - Keep %%cmake for all other chroots (Fedora, RHEL 9+, openSUSE, etc.) - Retain RHEL 8 LTO workaround (sed strip -flto from cmake build files) * Tue May 19 2026 AxoGM - 0.2.3-1 - Updated to version 0.2.3 - Fix SYCL backend: use correct mvgal_gpu_descriptor_t/mvgal_gpu_get_descriptor API - Fix Source0 to use GitHub archive URL - Enable Rust safety crates (BuildRequires rust cargo) * Mon May 18 2026 AxoGM - 0.2.2-21 - Fix RHEL 8 LTO: strip -flto from cmake-generated build files (flags.make, build.make, link.txt, .rsp) via sed after %%cmake configures but before %%cmake_build runs. Fresh mock chroot — no side effects. This bypasses the cmake-rpm-macros Lua %%cmake which injects -flto immune to all other override approaches (env CFLAGS, %%_lto_cflags, rm redhat-lto.cmake, -D cache variable overrides, -fno-lto compile/link options) * Mon May 18 2026 AxoGM - 0.2.2-20 - Fix RHEL 8 LTO: bypass %%cmake Lua macro entirely — invoke cmake directly with CFLAGS="%%{optflags}" only (no %%{_lto_cflags}). The %%cmake macro on RHEL 8 cmake 3.26 EPEL injects -flto in a way immune to all overrides (env, cache vars, system file patching). Direct cmake invocation with optflags on RHEL 8 does NOT include -flto (it comes from _lto_cflags which we bypass). On Fedora 44+, optflags include -flto=auto which modern GCC handles fine. * Mon May 18 2026 AxoGM - 0.2.2-19 - Fix RHEL 8 LTO: bypass %%cmake Lua macro entirely (cmake-rpm-macros on RHEL 8 cmake 3.26 from EPEL injects -flto immune to all normal overrides); invoke cmake directly with clean CFLAGS (optflags only, no _lto_cflags) - Extract common cmake args into %%mvgal_cmake_args macro shared by both RHEL 8 and non-RHEL build paths * Mon May 18 2026 AxoGM - 0.2.2-18 - Fix RHEL 8 LTO: build libmvgal_core.a with -fno-lto via GCC version check (GCC < 9) in src/userspace/CMakeLists.txt so static archive contains no LTO bytecode — GCC 8's LTO plugin cannot misinterpret regular bytecode. Remove all spec-level LTO workarounds (rhel_cmake_no_lto, CFLAGS stripping, redhat-lto.cmake removal) that fought the %%cmake macro in vain. * Mon May 18 2026 AxoGM - 0.2.2-17 - Fix RHEL 8 LTO: override CMAKE_C_FLAGS/CXX_FLAGS/C_FLAGS_RELEASE/ CXX_FLAGS_RELEASE via cmake -D cache vars instead of env CFLAGS sed (%%cmake macro assigns CFLAGS directly overriding env overrides) - Remove redhat-lto.cmake rm and CFLAGS env stripping (both ineffective) * Mon May 18 2026 AxoGM - 0.2.2-16 - Fix RHEL 8 LTO: strip -flto from CFLAGS/CXXFLAGS in %%build section via sed before %%cmake, and use set_target_properties(LINK_FLAGS "-fno-lto") unconditionally (removes cmake version conditional) — the RPM optflags persist -flto in CMAKE_C_FLAGS regardless of redhat-lto.cmake removal, and target_link_options on cmake 3.26 places -fno-lto before -flto in the link command so GCC picks -flto (last flag wins) * Mon May 18 2026 AxoGM - 0.2.2-15 - Fix RHEL 8 LTO: use LINK_FLAGS property (cmake <3.13) and target_link_options (cmake >=3.13) to add -fno-lto at link time in add_mvgal_tool(); remove redhat-lto.cmake in %%prep (sed didn't match file content); add_mvgal_tool handles compile + link separately so LTO is fully disabled for mvgal-config and mvgal-bin targets * Mon May 18 2026 AxoGM - 0.2.2-14 - Fix RHEL 8 LTO: patch redhat-lto.cmake in %%prep to set CMAKE_INTERPROCEDURAL_OPTIMIZATION=FALSE (system cmake module overrides both per-target properties and cache variables; GCC 8 LTO plugin drops static archive symbols regardless of workarounds) * Mon May 18 2026 AxoGM - 0.2.2-13 - Fix RHEL 8 LTO: disable globally via -DCMAKE_INTERPROCEDURAL_OPTIMIZATION:BOOL=OFF instead of per-target properties; redhat-lto.cmake on cmake 3.26 overrides per-target IPO settings and GCC 8 LTO plugin drops static archive symbols regardless of --whole-archive/-fno-lto tricks * Mon May 18 2026 AxoGM - 0.2.2-12 - Fix RHEL 8 LTO: use INTERPROCEDURAL_OPTIMIZATION per-target property (cmake 3.9+) in tools/CMakeLists.txt instead of CMAKE_C_FLAGS_RELEASE override; target_link_options requires cmake 3.13+ (RHEL 8 ships 3.11) * Mon May 18 2026 AxoGM - 0.2.2-11 - Fix RHEL 8 LTO: use single-line %%define to avoid shell expansion bug - Override CMAKE_C_FLAGS_RELEASE to strip -flto on RHEL 8 only * Mon May 18 2026 AxoGM - 0.2.2-10 - RHEL 8: override CMAKE_C_FLAGS_RELEASE to strip -flto (RPM _lto_cflags macro unreliable on COPR mock); GCC 8 LTO plugin drops static archive symbols * Mon May 18 2026 AxoGM - 0.2.2-9 - Fix RHEL 8 LTO: disable LTO entirely via %%_lto_cflags on RHEL 8 - GCC 8 / older binutils LTO plugin drops symbols from static archives even with --whole-archive or per-target -fno-lto; the RPM-level %%_lto_cflags macro is the only reliable way to suppress -flto * Mon May 18 2026 AxoGM - 0.2.2-8 - Fix RHEL 8 LTO linker: add -fno-lto to both compile and link for mvgal tools - RHEL 8 / GCC 8 LTO plugin drops static archive symbols even with --whole-archive; per-target -fno-lto at compile + link suppresses the LTO plugin entirely * Mon May 18 2026 AxoGM - 0.2.2-7 - Fix RHEL 8 LTO: disable per-target -flto for mvgal-config and mvgal-bin with -fno-lto override; GCC 8 LTO plugin drops unresolved symbols from static archives even with --whole-archive wrapper * Mon May 18 2026 AxoGM - 0.2.2-6 - Fix RHEL 8 LTO linker: use -Wl,--push-state,--whole-archive flags directly in target_link_libraries (not target_link_options) so --whole-archive is placed right before libmvgal_core.a in the library link order - Also apply to mvgal-config and mvgal-bin tools * Mon May 18 2026 AxoGM - 0.2.2-5 - Fix source tarball: use --prefix=mvgal-0.2.2/ so %%setup finds source dir - Enable CLI tools (MVGAL_BUILD_TOOLS=ON) with all binaries in %%files - Fix RHEL 8 LTO: wrap libmvgal_core with --whole-archive in link step - Add mvgal-probe, mvgal_amd_external_mem, libmvgal.so*, cmake config to %%files - Update shell-completion %%files to include bash/zsh completions * Mon May 18 2026 AxoGM - 0.2.2-4 - Fix RHEL 8 LTO linker error: wrap mvgal_core with --whole-archive in tools/CMakeLists.txt so older GCC 8.x resolves mvgal_* symbols from the static archive during LTO link phase * Mon May 18 2026 AxoGM - 0.2.2-3 - Fix unpackaged files from MVGAL_BUILD_TOOLS=ON: add mvgal-probe, mvgal_amd_external_mem, libmvgal.so*, and CMake config files to %%files * Mon May 18 2026 AxoGM - 0.2.2-2 - Enable MVGAL_BUILD_TOOLS=ON to build and package CLI tools (mvgal, mvgal-info, mvgal-status, mvgal-bench, mvgal-compat, mvgal-config, mvgal-steam-setup) * Sat May 16 2026 AxoGM - 0.2.2-1 - Version bump to 0.2.2 - Add libmvgal_prometheus.a and libmvgal_sycl_backend.a to %%files (fix unpackaged files error on COPR) - Fix Release numbering for 0.2.2 * Wed May 13 2026 AxoGM - 0.2.1-13 - Fix COPR source script: use packaging/rpm/mvgal.spec instead of pkg/rpm/mvgal.spec (broken path preventing SRPM builds) * Sun May 10 2026 AxoGM - 0.2.1-12 - Fix openSUSE documentation directory: use %%{_docdir}/mvgal/ instead of %%{_datadir}/doc/mvgal/ (%%{_datadir}/doc/ != %%{_docdir}/ on openSUSE) - Fix GCC 7.5 (openSUSE Leap 15.6) cmake configure: remove redundant target_compile_features(mvgald PRIVATE cxx_std_20) from runtime/CMakeLists.txt (CMAKE_CXX_STANDARD 20 already set at project level) - Fix C17 cmake configure error on older CMake (Mageia 8, CMake 3.20): conditionally use C17 only for CMake >= 3.21, fall back to C11 * Sun May 10 2026 AxoGM - 0.2.1-11 - Fix distro-specific package names: use pkgconfig(vulkan) instead of vulkan-loader for cross-distro portability (Fedora, RHEL, Mageia, openSUSE) - Use distro conditionals: ninja-build (Fedora/Mageia) vs ninja (openSUSE); vulkan-loader (Fedora/RHEL) vs lib64vulkan-loader1 (Mageia) vs libvulkan1 (openSUSE) for runtime dependency * Sun May 10 2026 AxoGM - 0.2.1-10 - Fix unpackaged files error: add pkexec helper, DKMS installer scripts, udev rules, and PolicyKit policy to %%files section * Sun May 10 2026 AxoGM - 0.2.1-9 - Add missing forward declaration for mvgal_get_queue_family_properties in device_group.c fixes implicit-declaration error * Sun May 10 2026 AxoGM - 0.2.1-8 - Fix implicit declaration error in device_group.c: rename mvgal_gpu_get_queue_family_properties to mvgal_get_queue_family_properties (function never existed, was a code artifact) * Sun May 10 2026 AxoGM - 0.2.1-7 - Fix fatal error: mvgal/mvgal.h: No such file or directory when building vk_layer.c on Fedora 44+: add missing ${MVGAL_INCLUDE_DIRS} to the vulkan layer CMake target include paths * Sun May 10 2026 AxoGM - 0.2.1-6 - Fix implicit declaration error on GCC 15+ (Fedora Rawhide): remove dead call to mvgal_rewrite_update_gpu_utilization from load_balancer.c * Sun May 10 2026 AxoGM - 0.2.1-5 - Add CMake compatibility aliases for subdirectory CMakeLists that reference old-style find_package patterns (DRM_IMPORTED_TARGET, PCI_IMPORTED_TARGET, UDEV_IMPORTED_TARGET) - Fix unconditional opengl and vulkan_icd subdirectory builds to be discoverable from parent CMakeLists.txt * Thu May 07 2026 AxoGM - 0.2.1-4 - Fix unpackaged files error: add headers (%%{_includedir}/mvgal/) and documentation (%%{_datadir}/doc/mvgal/) to %%files section - Add proper %%bcond_without opencl for conditional OpenCL library inclusion - Add ocl-icd-devel to BuildRequires (was missing for OpenCL support) - Remove duplicate BuildRequires: opencl-headers - Add %%dir %%{_localstatedir}/log/mvgal to %%files and %%install sections - Fix %%files section to properly conditionally include libmvgal_opencl.so * Wed May 06 2026 AxoGM - 0.2.1-2 - Fix CMake install paths to use CMAKE_INSTALL_LIBDIR instead of hardcoded "lib" This ensures libraries install to lib64 on 64-bit systems automatically - Remove complex versioned symlink logic from spec %%install (now handled by CMake) - Add missing API interception libraries to %%files section: libmvgal_opencl.so, libmvgal_d3d.so, libmvgal_metal.so, libmvgal_webgpu.so - Simplify spec file by relying on CMake GNUInstallDirs for proper paths * Mon May 04 2026 AxoGM - 0.2.1-1 - Fix ldconfig "not a symbolic link" warnings for libmvgal shared libs by installing versioned .so.MAJOR.MINOR.PATCH files with proper symlinks - Switch from manual /sbin/ldconfig call to %%ldconfig_scriptlets macro to avoid surfacing unrelated MTT driver packaging issues - Fix config file path: packaging/rpm/mvgal.conf (was rpm/mvgal.conf) - Fix service file path: packaging/rpm/mvgal-daemon.service - Switch %%build/%%install to %%cmake/%%cmake_build/%%cmake_install macros - Add pciutils-devel and pciaccess to BuildRequires - Add /etc/ld.so.conf.d/mvgal.conf fragment for reliable library discovery - Add %%preun service disable on uninstall * Tue Apr 21 2026 AxoGM - 0.2.0-1 - Updated to version 0.2.0 "Health Monitor" - GPU health monitoring with temperature, utilization tracking - Comprehensive scheduler with 7 strategies - DMA-BUF based cross-GPU memory management - OpenCL interception layer * Sun Apr 19 2026 AxoGM - 0.1.0-1 - Initial release - GPU detection, scheduler, memory manager - Vulkan layer, CUDA wrapper - Daemon for background GPU management