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

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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions