Skip to content

xrt-targets.cmake references static + opencl + pyxrt targets even when built without them — breaks downstream find_package(XRT) on distro packagers #9747

@ghost

Description

Summary

/usr/share/cmake/XRT/xrt-targets.cmake installed from XRT 2.21.75 declares nine imported CMake targets:

XRT::xilinxopencl           XRT::xilinxopencl_static
XRT::xrt++                  XRT::xrt++_static
XRT::xrt_coreutil           XRT::xrt_coreutil_static
XRT::xrt_core               XRT::xrt_core_static
XRT::pyxrt

Distro packagers (Arch extra/xrt 2.21.75-6, CachyOS cachyos-extra-znver4/xrt 2.21.75-6.1) ship only the three shared libs (libxrt_core.so, libxrt_coreutil.so, libxrt++.so) without the static archives, OpenCL frontend, or python binding — but the installed xrt-targets.cmake still lists the absent targets, referencing files that don't exist on disk.

Result: any downstream call to find_package(XRT) (including QUIET) hits a hard cmake error:

CMake Error at /usr/share/cmake/XRT/xrt-targets.cmake:118 (message):
  The imported target "XRT::xilinxopencl_static" references the file
     "/usr/lib/libxrt_xilinxopencl_static.a"
  but this file does not exist.  Possible reasons include:
  * An install or uninstall procedure did not complete successfully.
  * The installation package was faulty and contained
     "/usr/share/cmake/XRT/xrt-targets.cmake"
  but not all the files it references.

Blocks the canonical chain on Strix Halo + Arch / CachyOS:

  • nod-ai/iree-amd-aie
  • Xilinx/mlir-aie
  • ROCm/hsa-runtime (when built against system XRT)
  • any consumer using find_package(XRT) against a distro-packaged XRT

Reproduction

# Arch / CachyOS
sudo pacman -S xrt xrt-plugin-amdxdna
cat > /tmp/repro.cmake <<EOC
cmake_minimum_required(VERSION 3.20)
project(repro)
find_package(XRT REQUIRED)
EOC
cmake -S . -B /tmp/repro-build -P /tmp/repro.cmake 2>&1

Root cause (I think)

xrt-targets.cmake is auto-generated by CMake's install(EXPORT xrt-targets) against the full build-component set. When a packager builds with -DXRT_ENABLE_STATIC_BUILD=OFF, -DXRT_ENABLE_OPENCL=OFF, etc., the exported xrt-targets.cmake still contains the static/opencl/pyxrt target entries because the export set isn't component-gated.

Requested fix

Gate the install(EXPORT xrt-targets) entries by component, so that (a) a shared-only build generates a cmake file declaring only shared targets, and (b) -DXRT_BUILD_STATIC=OFF / -DXRT_ENABLE_OPENCL=OFF / -DXRT_ENABLE_PYTHON=OFF fully remove their targets from the generated export file.

Alternatively: emit if(EXISTS "${_IMPORT_PREFIX}/lib/libxrt_xilinxopencl.a") guards around each add_library(... IMPORTED) so a consumer with a partial install degrades to a warning instead of a hard error.

Prior history

Related closed issue #4504 (2020) touched adjacent "duplicate opencl" error. This is a different failure mode — same area of the export-set generation code.

Workaround we're using

Replace xrt-targets.cmake with a minimal hand-written version that only declares the three shared targets actually installed. Automated via pacman PostTransaction hook so it survives pacman -Syu. Script: https://github.com/bong-water-water-bong/halo-ai-rs/blob/main/strixhalo/bin/halo-xrt-cmake-patch.sh

Happy to submit a PKGBUILD-layer fix on the Arch side if upstream can't prioritize; ideally this lands upstream so every distro packager benefits.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions