ort-customops/cmake/externals/triton.cmake

145 строки
7.4 KiB
CMake

include(ExternalProject)
set(triton_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_deps/triton)
set(triton_INSTALL_DIR ${triton_PREFIX}/install)
if (WIN32)
set(vcpkg_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_deps/vcpkg)
ExternalProject_Add(vcpkg
GIT_REPOSITORY https://github.com/microsoft/vcpkg.git
GIT_TAG 2023.06.20
PREFIX ${vcpkg_PREFIX}
CONFIGURE_COMMAND ""
INSTALL_COMMAND ""
UPDATE_COMMAND ""
BUILD_COMMAND "<SOURCE_DIR>/bootstrap-vcpkg.bat")
ExternalProject_Get_Property(vcpkg SOURCE_DIR BINARY_DIR)
set(VCPKG_SRC ${SOURCE_DIR})
message(STATUS "VCPKG_SRC: " ${VCPKG_SRC})
# set the environment variable so that the vcpkg.cmake file can find the vcpkg root directory
set(ENV{VCPKG_ROOT} ${VCPKG_SRC})
message(STATUS "ENV{VCPKG_ROOT}: " $ENV{VCPKG_ROOT})
# NOTE: The VCPKG_ROOT environment variable isn't propagated to an add_custom_command target, so specify --vcpkg-root
# here and in the vcpkg_install function
add_custom_command(
COMMAND ${CMAKE_COMMAND} -E echo ${VCPKG_SRC}/vcpkg integrate --vcpkg-root=$ENV{VCPKG_ROOT} install
COMMAND ${VCPKG_SRC}/vcpkg integrate --vcpkg-root=$ENV{VCPKG_ROOT} install
COMMAND ${CMAKE_COMMAND} -E touch vcpkg_integrate.stamp
OUTPUT vcpkg_integrate.stamp
DEPENDS vcpkg
)
add_custom_target(vcpkg_integrate ALL DEPENDS vcpkg_integrate.stamp)
set(VCPKG_DEPENDENCIES "vcpkg_integrate")
function(vcpkg_install PACKAGE_NAME)
add_custom_command(
OUTPUT ${VCPKG_SRC}/packages/${PACKAGE_NAME}_${vcpkg_triplet}/BUILD_INFO
COMMAND ${CMAKE_COMMAND} -E echo ${VCPKG_SRC}/vcpkg install --vcpkg-root=$ENV{VCPKG_ROOT}
${PACKAGE_NAME}:${vcpkg_triplet}
COMMAND ${VCPKG_SRC}/vcpkg install --vcpkg-root=$ENV{VCPKG_ROOT}
${PACKAGE_NAME}:${vcpkg_triplet}
WORKING_DIRECTORY ${VCPKG_SRC}
DEPENDS vcpkg_integrate)
add_custom_target(
get${PACKAGE_NAME}
ALL
DEPENDS ${VCPKG_SRC}/packages/${PACKAGE_NAME}_${vcpkg_triplet}/BUILD_INFO)
list(APPEND VCPKG_DEPENDENCIES "get${PACKAGE_NAME}")
set(VCPKG_DEPENDENCIES ${VCPKG_DEPENDENCIES} PARENT_SCOPE)
endfunction()
vcpkg_install(rapidjson) # required by triton
vcpkg_install(openssl)
vcpkg_install(curl)
# fake dependency between openssl and rapidjson.
# without this 2 `vcpkg install` commands run in parallel which results in errors like this on the first build:
# write_contents_and_dirs("D:\src\github\ort-extensions\.scb\temp.win-amd64-cpython-311\Release\_deps\vcpkg\src\vcpkg\buildtrees\0.vcpkg_tags.cmake"): permission denied
# second attempt works, but that's not good enough for a CI.
add_dependencies(getopenssl getrapidjson)
add_dependencies(getcurl getopenssl)
set(triton_extra_cmake_args -DVCPKG_TARGET_TRIPLET=${vcpkg_triplet}
-DCMAKE_TOOLCHAIN_FILE=${VCPKG_SRC}/scripts/buildsystems/vcpkg.cmake)
# insane... but we added patch.exe from the git 32-bit windows distribution because the CI image has removed it
# from the git install that is available, and this seems like the least egregious/inconsistent way to make it work...
set(triton_patch_exe ${PROJECT_SOURCE_DIR}/cmake/externals/git.Win32.2.41.03.patch/patch.exe)
set(triton_dependencies ${VCPKG_DEPENDENCIES})
else()
# RapidJSON 1.1.0 (released in 2016) is compatible with the triton build. Later code is not compatible without
# patching due to the change in variable name for the include dir from RAPIDJSON_INCLUDE_DIRS to
# RapidJSON_INCLUDE_DIRS in the generated cmake file used by find_package:
# https://github.com/Tencent/rapidjson/commit/b91c515afea9f0ba6a81fc670889549d77c83db3
# The triton code here https://github.com/triton-inference-server/common/blob/main/CMakeLists.txt is using
# RAPIDJSON_INCLUDE_DIRS so the build fails if a newer RapidJSON version is used. It will find the package but the
# include path will be wrong so the build error is delayed/misleading and non-trivial to understand/resolve.
set(RapidJSON_PREFIX ${CMAKE_CURRENT_BINARY_DIR}/_deps/rapidjson)
set(RapidJSON_INSTALL_DIR ${RapidJSON_PREFIX}/install)
ExternalProject_Add(RapidJSON
PREFIX ${RapidJSON_PREFIX}
URL https://github.com/Tencent/rapidjson/archive/refs/tags/v1.1.0.zip
URL_HASH SHA1=0fe7b4f7b83df4b3d517f4a202f3a383af7a0818
CMAKE_ARGS -DRAPIDJSON_BUILD_DOC=OFF
-DRAPIDJSON_BUILD_EXAMPLES=OFF
-DRAPIDJSON_BUILD_TESTS=OFF
-DRAPIDJSON_HAS_STDSTRING=ON
-DRAPIDJSON_USE_MEMBERSMAP=ON
-DCMAKE_INSTALL_PREFIX=${RapidJSON_INSTALL_DIR}
)
ExternalProject_Get_Property(RapidJSON SOURCE_DIR BINARY_DIR)
# message(STATUS "RapidJSON src=${SOURCE_DIR} binary=${BINARY_DIR}")
# Set RapidJSON_ROOT_DIR for find_package. The required RapidJSONConfig.cmake file is generated in the binary dir
set(RapidJSON_ROOT_DIR ${BINARY_DIR})
set(triton_extra_cmake_args "")
set(triton_patch_exe patch)
set(triton_dependencies RapidJSON)
endif() #if (WIN32)
# Add the triton build. We just need the library so we don't install it.
set(triton_VERSION_TAG r23.05)
# Patch the triton client CMakeLists.txt to fix issues when building the linux python wheels with cibuildwheel, which
# uses CentOS 7.
# 1) use the full path to the version script file so 'ld' doesn't fail to find it. Looks like ld is running from the
# parent directory but not sure why the behavior differs vs. other linux builds
# e.g. building locally on Ubuntu is fine without the patch
# 2) only set the CURL lib path to 'lib64' on a 64-bit CentOS build as 'lib64' is invalid on a 32-bit OS. without
# this patch the build of the third-party libraries in the triton client fail as the CURL build is not found.
#
# Also fix a Windows issue where the security tools complain about warnings being disabled by increasing the
# warning level for triton/src/c++/library. Was /W0. Patched to /W3.
set(triton_patch_command ${triton_patch_exe} --verbose -p1 -i ${PROJECT_SOURCE_DIR}/cmake/externals/triton_cmake.patch)
ExternalProject_Add(triton
URL https://github.com/triton-inference-server/client/archive/refs/heads/${triton_VERSION_TAG}.tar.gz
URL_HASH SHA1=b8fd2a4e09eae39c33cd04cfa9ec934e39d9afc1
PREFIX ${triton_PREFIX}
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${triton_INSTALL_DIR}
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
-DTRITON_COMMON_REPO_TAG=${triton_VERSION_TAG}
-DTRITON_THIRD_PARTY_REPO_TAG=${triton_VERSION_TAG}
-DTRITON_CORE_REPO_TAG=${triton_VERSION_TAG}
-DTRITON_ENABLE_CC_HTTP=ON
-DTRITON_ENABLE_ZLIB=OFF
${triton_extra_cmake_args}
INSTALL_COMMAND ${CMAKE_COMMAND} -E echo "Skipping install step."
PATCH_COMMAND ${triton_patch_command}
)
add_dependencies(triton ${triton_dependencies})
ExternalProject_Get_Property(triton SOURCE_DIR BINARY_DIR)
set(triton_THIRD_PARTY_DIR ${BINARY_DIR}/third-party)