summaryrefslogtreecommitdiff
path: root/CMakeLists.txt
diff options
context:
space:
mode:
authorTor Didriksen <tor.didriksen@oracle.com>2013-09-20 16:10:31 +0200
committerTor Didriksen <tor.didriksen@oracle.com>2013-09-20 16:10:31 +0200
commitfaf495e9c0f54ab942fc6436c711bb58ec3db405 (patch)
tree77a4fcde130f4a92c3d058c7f3b7a5f05b698263 /CMakeLists.txt
parent849b1f64929c0daea5e29fe3e37e04c09e8f0ea3 (diff)
downloadmariadb-git-faf495e9c0f54ab942fc6436c711bb58ec3db405.tar.gz
Bug#17435338 ADD A -DWITH_ASAN SWITCH/OPTION TO OUR CMAKE SCRIPTS
Tested with: gcc (GCC) 4.8.1 20130603 (Red Hat 4.8.1-1) clang version 3.1 (tags/RELEASE_31/final) Target: x86_64-apple-darwin10.8.0
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r--CMakeLists.txt78
1 files changed, 77 insertions, 1 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index aee0fb650e8..369a6b5c8f9 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -177,7 +177,83 @@ ENDIF()
OPTION (WITH_UNIT_TESTS "Compile MySQL with unit tests" ON)
MARK_AS_ADVANCED(CYBOZU BACKUP_TEST WITHOUT_SERVER DISABLE_SHARED)
-
+
+
+include(CheckCSourceCompiles)
+include(CheckCXXSourceCompiles)
+# We need some extra FAIL_REGEX patterns
+# Note that CHECK_C_SOURCE_COMPILES is a misnomer, it will also link.
+MACRO (MY_CHECK_C_COMPILER_FLAG FLAG RESULT)
+ SET(SAVE_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
+ SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${FLAG}")
+ CHECK_C_SOURCE_COMPILES("int main(void) { return 0; }" ${RESULT}
+ FAIL_REGEX "argument unused during compilation"
+ FAIL_REGEX "unsupported .*option"
+ FAIL_REGEX "unknown .*option"
+ FAIL_REGEX "unrecognized .*option"
+ FAIL_REGEX "ignoring unknown option"
+ FAIL_REGEX "[Ww]arning: [Oo]ption"
+ )
+ SET(CMAKE_REQUIRED_FLAGS "${SAVE_CMAKE_REQUIRED_FLAGS}")
+ENDMACRO()
+
+MACRO (MY_CHECK_CXX_COMPILER_FLAG FLAG RESULT)
+ SET(SAVE_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
+ SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${FLAG}")
+ CHECK_CXX_SOURCE_COMPILES("int main(void) { return 0; }" ${RESULT}
+ FAIL_REGEX "argument unused during compilation"
+ FAIL_REGEX "unsupported .*option"
+ FAIL_REGEX "unknown .*option"
+ FAIL_REGEX "unrecognized .*option"
+ FAIL_REGEX "ignoring unknown option"
+ FAIL_REGEX "[Ww]arning: [Oo]ption"
+ )
+ SET(CMAKE_REQUIRED_FLAGS "${SAVE_CMAKE_REQUIRED_FLAGS}")
+ENDMACRO()
+
+OPTION(WITH_ASAN "Enable address sanitizer" OFF)
+IF (WITH_ASAN)
+ # gcc 4.8.1 and new versions of clang
+ MY_CHECK_C_COMPILER_FLAG("-fsanitize=address" HAVE_C_FSANITIZE)
+ MY_CHECK_CXX_COMPILER_FLAG("-fsanitize=address" HAVE_CXX_FSANITIZE)
+
+ IF(HAVE_C_FSANITIZE AND HAVE_CXX_FSANITIZE)
+ # We switch on basic optimization also for debug builds.
+ # With optimization we may get some warnings, so we switch off -Werror
+ SET(CMAKE_C_FLAGS_DEBUG
+ "${CMAKE_C_FLAGS_DEBUG} -fsanitize=address -O1 -Wno-error -fPIC")
+ SET(CMAKE_C_FLAGS_RELWITHDEBINFO
+ "${CMAKE_C_FLAGS_RELWITHDEBINFO} -fsanitize=address -fPIC")
+ SET(CMAKE_CXX_FLAGS_DEBUG
+ "${CMAKE_CXX_FLAGS_DEBUG} -fsanitize=address -O1 -Wno-error -fPIC")
+ SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO
+ "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -fsanitize=address -fPIC")
+ SET(WITH_ASAN_OK 1)
+ ELSE()
+ # older versions of clang
+ MY_CHECK_C_COMPILER_FLAG("-faddress-sanitizer" HAVE_C_FADDRESS)
+ MY_CHECK_CXX_COMPILER_FLAG("-faddress-sanitizer" HAVE_CXX_FFADDRESS)
+
+ IF(HAVE_C_FADDRESS AND HAVE_CXX_FFADDRESS)
+ # We switch on basic optimization also for debug builds.
+ SET(CMAKE_C_FLAGS_DEBUG
+ "${CMAKE_C_FLAGS_DEBUG} -faddress-sanitizer -O1 -fPIC")
+ SET(CMAKE_C_FLAGS_RELWITHDEBINFO
+ "${CMAKE_C_FLAGS_RELWITHDEBINFO} -faddress-sanitizer -fPIC")
+ SET(CMAKE_CXX_FLAGS_DEBUG
+ "${CMAKE_CXX_FLAGS_DEBUG} -faddress-sanitizer -O1 -fPIC")
+ SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO
+ "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -faddress-sanitizer -fPIC")
+ SET(WITH_ASAN_OK 1)
+ ENDIF()
+ ENDIF()
+
+ IF(NOT WITH_ASAN_OK)
+ MESSAGE(FATAL_ERROR "Do not know how to enable address sanitizer")
+ ENDIF()
+ENDIF()
+
+
OPTION(ENABLE_DEBUG_SYNC "Enable debug sync (debug builds only)" ON)
IF(ENABLE_DEBUG_SYNC)
SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DENABLED_DEBUG_SYNC")