# # This file defines the `thrust_build_compiler_targets()` function, which # creates the following interface targets: # # thrust.compiler_interface # - Interface target providing compiler-specific options needed to build # Thrust's tests, examples, etc. # # thrust.promote_cudafe_warnings # - Interface target that adds warning promotion for NVCC cudafe invocations. # - Only exists to work around github issue #1174 on tbb.cuda configurations. # - May be combined with thrust.compiler_interface when #1174 is fully resolved. function(thrust_build_compiler_targets) set(cxx_compile_definitions) set(cxx_compile_options) thrust_update_system_found_flags() if (THRUST_TBB_FOUND) # There's a ton of these in the TBB backend, even though the code is correct. # TODO: silence these warnings in code instead append_option_if_available("-Wno-unused-parameter" cxx_compile_options) endif() if ("MSVC" STREQUAL "${CMAKE_CXX_COMPILER_ID}") # TODO Enable /Wall instead of W3 append_option_if_available("/W3" cxx_compile_options) # Treat all warnings as errors: append_option_if_available("/WX" cxx_compile_options) # Disabled loss-of-data conversion warnings. # TODO Re-enable. append_option_if_available("/wd4244" cxx_compile_options) append_option_if_available("/wd4267" cxx_compile_options) # Suppress numeric conversion-to-bool warnings. # TODO Re-enable. append_option_if_available("/wd4800" cxx_compile_options) # Disable warning about applying unary operator- to unsigned type. append_option_if_available("/wd4146" cxx_compile_options) # MSVC STL assumes that `allocator_traits`'s allocator will use raw pointers, # and the `__DECLSPEC_ALLOCATOR` macro causes issues with thrust's universal # allocators: # warning C4494: 'std::allocator_traits<_Alloc>::allocate' : # Ignoring __declspec(allocator) because the function return type is not # a pointer or reference # See https://github.com/microsoft/STL/issues/696 append_option_if_available("/wd4494" cxx_compile_options) # Some of the async tests require /bigobj to fit all their sections into the # object files: append_option_if_available("/bigobj" cxx_compile_options) # "Oh right, this is Visual Studio." list(APPEND cxx_compile_definitions "NOMINMAX") else() append_option_if_available("-Werror" cxx_compile_options) append_option_if_available("-Wall" cxx_compile_options) append_option_if_available("-Wextra" cxx_compile_options) append_option_if_available("-Winit-self" cxx_compile_options) append_option_if_available("-Woverloaded-virtual" cxx_compile_options) append_option_if_available("-Wcast-qual" cxx_compile_options) append_option_if_available("-Wno-cast-align" cxx_compile_options) append_option_if_available("-Wno-long-long" cxx_compile_options) append_option_if_available("-Wno-variadic-macros" cxx_compile_options) append_option_if_available("-Wno-unused-function" cxx_compile_options) append_option_if_available("-Wno-unused-variable" cxx_compile_options) endif() if ("GNU" STREQUAL "${CMAKE_CXX_COMPILER_ID}") if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.5) # In GCC 4.4, the CUDA backend's kernel launch templates cause # impossible-to-decipher "'' is used uninitialized in this # function" warnings, so we disable uninitialized variable warnings. append_option_if_available("-Wno-uninitialized" cxx_compile_options) endif() if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 4.5) # This isn't available until GCC 4.3, and misfires on TMP code until # GCC 4.5. append_option_if_available("-Wlogical-op" cxx_compile_options) endif() if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 7.3) # GCC 7.3 complains about name mangling changes due to `noexcept` # becoming part of the type system; we don't care. append_option_if_available("-Wno-noexcept-type" cxx_compile_options) endif() endif() if (("Clang" STREQUAL "${CMAKE_CXX_COMPILER_ID}") OR ("XL" STREQUAL "${CMAKE_CXX_COMPILER_ID}")) # xlC and Clang warn about unused parameters in uninstantiated templates. # This causes xlC to choke on the OMP backend, which is mostly #ifdef'd out # (and thus has unused parameters) when you aren't using it. append_option_if_available("-Wno-unused-parameters" cxx_compile_options) endif() if ("Clang" STREQUAL "${CMAKE_CXX_COMPILER_ID}") # -Wunneeded-internal-declaration misfires in the unit test framework # on older versions of Clang. append_option_if_available("-Wno-unneeded-internal-declaration" cxx_compile_options) endif() if ("Feta" STREQUAL "${CMAKE_CUDA_COMPILER_ID}") # Today: # * NVCC accepts CUDA C++ in .cu files but not .cpp files. # * Feta accepts CUDA C++ in .cpp files but not .cu files. # TODO: This won't be necessary in the future. list(APPEND cxx_compile_options -cppsuffix=cu) endif() add_library(thrust.compiler_interface INTERFACE) foreach (cxx_option IN LISTS cxx_compile_options) target_compile_options(thrust.compiler_interface INTERFACE $<$:${cxx_option}> $<$,$>:${cxx_option}> # Only use -Xcompiler with NVCC, not Feta. # # CMake can't split genexs, so this can't be formatted better :( # This is: # if (using CUDA and CUDA_COMPILER is NVCC) add -Xcompiler=opt: $<$,$>:-Xcompiler=${cxx_option}> ) endforeach() foreach (cxx_definition IN LISTS cxx_compile_definitions) # Add these for both CUDA and CXX targets: target_compile_definitions(thrust.compiler_interface INTERFACE ${cxx_definition} ) endforeach() # Display warning numbers from nvcc cudafe errors: target_compile_options(thrust.compiler_interface INTERFACE # If using CUDA w/ NVCC... $<$,$>:-Xcudafe=--display_error_number> ) # This is kept separate for Github issue #1174. add_library(thrust.promote_cudafe_warnings INTERFACE) target_compile_options(thrust.promote_cudafe_warnings INTERFACE $<$,$>:-Xcudafe=--promote_warnings> ) endfunction()