|
# 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 |
|
|