LIVE / thrust /examples /CMakeLists.txt
Xu Ma
update
1c3c0d9
raw
history blame
5.59 kB
# Setup FileCheck if requested and available:
option(THRUST_ENABLE_EXAMPLE_FILECHECK
"Check example output with the LLVM FileCheck utility."
OFF
)
set(filecheck_data_path "${Thrust_SOURCE_DIR}/internal/test")
if (THRUST_ENABLE_EXAMPLE_FILECHECK)
# TODO this should go into a find module
find_program(THRUST_FILECHECK_EXECUTABLE
DOC "Path to the LLVM FileCheck utility."
NAMES
FileCheck
FileCheck-3.9
FileCheck-4.0
FileCheck-5.0
FileCheck-6.0
FileCheck-7
FileCheck-8
FileCheck-9
)
if (NOT THRUST_FILECHECK_EXECUTABLE)
message(FATAL_ERROR
"Could not find the LLVM FileCheck utility. Set THRUST_FILECHECK_EXECUTABLE manually, "
"or disable THRUST_ENABLE_EXAMPLE_FILECHECK."
)
endif()
execute_process(
COMMAND "${THRUST_FILECHECK_EXECUTABLE}" "${filecheck_data_path}/thrust.sanity.filecheck"
INPUT_FILE "${Thrust_SOURCE_DIR}/cmake/sanity"
RESULT_VARIABLE exit_code
)
if (0 EQUAL exit_code)
message(STATUS "FileCheck enabled: ${THRUST_FILECHECK_EXECUTABLE}")
else()
message(FATAL_ERROR
"The current THRUST_FILECHECK_EXECUTABLE ('${THRUST_FILECHECK_EXECUTABLE}') "
"does not seem to be a valid FileCheck executable."
)
endif()
endif()
# Create meta targets that build all examples for a single configuration:
foreach(thrust_target IN LISTS THRUST_TARGETS)
thrust_get_target_property(config_prefix ${thrust_target} PREFIX)
set(config_meta_target ${config_prefix}.examples)
add_custom_target(${config_meta_target})
add_dependencies(${config_prefix}.all ${config_meta_target})
endforeach()
# Update flags to reflect RDC options. See note in ThrustCudaConfig.cmake --
# these flag variables behave unintuitively:
if (THRUST_ENABLE_EXAMPLES_WITH_RDC)
set(CMAKE_CUDA_FLAGS "${THRUST_CUDA_FLAGS_BASE} ${THRUST_CUDA_FLAGS_RDC}")
else()
set(CMAKE_CUDA_FLAGS "${THRUST_CUDA_FLAGS_BASE} ${THRUST_CUDA_FLAGS_NO_RDC}")
endif()
## thrust_add_example
#
# Add an example executable and register it with ctest.
#
# target_name_var: Variable name to overwrite with the name of the example
# target. Useful for post-processing target information per-backend.
# example_name: The name of the example minus "<config_prefix>.example." For
# instance, examples/vector.cu will be "vector", and examples/cuda/copy.cu
# would be "cuda.copy".
# example_src: The source file that implements the example.
# thrust_target: The reference thrust target with configuration information.
#
function(thrust_add_example target_name_var example_name example_src thrust_target)
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)
# Wrap the .cu file in .cpp for non-CUDA backends
if ("CUDA" STREQUAL "${config_device}")
set(real_example_src "${example_src}")
else()
thrust_wrap_cu_in_cpp(real_example_src "${example_src}" ${thrust_target})
endif()
# The actual name of the test's target:
set(example_target ${config_prefix}.example.${example_name})
set(${target_name_var} ${example_target} PARENT_SCOPE)
# Related target names:
set(config_meta_target ${config_prefix}.examples)
set(example_meta_target thrust.all.example.${example_name})
add_executable(${example_target} "${real_example_src}")
target_link_libraries(${example_target} ${thrust_target})
target_include_directories(${example_target} PRIVATE "${Thrust_SOURCE_DIR}/examples")
thrust_clone_target_properties(${example_target} ${thrust_target})
# Add to the active configuration's meta target
add_dependencies(${config_meta_target} ${example_target})
# Meta target that builds examples with this name for all configurations:
if (NOT TARGET ${example_meta_target})
add_custom_target(${example_meta_target})
endif()
add_dependencies(${example_meta_target} ${example_target})
if ("CUDA" STREQUAL "${config_device}" AND
THRUST_ENABLE_EXAMPLES_WITH_RDC)
thrust_enable_rdc_for_cuda_target(${example_target})
endif()
# Get the name of FileCheck input by stripping out the config name.
# (e.g. "thrust.cpp.cuda.cpp14.example.xxx" -> "thrust.example.xxx.filecheck")
string(REPLACE "${config_prefix}" "thrust"
filecheck_reference_file
"${example_target}.filecheck"
)
add_test(NAME ${example_target}
COMMAND "${CMAKE_COMMAND}"
"-DEXAMPLE_EXECUTABLE=$<TARGET_FILE:${example_target}>"
"-DFILECHECK_ENABLED=${THRUST_ENABLE_EXAMPLE_FILECHECK}"
"-DFILECHECK_EXECUTABLE=${THRUST_FILECHECK_EXECUTABLE}"
"-DREFERENCE_FILE=${filecheck_data_path}/${filecheck_reference_file}"
-P "${Thrust_SOURCE_DIR}/cmake/ThrustRunExample.cmake"
)
# Run OMP/TBB tests in serial. Multiple OMP processes will massively
# oversubscribe the machine with GCC's OMP, and we want to test these with
# the full CPU available to each unit test.
set(config_systems ${config_host} ${config_device})
if (("OMP" IN_LIST config_systems) OR ("TBB" IN_LIST config_systems))
set_tests_properties(${example_target} PROPERTIES RUN_SERIAL ON)
endif()
endfunction()
file(GLOB example_srcs
RELATIVE "${CMAKE_CURRENT_LIST_DIR}"
CONFIGURE_DEPENDS
*.cu *.cpp
)
foreach(thrust_target IN LISTS THRUST_TARGETS)
foreach(example_src IN LISTS example_srcs)
get_filename_component(example_name "${example_src}" NAME_WLE)
thrust_add_example(example_target ${example_name} "${example_src}" ${thrust_target})
endforeach()
endforeach()
add_subdirectory(cmake)
add_subdirectory(cuda)