From d3df3a880b85d6fda2d0993395f17474c71d31c5 Mon Sep 17 00:00:00 2001 From: Eric Kilmer Date: Tue, 12 Apr 2022 15:11:51 -0400 Subject: [PATCH] Use toolchain for asan flag overriding (#922) This is more correct. We have total control over the flags used when building with ASAN --- .../vcpkg_unix_sanitizer_toolchain.cmake | 32 +++++++++++++++++++ triplets/arm64-osx-asan.cmake | 7 ++-- triplets/x64-linux-asan.cmake | 7 ++-- triplets/x64-linux-rel-asan.cmake | 11 ++++--- triplets/x64-osx-asan.cmake | 11 +++++-- triplets/x64-osx-rel-asan.cmake | 9 ++++-- 6 files changed, 64 insertions(+), 13 deletions(-) create mode 100644 toolchain/vcpkg_unix_sanitizer_toolchain.cmake diff --git a/toolchain/vcpkg_unix_sanitizer_toolchain.cmake b/toolchain/vcpkg_unix_sanitizer_toolchain.cmake new file mode 100644 index 00000000..983aa886 --- /dev/null +++ b/toolchain/vcpkg_unix_sanitizer_toolchain.cmake @@ -0,0 +1,32 @@ +# This toolchain only sets up override compiler flags for CMake's 'Release' and +# 'Debug' build types. You _must_ set your sanitizer flag(s) +# ('-fsanitize=address') in the vcpkg triplet. These flags aren't globally +# applied because some programs like LLVM don't play nice with global +# sanitizers and have their own buildsystem options to enable compilation with +# those flags. +get_property(_CMAKE_IN_TRY_COMPILE GLOBAL PROPERTY IN_TRY_COMPILE) +if(NOT _CMAKE_IN_TRY_COMPILE) + # Our override flags for sanitization, but does not include sanitizer flags, + # that comes from vcpkg flags + set(common_flags "-O1 -g -fno-omit-frame-pointer -fno-optimize-sibling-calls") + + # Copied from vcpkg's 'scripts/toolchain/linux.cmake'. Don't use the `_INIT` + # suffix because we want to _override_ any flags that CMake would use + set(CMAKE_C_FLAGS " -fPIC ${common_flags} ${VCPKG_C_FLAGS} ") + set(CMAKE_CXX_FLAGS " -fPIC ${common_flags} ${VCPKG_CXX_FLAGS} ") + set(CMAKE_C_FLAGS_DEBUG " ${VCPKG_C_FLAGS_DEBUG} ") + set(CMAKE_CXX_FLAGS_DEBUG " ${VCPKG_CXX_FLAGS_DEBUG} ") + set(CMAKE_C_FLAGS_RELEASE " -DNDEBUG ${VCPKG_C_FLAGS_RELEASE} ") + set(CMAKE_CXX_FLAGS_RELEASE " -DNDEBUG ${VCPKG_CXX_FLAGS_RELEASE} ") + + set(CMAKE_SHARED_LINKER_FLAGS " ${VCPKG_LINKER_FLAGS} ") + set(CMAKE_EXE_LINKER_FLAGS " ${VCPKG_LINKER_FLAGS} ") + if(VCPKG_CRT_LINKAGE STREQUAL "static") + string(APPEND CMAKE_SHARED_LINKER_FLAGS "-static ") + string(APPEND CMAKE_EXE_LINKER_FLAGS APPEND "-static ") + endif() + set(CMAKE_SHARED_LINKER_FLAGS_DEBUG " ${VCPKG_LINKER_FLAGS_DEBUG} ") + set(CMAKE_EXE_LINKER_FLAGS_DEBUG " ${VCPKG_LINKER_FLAGS_DEBUG} ") + set(CMAKE_SHARED_LINKER_FLAGS_RELEASE " ${VCPKG_LINKER_FLAGS_RELEASE} ") + set(CMAKE_EXE_LINKER_FLAGS_RELEASE " ${VCPKG_LINKER_FLAGS_RELEASE} ") +endif() diff --git a/triplets/arm64-osx-asan.cmake b/triplets/arm64-osx-asan.cmake index e710b8e0..a87c64e8 100644 --- a/triplets/arm64-osx-asan.cmake +++ b/triplets/arm64-osx-asan.cmake @@ -9,12 +9,15 @@ set(VCPKG_USE_SANITIZER "Address") # If the following flags cause errors during build, you might need to manually # ignore the PORT and check VCPKG_USE_SANITIZER if(NOT PORT MATCHES "^((upb))$") - set(VCPKG_CXX_FLAGS "-O1 -g -fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls") - set(VCPKG_C_FLAGS "-O1 -g -fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls") + set(VCPKG_CXX_FLAGS "-fsanitize=address") + set(VCPKG_C_FLAGS "-fsanitize=address") endif() # Always apply sanitizer to linker flags set(VCPKG_LINKER_FLAGS "-fsanitize=address") +# This is where we override default CMake compiler/linker flags +set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE "${CMAKE_CURRENT_LIST_DIR}/../toolchain/vcpkg_unix_sanitizer_toolchain.cmake") + set(VCPKG_CMAKE_SYSTEM_NAME Darwin) set(VCPKG_OSX_ARCHITECTURES arm64) diff --git a/triplets/x64-linux-asan.cmake b/triplets/x64-linux-asan.cmake index a3f1a592..91b9e8ad 100644 --- a/triplets/x64-linux-asan.cmake +++ b/triplets/x64-linux-asan.cmake @@ -9,11 +9,14 @@ set(VCPKG_USE_SANITIZER "Address") # If the following flags cause errors during build, you might need to manually # ignore the PORT and check VCPKG_USE_SANITIZER if(NOT PORT MATCHES "^((upb))$") - set(VCPKG_CXX_FLAGS "-O1 -g -fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls") - set(VCPKG_C_FLAGS "-O1 -g -fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls") + set(VCPKG_CXX_FLAGS "-fsanitize=address") + set(VCPKG_C_FLAGS "-fsanitize=address") endif() # Always apply sanitizer to linker flags set(VCPKG_LINKER_FLAGS "-fsanitize=address") +# This is where we override default CMake compiler/linker flags +set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE "${CMAKE_CURRENT_LIST_DIR}/../toolchain/vcpkg_unix_sanitizer_toolchain.cmake") + set(VCPKG_CMAKE_SYSTEM_NAME Linux) diff --git a/triplets/x64-linux-rel-asan.cmake b/triplets/x64-linux-rel-asan.cmake index 6c1c595c..a29ee925 100644 --- a/triplets/x64-linux-rel-asan.cmake +++ b/triplets/x64-linux-rel-asan.cmake @@ -2,6 +2,9 @@ set(VCPKG_TARGET_ARCHITECTURE x64) set(VCPKG_CRT_LINKAGE dynamic) set(VCPKG_LIBRARY_LINKAGE static) +# Only release builds +set(VCPKG_BUILD_TYPE release) + # ASAN # Make sure this value matches up with https://llvm.org/docs/CMake.html "LLVM_USE_SANITIZER" set(VCPKG_USE_SANITIZER "Address") @@ -9,14 +12,14 @@ set(VCPKG_USE_SANITIZER "Address") # If the following flags cause errors during build, you might need to manually # ignore the PORT and check VCPKG_USE_SANITIZER if(NOT PORT MATCHES "^((upb))$") - set(VCPKG_CXX_FLAGS "-fsanitize=address -g -fno-omit-frame-pointer -fno-optimize-sibling-calls") - set(VCPKG_C_FLAGS "-fsanitize=address -g -fno-omit-frame-pointer -fno-optimize-sibling-calls") + set(VCPKG_CXX_FLAGS "-fsanitize=address") + set(VCPKG_C_FLAGS "-fsanitize=address") endif() # Always apply sanitizer to linker flags set(VCPKG_LINKER_FLAGS "-fsanitize=address") -# Only release builds -set(VCPKG_BUILD_TYPE release) +# This is where we override default CMake compiler/linker flags +set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE "${CMAKE_CURRENT_LIST_DIR}/../toolchain/vcpkg_unix_sanitizer_toolchain.cmake") set(VCPKG_CMAKE_SYSTEM_NAME Linux) diff --git a/triplets/x64-osx-asan.cmake b/triplets/x64-osx-asan.cmake index 7d6314c0..27b0f336 100644 --- a/triplets/x64-osx-asan.cmake +++ b/triplets/x64-osx-asan.cmake @@ -9,10 +9,15 @@ set(VCPKG_USE_SANITIZER "Address") # If the following flags cause errors during build, you might need to manually # ignore the PORT and check VCPKG_USE_SANITIZER if(NOT PORT MATCHES "^((upb))$") - set(VCPKG_CXX_FLAGS "-O1 -g -fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls") - set(VCPKG_C_FLAGS "-O1 -g -fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls") - set(VCPKG_LINKER_FLAGS "-fsanitize=address") + set(VCPKG_CXX_FLAGS "-fsanitize=address") + set(VCPKG_C_FLAGS "-fsanitize=address") endif() +# Always apply sanitizer to linker flags +set(VCPKG_LINKER_FLAGS "-fsanitize=address") + +# This is where we override default CMake compiler/linker flags +set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE "${CMAKE_CURRENT_LIST_DIR}/../toolchain/vcpkg_unix_sanitizer_toolchain.cmake") + set(VCPKG_CMAKE_SYSTEM_NAME Darwin) set(VCPKG_OSX_ARCHITECTURES x86_64) diff --git a/triplets/x64-osx-rel-asan.cmake b/triplets/x64-osx-rel-asan.cmake index 1117f946..6e907e23 100644 --- a/triplets/x64-osx-rel-asan.cmake +++ b/triplets/x64-osx-rel-asan.cmake @@ -1,6 +1,8 @@ set(VCPKG_TARGET_ARCHITECTURE x64) set(VCPKG_CRT_LINKAGE dynamic) set(VCPKG_LIBRARY_LINKAGE static) + +# Only release builds set(VCPKG_BUILD_TYPE release) # ASAN @@ -10,12 +12,15 @@ set(VCPKG_USE_SANITIZER "Address") # If the following flags cause errors during build, you might need to manually # ignore the PORT and check VCPKG_USE_SANITIZER if(NOT PORT MATCHES "^((upb))$") - set(VCPKG_CXX_FLAGS "-fsanitize=address -g -fno-omit-frame-pointer -fno-optimize-sibling-calls") - set(VCPKG_C_FLAGS "-fsanitize=address -g -fno-omit-frame-pointer -fno-optimize-sibling-calls") + set(VCPKG_CXX_FLAGS "-fsanitize=address") + set(VCPKG_C_FLAGS "-fsanitize=address") endif() # Always apply sanitizer to linker flags set(VCPKG_LINKER_FLAGS "-fsanitize=address") +# This is where we override default CMake compiler/linker flags +set(VCPKG_CHAINLOAD_TOOLCHAIN_FILE "${CMAKE_CURRENT_LIST_DIR}/../toolchain/vcpkg_unix_sanitizer_toolchain.cmake") + set(VCPKG_CMAKE_SYSTEM_NAME Darwin) set(VCPKG_OSX_ARCHITECTURES x86_64)