107 lines
5.5 KiB
CMake
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()
|
|
|