diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index c324bc7eb4..dc09efa033 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -227,13 +227,29 @@ endif() # Check for some compiler flags include(CheckCXXCompilerFlag) +set(DOLFINX_CXX_DEVELOPER_FLAGS "") +set(DOLFINX_CXX_DEVELOPER_DEFINITIONS "") +set(DOLFINX_LINK_DEVELOPER_FLAGS "") + # Add some strict compiler checks check_cxx_compiler_flag("-Wall -Werror -Wextra -pedantic" HAVE_PEDANTIC) - if(HAVE_PEDANTIC) list(APPEND DOLFINX_CXX_DEVELOPER_FLAGS -Wall;-Werror;-Wextra;-pedantic) endif() +# Nicer stack traces +check_cxx_compiler_flag("-fno-omit-frame-pointer" HAVE_NO_OMIT_FRAME_POINTER) +if(HAVE_NO_OMIT_FRAME_POINTER) + list(APPEND DOLFINX_CXX_DEVELOPER_FLAGS -fno-omit-frame-pointer) +endif() + +# Add fast memory error detector +check_cxx_compiler_flag("-fsanitize=address" HAVE_ADDRESS_SANITIZER) +if(HAVE_ADDRESS_SANITIZER) + list(APPEND DOLFINX_CXX_DEVELOPER_FLAGS -fsanitize=address) + list(APPEND DOLFINX_LINK_DEVELOPER_FLAGS -fsanitize=address) +endif() + # Debug flags check_cxx_compiler_flag(-g HAVE_DEBUG) if(HAVE_DEBUG) diff --git a/cpp/dolfinx/CMakeLists.txt b/cpp/dolfinx/CMakeLists.txt index 1485d757fb..d814dc9277 100644 --- a/cpp/dolfinx/CMakeLists.txt +++ b/cpp/dolfinx/CMakeLists.txt @@ -75,6 +75,12 @@ target_compile_definitions( dolfinx PRIVATE $<$,$>:${DOLFINX_CXX_DEVELOPER_DEFINITIONS}> ) +# Set 'Developer' link options +target_link_options( + dolfinx PRIVATE $<$:${DOLFINX_LINK_DEVELOPER_FLAGS}> +) + + # Add version to definitions (public) target_compile_definitions(dolfinx PUBLIC DOLFINX_VERSION="${DOLFINX_VERSION}") diff --git a/cpp/test/CMakeLists.txt b/cpp/test/CMakeLists.txt index f446631aa0..116012546c 100644 --- a/cpp/test/CMakeLists.txt +++ b/cpp/test/CMakeLists.txt @@ -8,6 +8,10 @@ if (PROJECT_IS_TOP_LEVEL) include(CTest) # enables testing find_package(DOLFINX REQUIRED) + set(DOLFINX_CXX_DEVELOPER_FLAGS "") + set(DOLFINX_CXX_DEVELOPER_DEFINITIONS "") + set(DOLFINX_LINK_DEVELOPER_FLAGS "") + # NOTE: The following must precisely replicate the code in ../CMakeLists.txt. # Check for some compiler flags include(CheckCXXCompilerFlag) @@ -19,6 +23,19 @@ if (PROJECT_IS_TOP_LEVEL) list(APPEND DOLFINX_CXX_DEVELOPER_FLAGS -Wall;-Werror;-Wextra;-pedantic) endif() + # Nicer stack traces + check_cxx_compiler_flag("-fno-omit-frame-pointer" HAVE_NO_OMIT_FRAME_POINTER) + if(HAVE_NO_OMIT_FRAME_POINTER) + list(APPEND DOLFINX_CXX_DEVELOPER_FLAGS -fno-omit-frame-pointer) + endif() + + # Add fast memory error detector + check_cxx_compiler_flag("-fsanitize=address" HAVE_ADDRESS_SANITIZER) + if(HAVE_ADDRESS_SANITIZER) + list(APPEND DOLFINX_CXX_DEVELOPER_FLAGS -fsanitize=address) + list(APPEND DOLFINX_LINK_DEVELOPER_FLAGS -fsanitize=address) + endif() + # Debug flags check_cxx_compiler_flag(-g HAVE_DEBUG) if(HAVE_DEBUG) @@ -121,21 +138,23 @@ if (NOT PROJECT_IS_TOP_LEVEL) ) endif() -if (DEFINED DOLFINX_CXX_DEVELOPER_FLAGS) - target_compile_options( - unittests - PRIVATE - $<$,$>:${DOLFINX_CXX_DEVELOPER_FLAGS}> - ) -endif() +target_compile_options( + unittests + PRIVATE + $<$,$>:${DOLFINX_CXX_DEVELOPER_FLAGS}> +) -if (DEFINED DOLFINX_CXX_DEVELOPER_DEFINITIONS) - target_compile_definitions( - unittests - PRIVATE - $<$,$>:${DOLFINX_CXX_DEVELOPER_DEFINITIONS}> - ) -endif() +target_compile_definitions( + unittests + PRIVATE + $<$,$>:${DOLFINX_CXX_DEVELOPER_DEFINITIONS}> +) + +target_link_options( + unittests + PRIVATE + $<$:${DOLFINX_LINK_DEVELOPER_FLAGS}> +) if(ENABLE_CLANG_TIDY) find_program(CLANG_TIDY NAMES clang-tidy REQUIRED)