| |
| # Copyright Catch2 Authors |
| # Distributed under the Boost Software License, Version 1.0. |
| # (See accompanying file LICENSE.txt or copy at |
| # https://www.boost.org/LICENSE_1_0.txt) |
| |
| # SPDX-License-Identifier: BSL-1.0 |
| |
| include(CheckCXXCompilerFlag) |
| function(add_cxx_flag_if_supported_to_targets flagname targets) |
| string(MAKE_C_IDENTIFIER ${flagname} flag_identifier) |
| check_cxx_compiler_flag("${flagname}" HAVE_FLAG_${flag_identifier}) |
| |
| if(HAVE_FLAG_${flag_identifier}) |
| foreach(target ${targets}) |
| target_compile_options(${target} PRIVATE ${flagname}) |
| endforeach() |
| endif() |
| endfunction() |
| |
| # Assumes that it is only called for development builds, where warnings |
| # and Werror is desired, so it also enables Werror. |
| function(add_warnings_to_targets targets) |
| LIST(LENGTH targets TARGETS_LEN) |
| # For now we just assume 2 possibilities: msvc and msvc-like compilers, |
| # and other. |
| if(MSVC) |
| foreach(target ${targets}) |
| # Force MSVC to consider everything as encoded in utf-8 |
| target_compile_options(${target} PRIVATE /utf-8) |
| # Enable Werror equivalent |
| if(CATCH_ENABLE_WERROR) |
| target_compile_options(${target} PRIVATE /WX) |
| endif() |
| |
| # MSVC is currently handled specially |
| if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") |
| STRING(REGEX REPLACE "/W[0-9]" "/W4" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) # override default warning level |
| target_compile_options(${target} PRIVATE /w44265 /w44061 /w44062 /w45038) |
| endif() |
| endforeach() |
| endif() |
| |
| if(NOT MSVC) |
| set(CHECKED_WARNING_FLAGS |
| "-Wabsolute-value" |
| "-Wall" |
| "-Wcall-to-pure-virtual-from-ctor-dtor" |
| "-Wcast-align" |
| "-Wcatch-value" |
| "-Wdangling" |
| "-Wdeprecated" |
| "-Wdeprecated-register" |
| "-Wexceptions" |
| "-Wexit-time-destructors" |
| "-Wextra" |
| "-Wextra-semi" |
| "-Wfloat-equal" |
| "-Wglobal-constructors" |
| "-Winit-self" |
| "-Wmisleading-indentation" |
| "-Wmismatched-new-delete" |
| "-Wmismatched-return-types" |
| "-Wmismatched-tags" |
| "-Wmissing-braces" |
| "-Wmissing-declarations" |
| "-Wmissing-noreturn" |
| "-Wmissing-prototypes" |
| "-Wmissing-variable-declarations" |
| "-Wnon-virtual-dtor" |
| "-Wnull-dereference" |
| "-Wold-style-cast" |
| "-Woverloaded-virtual" |
| "-Wparentheses" |
| "-Wpedantic" |
| "-Wredundant-decls" |
| "-Wreorder" |
| "-Wreturn-std-move" |
| "-Wshadow" |
| "-Wstrict-aliasing" |
| "-Wsubobject-linkage" |
| "-Wsuggest-destructor-override" |
| "-Wsuggest-override" |
| "-Wundef" |
| "-Wuninitialized" |
| "-Wunneeded-internal-declaration" |
| "-Wunreachable-code-aggressive" |
| "-Wunused" |
| "-Wunused-function" |
| "-Wunused-parameter" |
| "-Wvla" |
| "-Wweak-vtables" |
| |
| # This is a useful warning, but our tests sometimes rely on |
| # functions being present, but not picked (e.g. various checks |
| # for stringification implementation ordering). |
| # Ergo, we should use it every now and then, but we cannot |
| # enable it by default. |
| # "-Wunused-member-function" |
| ) |
| foreach(warning ${CHECKED_WARNING_FLAGS}) |
| add_cxx_flag_if_supported_to_targets(${warning} "${targets}") |
| endforeach() |
| |
| if(CATCH_ENABLE_WERROR) |
| foreach(target ${targets}) |
| # Enable Werror equivalent |
| target_compile_options(${target} PRIVATE -Werror) |
| endforeach() |
| endif() |
| endif() |
| endfunction() |
| |
| # Adds flags required for reproducible build to the target |
| # Currently only supports GCC and Clang |
| function(add_build_reproducibility_settings target) |
| # Make the build reproducible on versions of g++ and clang that supports -ffile-prefix-map |
| if((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") OR (CMAKE_CXX_COMPILER_ID MATCHES "Clang")) |
| add_cxx_flag_if_supported_to_targets("-ffile-prefix-map=${CATCH_DIR}/=" "${target}") |
| endif() |
| endfunction() |