| # Test that an installation of the project can be located by find_package() call | |
| # with appropriate prefix settings. | |
| # | |
| # Expects THRUST_BINARY_DIR to be set to an existing thrust build directory. | |
| cmake_minimum_required(VERSION 3.15) | |
| project(ThrustTestInstall CXX CUDA) | |
| # This will eventually get deleted recursively -- keep that in mind if modifying | |
| set(CMAKE_INSTALL_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/install_prefix/") | |
| function(do_manual_install) | |
| # Inspired by the VTK-m install tests, we can just glob up all of the | |
| # cmake_install.cmake, include (ie. run) them, and they'll effectively | |
| # install the project into the current value of CMAKE_INSTALL_PREFIX. | |
| # Gather all of the install files from Thrust's root: | |
| file(GLOB_RECURSE install_files | |
| LIST_DIRECTORIES False | |
| "${THRUST_BINARY_DIR}/cmake_install.cmake" | |
| ) | |
| message(STATUS "Locating install files...") | |
| foreach (install_file IN LISTS install_files) | |
| message(STATUS " * ${install_file}") | |
| endforeach() | |
| message(STATUS "Building install tree...") | |
| foreach(install_file IN LISTS install_files) | |
| include("${install_file}") | |
| endforeach() | |
| endfunction() | |
| function(do_cleanup) | |
| message(STATUS "Removing ${CMAKE_INSTALL_PREFIX}") | |
| file(REMOVE_RECURSE "${CMAKE_INSTALL_PREFIX}") | |
| endfunction() | |
| function(assert_boolean var_name expect) | |
| if (expect) | |
| if (NOT ${var_name}) | |
| message(FATAL_ERROR "'${var_name}' is false, expected true.") | |
| endif() | |
| else() | |
| if (${var_name}) | |
| message(FATAL_ERROR "'${var_name}' is true, expected false.") | |
| endif() | |
| endif() | |
| endfunction() | |
| function(assert_target target_name) | |
| if (NOT TARGET "${target_name}") | |
| message(FATAL_ERROR "Target '${target_name}' not defined.") | |
| endif() | |
| endfunction() | |
| function(find_installed_project) | |
| set(CMAKE_PREFIX_PATH "${CMAKE_INSTALL_PREFIX}") | |
| find_package(Thrust CONFIG COMPONENTS CPP CUDA) | |
| if (NOT Thrust_FOUND) | |
| message(FATAL_ERROR | |
| "find_package(Thrust) failed. " | |
| "CMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}" | |
| ) | |
| endif() | |
| # Test some internal config vars to check that this is the expected install: | |
| # TODO The cmake_path (3.19) command will provide more robust ways to do this | |
| # Escape regex special characters in the install prefix, see | |
| # https://gitlab.kitware.com/cmake/cmake/-/issues/18580 | |
| string(REGEX REPLACE "([][+.*()^])" "\\\\\\1" | |
| prefix_regex | |
| "${CMAKE_INSTALL_PREFIX}" | |
| ) | |
| if (NOT _THRUST_INCLUDE_DIR MATCHES "^${prefix_regex}") | |
| message(FATAL_ERROR | |
| "Found Thrust in unexpected location: " | |
| " * _THRUST_INCLUDE_DIR=${_THRUST_INCLUDE_DIR} " | |
| " * ExpectedPrefix=${CMAKE_INSTALL_DIR}" | |
| ) | |
| endif() | |
| if (NOT _CUB_INCLUDE_DIR MATCHES "^${prefix_regex}") | |
| message(FATAL_ERROR | |
| "Found CUB in unexpected location: " | |
| " * _CUB_INCLUDE_DIR=${_CUB_INCLUDE_DIR} " | |
| " * ExpectedPrefix=${CMAKE_INSTALL_DIR}" | |
| ) | |
| endif() | |
| thrust_create_target(Thrust) | |
| assert_target(Thrust) | |
| assert_target(CUB::CUB) | |
| assert_target(Thrust::CPP::Host) | |
| assert_target(Thrust::CUDA::Device) | |
| thrust_update_system_found_flags() | |
| assert_boolean(THRUST_CPP_FOUND TRUE) | |
| assert_boolean(THRUST_CUDA_FOUND TRUE) | |
| assert_boolean(THRUST_OMP_FOUND FALSE) | |
| assert_boolean(THRUST_TBB_FOUND FALSE) | |
| endfunction() | |
| do_cleanup() # Prepare for new installation | |
| do_manual_install() | |
| find_installed_project() | |
| do_cleanup() # Clean up if successful | |