Spaces:
Runtime error
Runtime error
| # For every public header, build a translation unit containing `#include <header>` | |
| # to let the compiler try to figure out warnings in that header if it is not otherwise | |
| # included in tests, and also to verify if the headers are modular enough. | |
| # .inl files are not globbed for, because they are not supposed to be used as public | |
| # entrypoints. | |
| foreach(thrust_target IN LISTS THRUST_TARGETS) | |
| thrust_get_target_property(config_host ${thrust_target} HOST) | |
| thrust_get_target_property(config_device ${thrust_target} DEVICE) | |
| thrust_get_target_property(config_prefix ${thrust_target} PREFIX) | |
| string(TOLOWER "${config_host}" host_lower) | |
| string(TOLOWER "${config_device}" device_lower) | |
| # GLOB ALL THE THINGS | |
| set(headers_globs thrust/*.h) | |
| set(headers_exclude_systems_globs thrust/system/*/*) | |
| set(headers_systems_globs | |
| thrust/system/${host_lower}/* | |
| thrust/system/${device_lower}/* | |
| ) | |
| set(headers_exclude_details_globs | |
| thrust/detail/* | |
| thrust/*/detail/* | |
| thrust/*/*/detail/* | |
| ) | |
| # Get all .h files... | |
| file(GLOB_RECURSE headers | |
| RELATIVE "${Thrust_SOURCE_DIR}/thrust" | |
| CONFIGURE_DEPENDS | |
| ${headers_globs} | |
| ) | |
| # ...then remove all system specific headers... | |
| file(GLOB_RECURSE headers_exclude_systems | |
| RELATIVE "${Thrust_SOURCE_DIR}/thrust" | |
| CONFIGURE_DEPENDS | |
| ${headers_exclude_systems_globs} | |
| ) | |
| list(REMOVE_ITEM headers ${headers_exclude_systems}) | |
| # ...then add all headers specific to the selected host and device systems back again... | |
| file(GLOB_RECURSE headers_systems | |
| RELATIVE ${Thrust_SOURCE_DIR}/thrust | |
| CONFIGURE_DEPENDS | |
| ${headers_systems_globs} | |
| ) | |
| list(APPEND headers ${headers_systems}) | |
| # ...and remove all the detail headers (also removing the detail headers from the selected systems). | |
| file(GLOB_RECURSE headers_exclude_details | |
| RELATIVE "${Thrust_SOURCE_DIR}/thrust" | |
| CONFIGURE_DEPENDS | |
| ${headers_exclude_details_globs} | |
| ) | |
| list(REMOVE_ITEM headers ${headers_exclude_details}) | |
| # List of headers that aren't implemented for all backends, but are implemented for CUDA. | |
| set(partially_implemented_CUDA | |
| async/copy.h | |
| async/for_each.h | |
| async/reduce.h | |
| async/sort.h | |
| async/transform.h | |
| event.h | |
| future.h | |
| ) | |
| # List of headers that aren't implemented for all backends, but are implemented for CPP. | |
| set(partially_implemented_CPP | |
| ) | |
| # List of headers that aren't implemented for all backends, but are implemented for TBB. | |
| set(partially_implemented_TBB | |
| ) | |
| # List of headers that aren't implemented for all backends, but are implemented for OMP. | |
| set(partially_implemented_OMP | |
| ) | |
| # List of all partially implemented headers. | |
| set(partially_implemented | |
| ${partially_implemented_CUDA} | |
| ${partially_implemented_CPP} | |
| ${partially_implemented_TBB} | |
| ${partially_implemented_OMP} | |
| ) | |
| list(REMOVE_DUPLICATES partially_implemented) | |
| set(headertest_srcs) | |
| foreach (header IN LISTS headers) | |
| if ("${header}" IN_LIST partially_implemented) | |
| # This header is partially implemented on _some_ backends... | |
| if (NOT "${header}" IN_LIST partially_implemented_${config_device}) | |
| # ...but not on the selected one. | |
| continue() | |
| endif() | |
| endif() | |
| set(headertest_src_ext .cpp) | |
| if ("CUDA" STREQUAL "${config_device}") | |
| set(headertest_src_ext .cu) | |
| endif() | |
| set(headertest_src "headers/${config_prefix}/${header}${headertest_src_ext}") | |
| configure_file("${Thrust_SOURCE_DIR}/cmake/header_test.in" "${headertest_src}") | |
| list(APPEND headertest_srcs "${headertest_src}") | |
| endforeach() | |
| set(headertest_target ${config_prefix}.headers) | |
| add_library(${headertest_target} OBJECT ${headertest_srcs}) | |
| target_link_libraries(${headertest_target} PUBLIC ${thrust_target}) | |
| thrust_clone_target_properties(${headertest_target} ${thrust_target}) | |
| add_dependencies(${config_prefix}.all ${headertest_target}) | |
| endforeach() | |