mirror of
https://github.com/saymrwulf/onnxruntime.git
synced 2026-05-16 21:00:14 +00:00
205 lines
9.1 KiB
CMake
205 lines
9.1 KiB
CMake
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
# file Copyright.txt or https://cmake.org/licensing for details.
|
|
|
|
# This file was copied from cmake source with modifications:
|
|
# 1. Add the EXCLUDE_FROM_ALL keyword when this function calls add_subdirectory. It will also resolve the
|
|
# 'make install' issue.
|
|
# 2. Group the VC projects into the "external" folder. We can do it at there in a centralized way instead
|
|
# of doing it one by one.
|
|
# 3. Set the cmake property COMPILE_WARNING_AS_ERROR to OFF for these external projects.
|
|
|
|
macro(onnxruntime_fetchcontent_makeavailable)
|
|
|
|
# We must append an item, even if the variable is unset, so prefix its value.
|
|
# We will strip that prefix when we pop the value at the end of the macro.
|
|
list(APPEND __cmake_fcCurrentVarsStack
|
|
"__fcprefix__${CMAKE_VERIFY_INTERFACE_HEADER_SETS}"
|
|
)
|
|
set(CMAKE_VERIFY_INTERFACE_HEADER_SETS FALSE)
|
|
|
|
get_property(__cmake_providerCommand GLOBAL PROPERTY
|
|
__FETCHCONTENT_MAKEAVAILABLE_SERIAL_PROVIDER
|
|
)
|
|
foreach(__cmake_contentName IN ITEMS ${ARGV})
|
|
string(TOLOWER ${__cmake_contentName} __cmake_contentNameLower)
|
|
|
|
# If user specified FETCHCONTENT_SOURCE_DIR_... for this dependency, that
|
|
# overrides everything else and we shouldn't try to use find_package() or
|
|
# a dependency provider.
|
|
string(TOUPPER ${__cmake_contentName} __cmake_contentNameUpper)
|
|
if("${FETCHCONTENT_SOURCE_DIR_${__cmake_contentNameUpper}}" STREQUAL "")
|
|
# Dependency provider gets first opportunity, but prevent infinite
|
|
# recursion if we are called again for the same thing
|
|
if(NOT "${__cmake_providerCommand}" STREQUAL "" AND
|
|
NOT DEFINED __cmake_fcProvider_${__cmake_contentNameLower})
|
|
message(VERBOSE
|
|
"Trying FETCHCONTENT_MAKEAVAILABLE_SERIAL dependency provider for "
|
|
"${__cmake_contentName}"
|
|
)
|
|
# It's still valid if there are no saved details. The project may have
|
|
# been written to assume a dependency provider is always set and will
|
|
# provide dependencies without having any declared details for them.
|
|
__FetchContent_getSavedDetails(${__cmake_contentName} __cmake_contentDetails)
|
|
set(__cmake_providerArgs
|
|
"FETCHCONTENT_MAKEAVAILABLE_SERIAL"
|
|
"${__cmake_contentName}"
|
|
)
|
|
# Empty arguments must be preserved because of things like
|
|
# GIT_SUBMODULES (see CMP0097)
|
|
foreach(__cmake_item IN LISTS __cmake_contentDetails)
|
|
string(APPEND __cmake_providerArgs " [==[${__cmake_item}]==]")
|
|
endforeach()
|
|
|
|
# This property might be defined but empty. As long as it is defined,
|
|
# find_package() can be called.
|
|
get_property(__cmake_addfpargs GLOBAL PROPERTY
|
|
_FetchContent_${contentNameLower}_find_package_args
|
|
DEFINED
|
|
)
|
|
if(__cmake_addfpargs)
|
|
get_property(__cmake_fpargs GLOBAL PROPERTY
|
|
_FetchContent_${contentNameLower}_find_package_args
|
|
)
|
|
string(APPEND __cmake_providerArgs " FIND_PACKAGE_ARGS")
|
|
foreach(__cmake_item IN LISTS __cmake_fpargs)
|
|
string(APPEND __cmake_providerArgs " [==[${__cmake_item}]==]")
|
|
endforeach()
|
|
endif()
|
|
|
|
# Calling the provider could lead to onnxruntime_fetchcontent_makeavailable() being
|
|
# called for a nested dependency. That nested call may occur in the
|
|
# current variable scope. We have to save and restore the variables we
|
|
# need preserved.
|
|
list(APPEND __cmake_fcCurrentVarsStack
|
|
${__cmake_contentName}
|
|
${__cmake_contentNameLower}
|
|
)
|
|
|
|
set(__cmake_fcProvider_${__cmake_contentNameLower} YES)
|
|
cmake_language(EVAL CODE "${__cmake_providerCommand}(${__cmake_providerArgs})")
|
|
|
|
list(POP_BACK __cmake_fcCurrentVarsStack
|
|
__cmake_contentNameLower
|
|
__cmake_contentName
|
|
)
|
|
|
|
unset(__cmake_fcProvider_${__cmake_contentNameLower})
|
|
unset(__cmake_providerArgs)
|
|
unset(__cmake_addfpargs)
|
|
unset(__cmake_fpargs)
|
|
unset(__cmake_item)
|
|
unset(__cmake_contentDetails)
|
|
|
|
FetchContent_GetProperties(${__cmake_contentName})
|
|
if(${__cmake_contentNameLower}_POPULATED)
|
|
continue()
|
|
endif()
|
|
endif()
|
|
|
|
# Check if we've been asked to try find_package() first, even if we
|
|
# have already populated this dependency. If we previously tried to
|
|
# use find_package() for this and it succeeded, those things might
|
|
# no longer be in scope, so we have to do it again.
|
|
get_property(__cmake_haveFpArgs GLOBAL PROPERTY
|
|
_FetchContent_${__cmake_contentNameLower}_find_package_args DEFINED
|
|
)
|
|
if(__cmake_haveFpArgs)
|
|
unset(__cmake_haveFpArgs)
|
|
message(VERBOSE "Trying find_package(${__cmake_contentName} ...) before FetchContent")
|
|
get_property(__cmake_fpArgs GLOBAL PROPERTY
|
|
_FetchContent_${__cmake_contentNameLower}_find_package_args
|
|
)
|
|
|
|
# This call could lead to onnxruntime_fetchcontent_makeavailable() being called for
|
|
# a nested dependency and it may occur in the current variable scope.
|
|
# We have to save/restore the variables we need to preserve.
|
|
list(APPEND __cmake_fcCurrentNameStack
|
|
${__cmake_contentName}
|
|
${__cmake_contentNameLower}
|
|
)
|
|
find_package(${__cmake_contentName} ${__cmake_fpArgs})
|
|
list(POP_BACK __cmake_fcCurrentNameStack
|
|
__cmake_contentNameLower
|
|
__cmake_contentName
|
|
)
|
|
unset(__cmake_fpArgs)
|
|
|
|
if(${__cmake_contentName}_FOUND)
|
|
FetchContent_SetPopulated(${__cmake_contentName})
|
|
FetchContent_GetProperties(${__cmake_contentName})
|
|
continue()
|
|
endif()
|
|
endif()
|
|
else()
|
|
unset(__cmake_haveFpArgs)
|
|
endif()
|
|
|
|
FetchContent_GetProperties(${__cmake_contentName})
|
|
if(NOT ${__cmake_contentNameLower}_POPULATED)
|
|
FetchContent_Populate(${__cmake_contentName})
|
|
__FetchContent_setupFindPackageRedirection(${__cmake_contentName})
|
|
|
|
# Only try to call add_subdirectory() if the populated content
|
|
# can be treated that way. Protecting the call with the check
|
|
# allows this function to be used for projects that just want
|
|
# to ensure the content exists, such as to provide content at
|
|
# a known location. We check the saved details for an optional
|
|
# SOURCE_SUBDIR which can be used in the same way as its meaning
|
|
# for ExternalProject. It won't matter if it was passed through
|
|
# to the ExternalProject sub-build, since it would have been
|
|
# ignored there.
|
|
set(__cmake_srcdir "${${__cmake_contentNameLower}_SOURCE_DIR}")
|
|
__FetchContent_getSavedDetails(${__cmake_contentName} __cmake_contentDetails)
|
|
if("${__cmake_contentDetails}" STREQUAL "")
|
|
message(FATAL_ERROR "No details have been set for content: ${__cmake_contentName}")
|
|
endif()
|
|
cmake_parse_arguments(__cmake_arg "SYSTEM" "SOURCE_SUBDIR" "" ${__cmake_contentDetails})
|
|
if(NOT "${__cmake_arg_SOURCE_SUBDIR}" STREQUAL "")
|
|
string(APPEND __cmake_srcdir "/${__cmake_arg_SOURCE_SUBDIR}")
|
|
endif()
|
|
|
|
if(EXISTS ${__cmake_srcdir}/CMakeLists.txt)
|
|
set(CMAKE_SKIP_INSTALL_RULES TRUE)
|
|
if (__cmake_arg_SYSTEM)
|
|
add_subdirectory(${__cmake_srcdir} ${${__cmake_contentNameLower}_BINARY_DIR} SYSTEM)
|
|
else()
|
|
add_subdirectory(${__cmake_srcdir} ${${__cmake_contentNameLower}_BINARY_DIR} EXCLUDE_FROM_ALL)
|
|
endif()
|
|
get_property(subdir_import_targets DIRECTORY "${__cmake_srcdir}" PROPERTY BUILDSYSTEM_TARGETS)
|
|
foreach(subdir_target ${subdir_import_targets})
|
|
if(TARGET ${subdir_target})
|
|
get_target_property(subdir_target_type ${subdir_target} TYPE)
|
|
if(subdir_target_type STREQUAL "EXECUTABLE")
|
|
get_target_property(subdir_target_osx_arch ${subdir_target} OSX_ARCHITECTURES)
|
|
if (subdir_target_osx_arch)
|
|
if (NOT ${CMAKE_HOST_SYSTEM_PROCESSOR} IN_LIST subdir_target_osx_arch)
|
|
message("Added an executable target ${subdir_target} but it can not run natively on ${CMAKE_HOST_SYSTEM_PROCESSOR}, we will try to modify it")
|
|
endif()
|
|
endif()
|
|
endif()
|
|
set_target_properties(${subdir_target} PROPERTIES FOLDER "External")
|
|
set_target_properties(${subdir_target} PROPERTIES COMPILE_WARNING_AS_ERROR OFF)
|
|
endif()
|
|
endforeach()
|
|
set(CMAKE_SKIP_INSTALL_RULES FALSE)
|
|
endif()
|
|
|
|
unset(__cmake_srcdir)
|
|
unset(__cmake_contentDetails)
|
|
unset(__cmake_arg_SOURCE_SUBDIR)
|
|
endif()
|
|
endforeach()
|
|
# Prefix will be "__fcprefix__"
|
|
list(POP_BACK __cmake_fcCurrentVarsStack __cmake_original_verify_setting)
|
|
string(SUBSTRING "${__cmake_original_verify_setting}"
|
|
12 -1 __cmake_original_verify_setting
|
|
)
|
|
set(CMAKE_VERIFY_INTERFACE_HEADER_SETS ${__cmake_original_verify_setting})
|
|
|
|
# clear local variables to prevent leaking into the caller's scope
|
|
unset(__cmake_contentName)
|
|
unset(__cmake_contentNameLower)
|
|
unset(__cmake_contentNameUpper)
|
|
unset(__cmake_providerCommand)
|
|
unset(__cmake_original_verify_setting)
|
|
endmacro()
|