@@ -2,8 +2,22 @@ cmake_minimum_required(VERSION 3.8)
22
33project (Thrust CXX )
44
5- list (INSERT CMAKE_MODULE_PATH 0 ${PROJECT_SOURCE_DIR} /cmake)
5+ # Default to a release build.
6+ if ("" STREQUAL "${CMAKE_BUILD_TYPE} " )
7+ set (CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Choose the type of build." FORCE )
8+
9+ set_property (
10+ CACHE CMAKE_BUILD_TYPE
11+ PROPERTY STRINGS Debug Release RelWithDebInfo MinSizeRel
12+ )
13+ endif ()
614
15+ # CONFIGURE_DEPENDS helper
16+ if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.12)
17+ set (CMAKE_CONFIGURE_DEPENDS CONFIGURE_DEPENDS)
18+ endif ()
19+
20+ list (INSERT CMAKE_MODULE_PATH 0 ${PROJECT_SOURCE_DIR} /cmake)
721include (AppendOptionIfAvailable )
822
923file (READ "thrust/version.h" THRUST_VERSION_HEADER )
@@ -48,8 +62,26 @@ endif ()
4862
4963add_definitions (-DTHRUST_DEVICE_SYSTEM=THRUST_DEVICE_SYSTEM_${THRUST_DEVICE_SYSTEM} )
5064
65+ set (CMAKE_CXX_STANDARD 98 CACHE STRING "The C++ version to be used." )
66+ set (CMAKE_CXX_EXTENSIONS OFF )
67+
68+ message ("-- C++ Standard version: ${CMAKE_CXX_STANDARD} " )
69+
5170if ("CUDA" STREQUAL "${THRUST_DEVICE_SYSTEM} " )
71+ if (NOT "${CMAKE_CUDA_HOST_COMPILER} " STREQUAL "" )
72+ unset (CMAKE_CUDA_HOST_COMPILER CACHE )
73+ message (FATAL_ERROR "Thrust tests and examples require the C++ compiler"
74+ " and the CUDA host compiler to be the same; to set this compiler, please"
75+ " use the CMAKE_CXX_COMPILER variable, not the CMAKE_CUDA_HOST_COMPILER"
76+ " variable." )
77+ endif ()
78+ set (CMAKE_CUDA_HOST_COMPILER ${CMAKE_CXX_COMPILER} )
79+
5280 enable_language (CUDA )
81+
82+ # force CUDA C++ standard to be the same as the C++ standard used
83+ unset (CMAKE_CUDA_STANDARD CACHE )
84+ set (CMAKE_CUDA_STANDARD ${CMAKE_CXX_STANDARD} )
5385endif ()
5486
5587if ("OMP" STREQUAL "${THRUST_DEVICE_SYSTEM} " )
@@ -70,6 +102,10 @@ if ("TBB" STREQUAL "${THRUST_DEVICE_SYSTEM}")
70102 set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${TBB_LD_FLAGS} " )
71103 set (THRUST_ADDITIONAL_LIBRARIES "${TBB_LIBRARIES} " )
72104 endif ()
105+
106+ # there's a ton of these in the TBB backend, even though the code is correct
107+ # TODO: silence these warnings in code instead
108+ append_option_if_available ("-Wno-unused-parameter" THRUST_CXX_WARNINGS )
73109endif ()
74110
75111if ("MSVC" STREQUAL "${CMAKE_CXX_COMPILER_ID} " )
@@ -86,32 +122,33 @@ endif ()
86122
87123if ("MSVC" STREQUAL "${CMAKE_CXX_COMPILER_ID} " )
88124 # TODO Enable /Wall
89- append_option_if_available (CXX "/WX" THRUST_OPTIONS_WARNINGS )
125+ append_option_if_available ("/WX" THRUST_CXX_WARNINGS )
90126
91127 # Disabled loss-of-data conversion warnings.
92128 # TODO Re-enable.
93- append_option_if_available (CXX "/wd4244" THRUST_OPTIONS_WARNINGS )
94- append_option_if_available (CXX "/wd4267" THRUST_OPTIONS_WARNINGS )
129+ append_option_if_available ("/wd4244" THRUST_CXX_WARNINGS )
130+ append_option_if_available ("/wd4267" THRUST_CXX_WARNINGS )
95131
96132 # Suppress numeric conversion-to-bool warnings.
97133 # TODO Re-enable.
98- append_option_if_available (CXX "/wd4800" THRUST_OPTIONS_WARNINGS )
134+ append_option_if_available ("/wd4800" THRUST_CXX_WARNINGS )
99135
100136 # Disable warning about applying unary operator- to unsigned type.
101- append_option_if_available (CXX "/wd4146" THRUST_OPTIONS_WARNINGS )
137+ append_option_if_available ("/wd4146" THRUST_CXX_WARNINGS )
102138
103139 set (THRUST_TREAT_FILE_AS_CXX "/TP" )
104140else ()
105- append_option_if_available (CXX "-Werror" THRUST_OPTIONS_WARNINGS )
106- append_option_if_available (CXX "-Wall" THRUST_O:TIONS_WARNINGS )
107- append_option_if_available (CXX "-Wextra" THRUST_OPTIONS_WARNINGS )
108- append_option_if_available (CXX "-Winit-self" THRUST_OPTIONS_WARNINGS )
109- append_option_if_available (CXX "-Woverloaded-virtual" THRUST_OPTIONS_WARNINGS )
110- append_option_if_available (CXX "-Wcast-qual" THRUST_OPTIONS_WARNINGS )
111- append_option_if_available (CXX "-Wno-cast-align" THRUST_OPTIONS_WARNINGS )
112- append_option_if_available (CXX "-Wno-long-long" THRUST_OPTIONS_WARNINGS )
113- append_option_if_available (CXX "-Wno-variadic-macros" THRUST_OPTIONS_WARNINGS )
114- append_option_if_available (CXX "-Wno-unused-function" THRUST_OPTIONS_WARNINGS )
141+ append_option_if_available ("-Werror" THRUST_CXX_WARNINGS )
142+ append_option_if_available ("-Wall" THRUST_CXX_WARNINGS )
143+ append_option_if_available ("-Wextra" THRUST_CXX_WARNINGS )
144+ append_option_if_available ("-Winit-self" THRUST_CXX_WARNINGS )
145+ append_option_if_available ("-Woverloaded-virtual" THRUST_CXX_WARNINGS )
146+ append_option_if_available ("-Wcast-qual" THRUST_CXX_WARNINGS )
147+ append_option_if_available ("-Wno-cast-align" THRUST_CXX_WARNINGS )
148+ append_option_if_available ("-Wno-long-long" THRUST_CXX_WARNINGS )
149+ append_option_if_available ("-Wno-variadic-macros" THRUST_CXX_WARNINGS )
150+ append_option_if_available ("-Wno-unused-function" THRUST_CXX_WARNINGS )
151+ append_option_if_available ("-Wno-unused-variable" THRUST_CXX_WARNINGS )
115152
116153 set (THRUST_TREAT_FILE_AS_CXX "-x c++" )
117154endif ()
@@ -121,19 +158,19 @@ if ("GNU" STREQUAL "${CMAKE_CXX_COMPILER_ID}")
121158 # In GCC 4.4, the CUDA backend's kernel launch templates cause
122159 # impossible-to-decipher "'<anonymous>' is used uninitialized in this
123160 # function" warnings, so we disable uninitialized variable warnings.
124- append_option_if_available (CXX "-Wno-uninitialized" THRUST_OPTIONS_WARNINGS )
161+ append_option_if_available ("-Wno-uninitialized" THRUST_CXX_WARNINGS )
125162 endif ()
126163
127164 if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 4.5)
128165 # This isn't available until GCC 4.3, and misfires on TMP code until
129166 # GCC 4.5.
130- append_option_if_available (CXX "-Wlogical-op" THRUST_OPTIONS_WARNINGS )
167+ append_option_if_available ("-Wlogical-op" THRUST_CXX_WARNINGS )
131168 endif ()
132169
133170 if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 7.3)
134171 # GCC 7.3 complains about name mangling changes due to `noexcept`
135172 # becoming part of the type system; we don't care.
136- append_option_if_available (CXX "-Wnoexcept-type" THRUST_OPTIONS_WARNINGS )
173+ append_option_if_available ("-Wnoexcept-type" THRUST_CXX_WARNINGS )
137174 endif ()
138175endif ()
139176
@@ -142,22 +179,135 @@ if (("Clang" STREQUAL "${CMAKE_CXX_COMPILER_ID}") OR
142179 # xlC and Clang warn about unused parameters in uninstantiated templates.
143180 # This causes xlC to choke on the OMP backend, which is mostly #ifdef'd out
144181 # (and thus has unused parameters) when you aren't using it.
145- append_option_if_available (CXX "-Wno-unused-parameters" THRUST_OPTIONS_WARNINGS )
182+ append_option_if_available ("-Wno-unused-parameters" THRUST_CXX_WARNINGS )
146183endif ()
147184
148185if ("Clang" STREQUAL "${CMAKE_CXX_COMPILER_ID} " )
149186 # -Wunneeded-internal-declaration misfires in the unit test framework
150187 # on older versions of Clang.
151- append_option_if_available (CXX "-Wno-unneeded-internal-declaration" THRUST_OPTIONS_WARNINGS )
188+ append_option_if_available ("-Wno-unneeded-internal-declaration" THRUST_CXX_WARNINGS )
152189endif ()
153190
191+ foreach (CXX_OPTION IN LISTS THRUST_CXX_WARNINGS)
192+ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXX_OPTION} " )
193+ endforeach ()
154194
155195if ("CUDA" STREQUAL "${THRUST_DEVICE_SYSTEM} " )
156- append_option_if_available (CUDA "-rdc=true" THRUST_OPTIONS_RDC )
196+ foreach (CXX_OPTION IN LISTS THRUST_CXX_WARNINGS)
197+ set (CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -Xcompiler=${CXX_OPTION} " )
198+ endforeach ()
157199endif ()
158200
159- set (THRUST_OPTIONS_DEBUG ${THRUST_OPTIONS_WARNINGS} )
160- set (THRUST_OPTIONS_RELEASE ${THRUST_OPTIONS_WARNINGS} )
201+ # For every public header, build a translation unit containing `#include <header>`
202+ # to let the compiler try to figure out warnings in that header if it is not otherwise
203+ # included in tests, and also to verify if the headers are modular enough.
204+ list (APPEND THRUST_HEADER_GLOBS thrust/*.h)
205+ list (APPEND THRUST_HEADER_EXCLUDE_SYSTEMS_GLOBS thrust/system/*/*)
206+
207+ string (TOLOWER ${THRUST_HOST_SYSTEM} THRUST_HOST_SYSTEM_LOWERCASE)
208+ list (APPEND THRUST_HEADER_SYSTEMS_GLOBS thrust/system/${THRUST_HOST_SYSTEM_LOWERCASE} /*)
209+
210+ string (TOLOWER ${THRUST_DEVICE_SYSTEM} THRUST_DEVICE_SYSTEM_LOWERCASE)
211+ list (APPEND THRUST_HEADER_SYSTEMS_GLOBS thrust/system/${THRUST_DEVICE_SYSTEM_LOWERCASE} /*)
212+
213+ list (APPEND THRUST_HEADER_EXCLUDE_DETAILS_GLOBS thrust/detail/*)
214+ list (APPEND THRUST_HEADER_EXCLUDE_DETAILS_GLOBS thrust/*/detail/*)
215+ list (APPEND THRUST_HEADER_EXCLUDE_DETAILS_GLOBS thrust/*/*/detail/*)
216+
217+ # Get all .h files...
218+ file (
219+ GLOB_RECURSE THRUST_HEADERS
220+ RELATIVE ${PROJECT_SOURCE_DIR} /thrust
221+ ${CMAKE_CONFIGURE_DEPENDS}
222+ ${THRUST_HEADER_GLOBS}
223+ )
224+
225+ # ...then remove all system specific headers...
226+ file (
227+ GLOB_RECURSE THRUST_HEADER_EXCLUDE_SYSTEMS
228+ RELATIVE ${PROJECT_SOURCE_DIR} /thrust
229+ ${CMAKE_CONFIGURE_DEPENDS}
230+ ${THRUST_HEADER_EXCLUDE_SYSTEMS_GLOBS}
231+ )
232+ list (REMOVE_ITEM THRUST_HEADERS ${THRUST_HEADER_EXCLUDE_SYSTEMS} )
233+
234+ # ...then add all headers specific to the selected host and device systems back again...
235+ file (
236+ GLOB_RECURSE THRUST_SYSTEMS_HEADERS
237+ RELATIVE ${PROJECT_SOURCE_DIR} /thrust
238+ ${CMAKE_CONFIGURE_DEPENDS}
239+ ${THRUST_HEADER_SYSTEMS_GLOBS}
240+ )
241+ list (APPEND THRUST_HEADERS ${THRUST_SYSTEMS_HEADERS} )
242+
243+ # ...and remove all the detail headers (also removing the detail headers from the selected systems).
244+ file (
245+ GLOB_RECURSE THRUST_HEADER_EXCLUDE_DETAILS
246+ RELATIVE ${PROJECT_SOURCE_DIR} /thrust
247+ ${CMAKE_CONFIGURE_DEPENDS}
248+ ${THRUST_HEADER_EXCLUDE_DETAILS_GLOBS}
249+ )
250+ list (REMOVE_ITEM THRUST_HEADERS ${THRUST_HEADER_EXCLUDE_DETAILS} )
251+
252+ # list of headers that aren't implemented for all backends, but are implemented for CUDA
253+ set (THRUST_PARTIALLY_IMPLEMENTED_HEADERS_CUDA
254+ async/copy.h
255+ async/for_each.h
256+ async/reduce.h
257+ async/sort.h
258+ async/transform.h
259+ event.h
260+ future.h
261+ )
262+
263+ # list of headers that aren't implemented for all backends, but are implemented for CPP
264+ set (THRUST_PARTIALLY_IMPLEMENTED_HEADERS_CPP
265+ )
266+
267+ # list of headers that aren't implemented for all backends, but are implemented for TBB
268+ set (THRUST_PARTIALLY_IMPLEMENTED_HEADERS_TBB
269+ )
270+
271+ # list of headers that aren't implemented for all backends, but are implemented for OMP
272+ set (THRUST_PARTIALLY_IMPLEMENTED_HEADERS_OMP
273+ )
274+
275+ # list of all partially implemented headers
276+ set (THRUST_PARTIALLY_IMPLEMENTED_HEADERS
277+ emptylistguard
278+ ${THRUST_PARTIALLY_IMPLEMENTED_HEADERS_CUDA}
279+ ${THRUST_PARTIALLY_IMPLEMENTED_HEADERS_CPP}
280+ ${THRUST_PARTIALLY_IMPLEMENTED_HEADERS_TBB}
281+ ${THRUST_PARTIALLY_IMPLEMENTED_HEADERS_OMP}
282+ )
283+
284+ list (REMOVE_DUPLICATES THRUST_PARTIALLY_IMPLEMENTED_HEADERS)
285+
286+ foreach (THRUST_HEADER IN LISTS THRUST_HEADERS)
287+ if ("${THRUST_HEADER} " IN_LIST THRUST_PARTIALLY_IMPLEMENTED_HEADERS)
288+ # this header is partially implemented on _some_ backends
289+ if (NOT "${THRUST_HEADER} " IN_LIST THRUST_PARTIALLY_IMPLEMENTED_HEADERS_${THRUST_DEVICE_SYSTEM} )
290+ # but not on the selected one
291+ continue ()
292+ endif ()
293+ endif ()
294+
295+ set (THRUST_HEADER_TEST_EXT .cpp)
296+ if ("CUDA" STREQUAL "${THRUST_DEVICE_SYSTEM} " )
297+ set (THRUST_HEADER_TEST_EXT .cu)
298+ endif ()
299+
300+ set (SOURCE_NAME headers/${THRUST_HEADER}${THRUST_HEADER_TEST_EXT} )
301+ configure_file (cmake/header_test.in ${SOURCE_NAME} )
302+
303+ list (APPEND THRUST_HEADER_TEST_SOURCES ${SOURCE_NAME} )
304+ endforeach ()
305+
306+ add_library (header-test OBJECT ${THRUST_HEADER_TEST_SOURCES} )
307+ target_include_directories (
308+ header-test
309+ PUBLIC ${PROJECT_SOURCE_DIR}
310+ )
161311
162312include (CTest )
163313enable_testing ()
@@ -192,20 +342,12 @@ elseif ("OMP" STREQUAL "${THRUST_DEVICE_SYSTEM}")
192342 list (APPEND THRUST_TEST_GLOBS testing/omp/*.cpp)
193343endif ()
194344
195- if (CMAKE_VERSION VERSION_LESS 3.12)
196- file (
197- GLOB THRUST_TESTS
198- RELATIVE ${PROJECT_SOURCE_DIR} /testing
199- ${THRUST_TEST_GLOBS}
200- CONFIGURE_DEPENDS
201- )
202- else ()
203- file (
204- GLOB THRUST_TESTS
205- RELATIVE ${PROJECT_SOURCE_DIR} /testing
206- ${THRUST_TEST_GLOBS}
207- )
208- endif ()
345+ file (
346+ GLOB THRUST_TESTS
347+ RELATIVE ${PROJECT_SOURCE_DIR} /testing
348+ ${CMAKE_CONFIGURE_DEPENDS}
349+ ${THRUST_TEST_GLOBS}
350+ )
209351
210352# list of tests that aren't implemented for all backends, but are implemented for CUDA
211353set (THRUST_PARTIALLY_IMPLEMENTED_CUDA
@@ -282,10 +424,6 @@ foreach (THRUST_TEST_SOURCE IN LISTS THRUST_TESTS)
282424 ${PROJECT_SOURCE_DIR} /testing/${THRUST_TEST_SOURCE}
283425 )
284426
285- target_compile_options (${THRUST_TEST}
286- PRIVATE "$<$<CONFIG :DEBUG >:${THRUST_OPTIONS_DEBUG} >"
287- "$<$<CONFIG :RELEASE >:${THRUST_OPTIONS_RELEASE} >" )
288-
289427 target_include_directories (
290428 ${THRUST_TEST}
291429 PUBLIC ${PROJECT_SOURCE_DIR}
@@ -310,10 +448,6 @@ foreach (THRUST_TEST_SOURCE IN LISTS THRUST_TESTS)
310448 ${PROJECT_SOURCE_DIR} /testing/${THRUST_TEST_SOURCE}
311449 )
312450
313- target_compile_options (${THRUST_TEST_RDC}
314- PRIVATE "$<$<CONFIG :DEBUG >:${THRUST_OPTIONS_DEBUG} ${THRUST_OPTIONS_RDC} >"
315- "$<$<CONFIG :RELEASE >:${THRUST_OPTIONS_RELEASE} ${THRUST_OPTIONS_RDC} >" )
316-
317451 target_include_directories (
318452 ${THRUST_TEST_RDC}
319453 PUBLIC ${PROJECT_SOURCE_DIR}
@@ -324,6 +458,9 @@ foreach (THRUST_TEST_SOURCE IN LISTS THRUST_TESTS)
324458 thrust_testframework
325459 ${THRUST_ADDITIONAL_LIBRARIES} )
326460
461+ set_target_properties (${THRUST_TEST_RDC}
462+ PROPERTIES CUDA_SEPARABLE_COMPILATION ON )
463+
327464 if (THRUST_TEST_ADD_TO_CTEST)
328465 add_test (${THRUST_TEST_RDC} ${THRUST_TEST_RDC} )
329466 endif ()
@@ -384,10 +521,6 @@ foreach (THRUST_EXAMPLE_SOURCE IN LISTS THRUST_EXAMPLES)
384521 ${PROJECT_SOURCE_DIR} /examples/${THRUST_EXAMPLE_SOURCE}
385522 )
386523
387- target_compile_options (${THRUST_EXAMPLE}
388- PRIVATE "$<$<CONFIG :DEBUG >:${THRUST_OPTIONS_DEBUG} >"
389- "$<$<CONFIG :RELEASE >:${THRUST_OPTIONS_RELEASE} >" )
390-
391524 target_include_directories (
392525 ${THRUST_EXAMPLE}
393526 PUBLIC ${PROJECT_SOURCE_DIR}
@@ -407,10 +540,6 @@ foreach (THRUST_EXAMPLE_SOURCE IN LISTS THRUST_EXAMPLES)
407540 ${PROJECT_SOURCE_DIR} /examples/${THRUST_EXAMPLE_SOURCE}
408541 )
409542
410- target_compile_options (${THRUST_EXAMPLE_RDC}
411- PRIVATE "$<$<CONFIG :DEBUG >:${THRUST_OPTIONS_DEBUG} ${THRUST_OPTIONS_RDC} >"
412- "$<$<CONFIG :RELEASE >:${THRUST_OPTIONS_RELEASE} ${THRUST_OPTIONS_RDC} >" )
413-
414543 target_include_directories (
415544 ${THRUST_EXAMPLE_RDC}
416545 PUBLIC ${PROJECT_SOURCE_DIR}
@@ -420,6 +549,9 @@ foreach (THRUST_EXAMPLE_SOURCE IN LISTS THRUST_EXAMPLES)
420549 target_link_libraries (${THRUST_EXAMPLE_RDC}
421550 ${THRUST_ADDITIONAL_LIBRARIES} )
422551
552+ set_target_properties (${THRUST_EXAMPLE_RDC}
553+ PROPERTIES CUDA_SEPERABLE_COMPILATION ON )
554+
423555 add_test (${THRUST_EXAMPLE_RDC} ${THRUST_EXAMPLE_RDC} )
424556 endif ()
425557endforeach ()
0 commit comments