File size: 5,596 Bytes
8ae5fc5 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | #
# This file defines the `cub_build_compiler_targets()` function, which
# creates the following interface targets:
#
# cub.compiler_interface
# - Interface target providing compiler-specific options needed to build
# Thrust's tests, examples, etc.
function(cub_build_compiler_targets)
set(cxx_compile_definitions)
set(cxx_compile_options)
set(cuda_compile_options)
if ("MSVC" STREQUAL "${CMAKE_CXX_COMPILER_ID}")
append_option_if_available("/W4" cxx_compile_options)
append_option_if_available("/WX" cxx_compile_options)
# Suppress overly-pedantic/unavoidable warnings brought in with /W4:
# C4324: structure was padded due to alignment specifier
append_option_if_available("/wd4324" cxx_compile_options)
# C4127: conditional expression is constant
# This can be fixed with `if constexpr` when available, but there's no way
# to silence these pre-C++17.
# TODO We should have per-dialect interface targets so we can leave these
# warnings enabled on C++17:
append_option_if_available("/wd4127" cxx_compile_options)
# C4505: unreferenced local function has been removed
# The CUDA `host_runtime.h` header emits this for
# `__cudaUnregisterBinaryUtil`.
append_option_if_available("/wd4505" cxx_compile_options)
# C4706: assignment within conditional expression
# MSVC doesn't provide an opt-out for this warning when the assignment is
# intentional. Clang will warn for these, but suppresses the warning when
# double-parentheses are used around the assignment. We'll let Clang catch
# unintentional assignments and suppress all such warnings on MSVC.
append_option_if_available("/wd4706" cxx_compile_options)
# Some tests require /bigobj to fit everything into their object files:
append_option_if_available("/bigobj" cxx_compile_options)
else()
append_option_if_available("-Wreorder" cuda_compile_options)
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("-Wpointer-arith" cxx_compile_options)
append_option_if_available("-Wunused-local-typedef" cxx_compile_options)
append_option_if_available("-Wvla" cxx_compile_options)
# Disable GNU extensions (flag is clang only)
append_option_if_available("-Wgnu" cxx_compile_options)
# Calling a variadic macro with zero args is a GNU extension until C++20,
# but the THRUST_PP_ARITY macro is used with zero args. Need to see if this
# is a real problem worth fixing.
append_option_if_available("-Wno-gnu-zero-variadic-macro-arguments" cxx_compile_options)
# This complains about functions in CUDA system headers when used with nvcc.
append_option_if_available("-Wno-unused-function" cxx_compile_options)
endif()
if ("GNU" STREQUAL "${CMAKE_CXX_COMPILER_ID}")
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 ("Intel" STREQUAL "${CMAKE_CXX_COMPILER_ID}")
# Disable warning that inlining is inhibited by compiler thresholds.
append_option_if_available("-diag-disable=11074" cxx_compile_options)
append_option_if_available("-diag-disable=11076" cxx_compile_options)
endif()
if ("Clang" STREQUAL "${CMAKE_CXX_COMPILER_ID}")
option(CUB_ENABLE_CT_PROFILING "Enable compilation time profiling" OFF)
if (CUB_ENABLE_CT_PROFILING)
append_option_if_available("-ftime-trace" cxx_compile_options)
endif()
endif()
if ("NVCXX" STREQUAL "${CMAKE_CUDA_COMPILER_ID}")
list(APPEND cxx_compile_options -Mnodaz)
# TODO: Managed memory is currently not supported on windows with WSL
list(APPEND cxx_compile_options -gpu=nomanaged)
endif()
add_library(cub.compiler_interface INTERFACE)
foreach (cxx_option IN LISTS cxx_compile_options)
target_compile_options(cub.compiler_interface INTERFACE
$<$<COMPILE_LANGUAGE:CXX>:${cxx_option}>
$<$<COMPILE_LANG_AND_ID:CUDA,NVCXX>:${cxx_option}>
# Only use -Xcompiler with NVCC, not NVC++.
#
# 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:
$<$<COMPILE_LANG_AND_ID:CUDA,NVIDIA>:-Xcompiler=${cxx_option}>
)
endforeach()
foreach (cuda_option IN LISTS cuda_compile_options)
target_compile_options(cub.compiler_interface INTERFACE
$<$<COMPILE_LANG_AND_ID:CUDA,NVIDIA>:${cuda_option}>
)
endforeach()
# Add these for both CUDA and CXX targets:
target_compile_definitions(cub.compiler_interface INTERFACE
${cxx_compile_definitions}
)
# Promote warnings and display diagnostic numbers for nvcc:
target_compile_options(cub.compiler_interface INTERFACE
# If using CUDA w/ NVCC...
# Display diagnostic numbers.
$<$<COMPILE_LANG_AND_ID:CUDA,NVIDIA>:-Xcudafe=--display_error_number>
# Promote warnings.
$<$<COMPILE_LANG_AND_ID:CUDA,NVIDIA>:-Xcudafe=--promote_warnings>
# Don't complain about deprecated GPU targets.
$<$<COMPILE_LANG_AND_ID:CUDA,NVIDIA>:-Wno-deprecated-gpu-targets>
)
endfunction()
|