yams/cmake/modules/OnnxRuntimeProvider.cmake
2025-09-13 22:01:36 -04:00

107 lines
5.5 KiB
CMake

#[[
OnnxRuntimeProvider.cmake (simplified)
-------------------------------------
Provider now only reuses an existing ONNX Runtime target (from Conan/package
manager or parent project). Internal source build logic was removed.
Resulting behavior:
- If target onnxruntime::onnxruntime already exists -> reuse.
- Else attempt find_package(ONNXRuntime) quietly.
- If still absent we record provider strategy "none" and higher level
code (guarded by YAMS_ENABLE_ONNX) will compile stubs.
]]#
if(TARGET onnxruntime::onnxruntime)
message(STATUS "[OnnxRuntimeProvider] Reusing existing onnxruntime::onnxruntime target")
set(YAMS_ORT_PROVIDER "existing" CACHE INTERNAL "ORT provider strategy")
# Do not return yet; we may still need to provide GenAI extension headers transparently.
endif()
if(NOT TARGET onnxruntime::onnxruntime)
find_package(ONNXRuntime QUIET)
if(TARGET onnxruntime::onnxruntime)
set(YAMS_ORT_PROVIDER "package-find" CACHE INTERNAL "ORT provider strategy")
message(STATUS "[OnnxRuntimeProvider] Found ONNX Runtime via find_package")
else()
message(STATUS "[OnnxRuntimeProvider] No ONNX Runtime target found (no internal build fallback enabled)")
set(YAMS_ORT_PROVIDER "none" CACHE INTERNAL "ORT provider strategy")
endif()
endif()
# ---------------------------------------------------------------------------
# Lightweight automatic fetch of onnxruntime-genai headers (no new options)
# Triggered only when ONNX is enabled at higher level and runtime target exists
# but required GenAI headers are missing.
# ---------------------------------------------------------------------------
if(DEFINED YAMS_ENABLE_ONNX AND YAMS_ENABLE_ONNX AND TARGET onnxruntime::onnxruntime)
# Gather exported include dirs and scan for a known GenAI header marker.
get_target_property(_ort_inc onnxruntime::onnxruntime INTERFACE_INCLUDE_DIRECTORIES)
# The standalone onnxruntime-genai repo (v0.9.x) places public headers in its 'src' directory
# (e.g. ort_genai.h) rather than an 'include/' prefix. We therefore look for that file first.
set(_genai_marker_headers
"ort_genai.h" # layout used by onnxruntime-genai repo
"onnxruntime/genai/embedding.h" # hypothetical packaged layout (future?)
)
set(_have_genai FALSE)
foreach(_d IN LISTS _ort_inc)
foreach(_marker IN LISTS _genai_marker_headers)
if(EXISTS "${_d}/${_marker}")
set(_have_genai TRUE)
break()
endif()
endforeach()
if(_have_genai)
break()
endif()
endforeach()
if(NOT _have_genai AND NOT TARGET onnxruntime::genai_headers)
set(_GENAI_VERSION "0.9.1")
set(_GENAI_URL "https://github.com/microsoft/onnxruntime-genai/archive/refs/tags/v${_GENAI_VERSION}.tar.gz")
set(_GENAI_ARCHIVE "${CMAKE_BINARY_DIR}/_deps/onnxruntime-genai-${_GENAI_VERSION}.tar.gz")
set(_GENAI_SRC_DIR "${CMAKE_BINARY_DIR}/_deps/onnxruntime-genai-${_GENAI_VERSION}")
file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/_deps")
if(NOT EXISTS "${_GENAI_ARCHIVE}")
message(STATUS "[OnnxRuntimeProvider] Fetching onnxruntime-genai v${_GENAI_VERSION} (headers only)")
file(DOWNLOAD "${_GENAI_URL}" "${_GENAI_ARCHIVE}" SHOW_PROGRESS STATUS _dl_status)
list(GET _dl_status 0 _dl_code)
if(NOT _dl_code EQUAL 0)
list(GET _dl_status 1 _dl_msg)
message(WARNING "[OnnxRuntimeProvider] Failed to download onnxruntime-genai archive: ${_dl_msg}")
endif()
endif()
if(EXISTS "${_GENAI_ARCHIVE}" AND NOT EXISTS "${_GENAI_SRC_DIR}")
execute_process(
COMMAND ${CMAKE_COMMAND} -E tar xzf "${_GENAI_ARCHIVE}"
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/_deps"
RESULT_VARIABLE _genai_extract_res
)
if(NOT _genai_extract_res EQUAL 0)
message(WARNING "[OnnxRuntimeProvider] Extraction of onnxruntime-genai archive failed (code ${_genai_extract_res})")
endif()
endif()
# Provide an interface target pointing at the repo's src directory (acts as public include dir)
if(EXISTS "${_GENAI_SRC_DIR}/src/ort_genai.h")
message(STATUS "[OnnxRuntimeProvider] Preparing interface target for onnxruntime-genai headers (src layout)")
add_library(onnxruntime_genai_headers INTERFACE)
target_include_directories(onnxruntime_genai_headers INTERFACE "${_GENAI_SRC_DIR}/src")
add_library(onnxruntime::genai_headers ALIAS onnxruntime_genai_headers)
set(YAMS_GENAI_HEADER_DIR "${_GENAI_SRC_DIR}/src" CACHE INTERNAL "GenAI header include dir")
message(STATUS "[OnnxRuntimeProvider] onnxruntime-genai headers provided from src/ (v${_GENAI_VERSION}) -> ${YAMS_GENAI_HEADER_DIR}")
elseif(EXISTS "${_GENAI_SRC_DIR}/include")
add_library(onnxruntime_genai_headers INTERFACE)
target_include_directories(onnxruntime_genai_headers INTERFACE "${_GENAI_SRC_DIR}/include")
add_library(onnxruntime::genai_headers ALIAS onnxruntime_genai_headers)
message(STATUS "[OnnxRuntimeProvider] onnxruntime-genai headers provided (v${_GENAI_VERSION})")
else()
message(STATUS "[OnnxRuntimeProvider] onnxruntime-genai headers still unavailable after fetch attempt (no src/ort_genai.h)")
endif()
elseif(_have_genai)
message(STATUS "[OnnxRuntimeProvider] onnxruntime distribution already includes GenAI headers")
endif()
if(TARGET onnxruntime::genai_headers)
get_target_property(_yams_genai_inc onnxruntime::genai_headers INTERFACE_INCLUDE_DIRECTORIES)
message(STATUS "[OnnxRuntimeProvider] GenAI interface include dirs: ${_yams_genai_inc}")
endif()
endif()