76 lines
2.2 KiB
CMake
76 lines
2.2 KiB
CMake
|
|
# project_name: The name of the project when calling `find_package`. Case sensitive.
|
||
|
|
# `PACKAGE_FILEBASE` the name of the project in the config files, ie. ${PACKAGE_FILEBASE}-config.cmake.
|
||
|
|
# `PACKAGE_PATH` the absolute path to the project's CMake package config files.
|
||
|
|
function(cccl_add_subdir_helper project_name)
|
||
|
|
set(options)
|
||
|
|
set(
|
||
|
|
oneValueArgs
|
||
|
|
PACKAGE_PATH
|
||
|
|
PACKAGE_FILEBASE
|
||
|
|
REQUIRED_COMPONENTS
|
||
|
|
OPTIONAL_COMPONENTS
|
||
|
|
)
|
||
|
|
set(multiValueArgs)
|
||
|
|
cmake_parse_arguments(
|
||
|
|
CCCL_SUBDIR
|
||
|
|
"${options}"
|
||
|
|
"${oneValueArgs}"
|
||
|
|
"${multiValueArgs}"
|
||
|
|
${ARGN}
|
||
|
|
)
|
||
|
|
|
||
|
|
if (NOT DEFINED CCCL_SUBDIR_PACKAGE_FILEBASE)
|
||
|
|
string(TOLOWER "${project_name}" CCCL_SUBDIR_PACKAGE_FILEBASE)
|
||
|
|
endif()
|
||
|
|
|
||
|
|
if (NOT DEFINED CCCL_SUBDIR_PACKAGE_PATH)
|
||
|
|
set(
|
||
|
|
CCCL_SUBDIR_PACKAGE_PATH
|
||
|
|
"${CCCL_SOURCE_DIR}/lib/cmake/${CCCL_SUBDIR_PACKAGE_FILEBASE}"
|
||
|
|
)
|
||
|
|
endif()
|
||
|
|
|
||
|
|
set(
|
||
|
|
package_prefix
|
||
|
|
"${CCCL_SUBDIR_PACKAGE_PATH}/${CCCL_SUBDIR_PACKAGE_FILEBASE}"
|
||
|
|
)
|
||
|
|
|
||
|
|
set(CMAKE_FIND_PACKAGE_NAME ${project_name})
|
||
|
|
set(${CMAKE_FIND_PACKAGE_NAME}_FIND_COMPONENTS)
|
||
|
|
if (DEFINED CCCL_SUBDIR_REQUIRED_COMPONENTS)
|
||
|
|
list(
|
||
|
|
APPEND ${CMAKE_FIND_PACKAGE_NAME}_FIND_COMPONENTS
|
||
|
|
${CCCL_SUBDIR_REQUIRED_COMPONENTS}
|
||
|
|
)
|
||
|
|
foreach (component IN LISTS CCCL_SUBDIR_REQUIRED_COMPONENTS)
|
||
|
|
set(${CMAKE_FIND_PACKAGE_NAME}_FIND_REQUIRED_${component} TRUE)
|
||
|
|
endforeach()
|
||
|
|
endif()
|
||
|
|
|
||
|
|
if (DEFINED CCCL_SUBDIR_OPTIONAL_COMPONENTS)
|
||
|
|
list(
|
||
|
|
APPEND ${CMAKE_FIND_PACKAGE_NAME}_FIND_COMPONENTS
|
||
|
|
${CCCL_SUBDIR_OPTIONAL_COMPONENTS}
|
||
|
|
)
|
||
|
|
endif()
|
||
|
|
|
||
|
|
# This effectively does a `find_package` actually going through the find_package
|
||
|
|
# machinery. Using `find_package` works for the first configure, but creates
|
||
|
|
# inconsistencies during subsequent configurations when using CPM..
|
||
|
|
#
|
||
|
|
# More details are in the discussion at
|
||
|
|
# https://github.com/NVIDIA/libcudacxx/pull/242#discussion_r794003857
|
||
|
|
include("${package_prefix}-config-version.cmake")
|
||
|
|
include("${package_prefix}-config.cmake")
|
||
|
|
|
||
|
|
if (${project_name}_FOUND)
|
||
|
|
# Set the dir var so that later `find_package` calls work as expected.
|
||
|
|
set(
|
||
|
|
${project_name}_DIR
|
||
|
|
"${CCCL_SUBDIR_PACKAGE_PATH}"
|
||
|
|
CACHE PATH
|
||
|
|
"Path to ${project_name} package"
|
||
|
|
)
|
||
|
|
endif()
|
||
|
|
endfunction()
|