diff options
author | Ankit <ankitm> | 2020-09-07 21:47:17 +0300 |
---|---|---|
committer | Ankit Meel <ankitjmeel@gmail.com> | 2020-09-07 21:49:07 +0300 |
commit | 40dcf686f04f7db8110f9c85621eb8a0bd764080 (patch) | |
tree | 37ca00ad76f3d8aaa3c49b9587578507249254de /CMakeLists.txt | |
parent | de21ab418d69ca82a07ec7c836b1deca09bbd57f (diff) |
Support ASan library on macOS for all generators.
This change allows macOS developers to use
`WITH_COMPILER_ASAN` with every generator.
`CMAKE_C_IMPLICIT_LINK_DIRECTORIES` on macOS points to
`Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/lib`
which is not where the Sanitizer libraries are.
To link the library, rpath could be used but that seems complex,
so linker flags are passed as the documentation says. [1]
If users have `ASAN_OPTIONS=detect_leaks=1` in their environment
variables, it should be removed to avoid a feature-unsupported error
while compiling.
[1]: http://clang.llvm.org/docs/AddressSanitizer.html#usage
Reviewed By: brecht
Differential Revision: https://developer.blender.org/D8817
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r-- | CMakeLists.txt | 44 |
1 files changed, 37 insertions, 7 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 76d2d578dc3..f72ccd857b3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -510,9 +510,21 @@ if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID MATCHES "Clang") -fno-sanitize=alignment \ ") - if(NOT MSVC) # not all sanitizers are supported with clang-cl, these two however are very vocal about it - set(_asan_defaults "${_asan_defaults} -fsanitize=leak -fsanitize=object-size" ) + if(MSVC) + # clang-cl doesn't support all sanitizers, but leak and object-size give errors/warnings. + set(_asan_defaults "${_asan_defaults}") + elseif(APPLE) + # AppleClang doesn't support all sanitizers, but leak gives error. + if(CMAKE_BUILD_TYPE MATCHES "Debug") + # Silence the warning that object-size is not effective in -O0. + set(_asan_defaults "${_asan_defaults}") + else() + set(_asan_defaults "${_asan_defaults} -fsanitize=object-size") + endif() + else() + set(_asan_defaults "${_asan_defaults} -fsanitize=leak -fsanitize=object-size") endif() + set(COMPILER_ASAN_CFLAGS "${_asan_defaults}" CACHE STRING "C flags for address sanitizer") mark_as_advanced(COMPILER_ASAN_CFLAGS) set(COMPILER_ASAN_CXXFLAGS "${_asan_defaults}" CACHE STRING "C++ flags for address sanitizer") @@ -520,16 +532,31 @@ if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID MATCHES "Clang") unset(_asan_defaults) - if(NOT MSVC) - find_library(COMPILER_ASAN_LIBRARY asan ${CMAKE_C_IMPLICIT_LINK_DIRECTORIES}) - else() - find_library( - COMPILER_ASAN_LIBRARY NAMES clang_rt.asan-x86_64 + if(MSVC) + find_library( + COMPILER_ASAN_LIBRARY NAMES clang_rt.asan-x86_64 PATHS [HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\LLVM\\LLVM;]/lib/clang/7.0.0/lib/windows [HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\LLVM\\LLVM;]/lib/clang/6.0.0/lib/windows ) + elseif(APPLE) + execute_process(COMMAND ${CMAKE_CXX_COMPILER} + -print-file-name=lib + OUTPUT_VARIABLE CLANG_LIB_DIR + ) + string(STRIP "${CLANG_LIB_DIR}" CLANG_LIB_DIR) + find_library( + COMPILER_ASAN_LIBRARY NAMES libclang_rt.asan_osx_dynamic.dylib + PATHS + "${CLANG_LIB_DIR}/darwin/" + ) + unset(CLANG_LIB_DIR) + else() + find_library( + COMPILER_ASAN_LIBRARY asan ${CMAKE_C_IMPLICIT_LINK_DIRECTORIES} + ) endif() + mark_as_advanced(COMPILER_ASAN_LIBRARY) endif() endif() @@ -823,6 +850,9 @@ if(NOT CMAKE_BUILD_TYPE MATCHES "Release") if(MSVC) set(COMPILER_ASAN_LINKER_FLAGS "/FUNCTIONPADMIN:6") endif() + if(APPLE) + set(COMPILER_ASAN_LINKER_FLAGS "-fno-omit-frame-pointer -fsanitize=address") + endif(APPLE) if(COMPILER_ASAN_LIBRARY) set(PLATFORM_LINKLIBS "${PLATFORM_LINKLIBS};${COMPILER_ASAN_LIBRARY}") set(PLATFORM_LINKFLAGS "${COMPILER_ASAN_LIBRARY} ${COMPILER_ASAN_LINKER_FLAGS}") |