diff options
Diffstat (limited to 'cmake/CompilerFlags.cmake')
| -rw-r--r-- | cmake/CompilerFlags.cmake | 217 |
1 files changed, 217 insertions, 0 deletions
diff --git a/cmake/CompilerFlags.cmake b/cmake/CompilerFlags.cmake new file mode 100644 index 000000000..2a9988d4e --- /dev/null +++ b/cmake/CompilerFlags.cmake @@ -0,0 +1,217 @@ +# +# Given a list of flags, add those which the C++ compiler supports to the target +# +include(CheckCXXCompilerFlag) +function(add_supported_cxx_flags target) + cmake_parse_arguments(ARG "PRIVATE;PUBLIC;INTERFACE" "" "" ${ARGN}) + set(flags ${ARG_UNPARSED_ARGUMENTS}) + if(ARG_PRIVATE) + set(private PRIVATE) + endif() + if(ARG_PUBLIC) + set(public PUBLIC) + endif() + if(ARG_INTERFACE) + set(interface INTERFACE) + endif() + + foreach(flag ${flags}) + # remove the `no-` prefix from warnings because gcc doesn't treat it as an + # error on its own + string(REGEX REPLACE "\\-Wno\\-(.+)" "-W\\1" flag_to_test "${flag}") + string( + REGEX REPLACE + "[^a-zA-Z0-9]+" + "_" + test_name + "CXXFLAG_${flag_to_test}" + ) + check_cxx_compiler_flag("${flag_to_test}" ${test_name}) + if(${test_name}) + target_compile_options( + ${target} + ${private} + ${public} + ${interface} + ${flag} + ) + endif() + endforeach() +endfunction() + +# +# Given a list of linker flags, add those which the compiler supports to the +# target +# +include(CheckLinkerFlag) +function(add_supported_cxx_linker_flags target) + cmake_parse_arguments(ARG "PRIVATE;PUBLIC;INTERFACE;BEFORE" "" "" ${ARGN}) + set(flags ${ARG_UNPARSED_ARGUMENTS}) + if(ARG_BEFORE) + set(before BEFORE) + endif() + if(ARG_PRIVATE) + set(private PRIVATE) + endif() + if(ARG_PUBLIC) + set(public PUBLIC) + endif() + if(ARG_INTERFACE) + set(interface INTERFACE) + endif() + + foreach(flag ${flags}) + string( + REGEX REPLACE + "[^a-zA-Z0-9]+" + "_" + test_name + "CXXLINKFLAG_${flag}" + ) + check_linker_flag(CXX "${flag}" ${test_name}) + if(${test_name}) + target_link_options( + ${target} + ${before} + ${private} + ${public} + ${interface} + ${flag} + ) + endif() + endforeach() +endfunction() + +# +# Add our default compiler flags to a target +# +# Pass USE_EXTRA_WARNINGS to enable -WExtra or /W3 +# +function(set_default_compile_options target) + cmake_parse_arguments( + ARG + "USE_EXTRA_WARNINGS;USE_FEWER_WARNINGS" + "" + "" + ${ARGN} + ) + + set(warning_flags) + if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") + list( + APPEND + warning_flags + -Wall + # Disabled warnings: + -Wno-switch + -Wno-parentheses + -Wno-unused-local-typedefs + -Wno-class-memaccess + -Wno-assume + -Wno-reorder + -Wno-invalid-offsetof + -Wno-newline-eof + -Wno-return-std-move + # Enabled warnings: + # If a function returns an address/reference to a local, we want it to + # produce an error, because it probably means something very bad. + -Werror=return-local-addr + # Some warnings which are on by default in MSVC + -Wnarrowing + ) + if(ARG_USE_EXTRA_WARNINGS) + list(APPEND warning_flags -Wextra) + endif() + if(ARG_USE_FEWER_WARNINGS) + list( + APPEND + warning_flags + -Wno-class-memaccess + -Wno-unused-variable + -Wno-unused-parameter + -Wno-sign-compare + -Wno-unused-function + -Wno-unused-value + -Wno-unused-but-set-variable + -Wno-implicit-fallthrough + -Wno-missing-field-initializers + -Wno-strict-aliasing + -Wno-maybe-uninitialized + ) + endif() + elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") + list(APPEND warning_flags) + if(ARG_USE_EXTRA_WARNINGS) + list(APPEND warning_flags /W4) + elseif(ARG_USE_FEWER_WARNINGS) + list(APPEND warning_flags /W0) + else() + list(APPEND warning_flags /W2) + endif() + endif() + + add_supported_cxx_flags(${target} PRIVATE ${warning_flags}) + + # Don't assume that symbols will be resolved at runtime + add_supported_cxx_linker_flags(${target} PRIVATE "-Wl,--no-undefined") + + set_target_properties( + ${target} + PROPERTIES # -fvisibility=hidden + CXX_VISIBILITY_PRESET + hidden + # C++ standard + CXX_STANDARD + 17 + # pic + POSITION_INDEPENDENT_CODE + ON + ) + + target_compile_definitions( + ${target} + PRIVATE # Add _DEBUG depending on the build configuration + $<$<CONFIG:Debug>:_DEBUG> + # For including windows.h in a way that minimized namespace + # pollution. Although we define these here, we still set them + # manually in any header files which may be included by another + # project + WIN32_LEAN_AND_MEAN + VC_EXTRALEAN + NOMINMAX + # Use multi-byte character set on Windows + UNICODE + _UNICODE + ) + + # + # Settings dependent on config options + # + + if(SLANG_ENABLE_FULL_DEBUG_VALIDATION) + target_compile_definitions( + ${target} + PRIVATE SLANG_ENABLE_FULL_IR_VALIDATION + ) + endif() + + if(SLANG_ENABLE_DX_ON_VK) + target_compile_definitions(${target} PRIVATE SLANG_CONFIG_DX_ON_VK) + endif() + + if(SLANG_ENABLE_ASAN) + add_supported_cxx_flags( + ${target} + PRIVATE + /fsanitize=address + -fsanitize=address + ) + add_supported_cxx_linker_flags( + ${target} + BEFORE + PUBLIC + /INCREMENTAL:NO + -fsanitize=address + ) + endif() +endfunction() |
