asan/tsan/msan: use builtin atomic operations when available
[blocksruntime.git] / CMakeLists.txt
blob4a7be9c3851b6453587f51c2533173ba15ceed62
1 # CMake build for CompilerRT.
3 # This build assumes that CompilerRT is checked out into the
4 # 'projects/compiler-rt' inside of an LLVM tree, it is not a stand-alone build
5 # system.
7 # An important constraint of the build is that it only produces libraries
8 # based on the ability of the host toolchain to target various platforms.
10 include(LLVMParseArguments)
12 # The CompilerRT build system requires CMake version 2.8.8 or higher in order
13 # to use its support for building convenience "libraries" as a collection of
14 # .o files. This is particularly useful in producing larger, more complex
15 # runtime libraries.
16 cmake_minimum_required(VERSION 2.8.8)
18 # Compute the Clang version from the LLVM version.
19 # FIXME: We should be able to reuse CLANG_VERSION variable calculated
20 #        in Clang cmake files, instead of copying the rules here.
21 string(REGEX MATCH "[0-9]+\\.[0-9]+(\\.[0-9]+)?" CLANG_VERSION
22        ${PACKAGE_VERSION})
23 # Setup the paths where compiler-rt runtimes and headers should be stored.
24 set(LIBCLANG_INSTALL_PATH lib${LLVM_LIBDIR_SUFFIX}/clang/${CLANG_VERSION})
25 string(TOLOWER ${CMAKE_SYSTEM_NAME} LIBCLANG_OS_DIR)
26 set(CLANG_RESOURCE_DIR ${LLVM_BINARY_DIR}/lib/clang/${CLANG_VERSION})
27 set(COMPILER_RT_LIBRARY_OUTPUT_DIR ${CLANG_RESOURCE_DIR}/lib/${LIBCLANG_OS_DIR})
28 set(COMPILER_RT_LIBRARY_INSTALL_DIR
29   ${LIBCLANG_INSTALL_PATH}/lib/${LIBCLANG_OS_DIR})
31 # Add path for custom modules
32 set(CMAKE_MODULE_PATH
33   ${CMAKE_MODULE_PATH}
34   "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules"
35   )
36 include(AddCompilerRT)
38 set(COMPILER_RT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
39 set(COMPILER_RT_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
40 # Setup custom SDK sysroots.
41 set(COMPILER_RT_DARWIN_SDK_SYSROOT ${COMPILER_RT_SOURCE_DIR}/SDKs/darwin)
42 set(COMPILER_RT_LINUX_SDK_SYSROOT ${COMPILER_RT_SOURCE_DIR}/SDKs/linux)
43 include(SanitizerUtils)
45 # Detect whether the current target platform is 32-bit or 64-bit, and setup
46 # the correct commandline flags needed to attempt to target 32-bit and 64-bit.
47 if (NOT CMAKE_SIZEOF_VOID_P EQUAL 4 AND
48     NOT CMAKE_SIZEOF_VOID_P EQUAL 8)
49   message(FATAL_ERROR "Please use architecture with 4 or 8 byte pointers.")
50 endif()
51 if (NOT MSVC)
52   set(TARGET_64_BIT_CFLAGS "-m64")
53   set(TARGET_32_BIT_CFLAGS "-m32")
54 else()
55   set(TARGET_64_BIT_CFLAGS "")
56   set(TARGET_32_BIT_CFLAGS "")
57 endif()
59 # List of architectures we can target.
60 set(COMPILER_RT_SUPPORTED_ARCH)
62 function(get_target_flags_for_arch arch out_var)
63   list(FIND COMPILER_RT_SUPPORTED_ARCH ${arch} ARCH_INDEX)
64   if(ARCH_INDEX EQUAL -1)
65     message(FATAL_ERROR "Unsupported architecture: ${arch}")
66   else()
67     set(${out_var} ${TARGET_${arch}_CFLAGS} PARENT_SCOPE)
68   endif()
69 endfunction()
71 # Try to compile a very simple source file to ensure we can target the given
72 # platform. We use the results of these tests to build only the various target
73 # runtime libraries supported by our current compilers cross-compiling
74 # abilities.
75 set(SIMPLE_SOURCE ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/simple.c)
76 file(WRITE ${SIMPLE_SOURCE} "#include <stdlib.h>\nint main() {}")
78 # test_target_arch(<arch> <target flags...>)
79 # Sets the target flags for a given architecture and determines if this
80 # architecture is supported by trying to build a simple file.
81 macro(test_target_arch arch)
82   set(TARGET_${arch}_CFLAGS ${ARGN})
83   try_compile(CAN_TARGET_${arch} ${CMAKE_BINARY_DIR} ${SIMPLE_SOURCE}
84               COMPILE_DEFINITIONS "${TARGET_${arch}_CFLAGS}"
85               CMAKE_FLAGS "-DCMAKE_EXE_LINKER_FLAGS:STRING=${TARGET_${arch}_CFLAGS}")
86   if(${CAN_TARGET_${arch}})
87     list(APPEND COMPILER_RT_SUPPORTED_ARCH ${arch})
88   endif()
89 endmacro()
91 if("${LLVM_NATIVE_ARCH}" STREQUAL "X86")
92   if (NOT MSVC)
93     test_target_arch(x86_64 ${TARGET_64_BIT_CFLAGS})
94   endif()
95   test_target_arch(i386 ${TARGET_32_BIT_CFLAGS})
96 elseif("${LLVM_NATIVE_ARCH}" STREQUAL "PowerPC")
97   test_target_arch(powerpc64 ${TARGET_64_BIT_CFLAGS})
98 endif()
100 # We only support running instrumented tests when we're not cross compiling
101 # and target a unix-like system. On Android we define the rules for building
102 # unit tests, but don't execute them.
103 if("${CMAKE_HOST_SYSTEM}" STREQUAL "${CMAKE_SYSTEM}" AND UNIX AND NOT ANDROID)
104   option(COMPILER_RT_CAN_EXECUTE_TESTS "Can we execute instrumented tests" ON)
105 else()
106   option(COMPILER_RT_CAN_EXECUTE_TESTS "Can we execute instrumented tests" OFF)
107 endif()
109 # Check if compiler-rt is built with libc++.
110 find_flag_in_string("${CMAKE_CXX_FLAGS}" "-stdlib=libc++"
111                     COMPILER_RT_USES_LIBCXX)
113 function(filter_available_targets out_var)
114   set(archs)
115   foreach(arch ${ARGN})
116     list(FIND COMPILER_RT_SUPPORTED_ARCH ${arch} ARCH_INDEX)
117     if(NOT (ARCH_INDEX EQUAL -1) AND CAN_TARGET_${arch})
118       list(APPEND archs ${arch})
119     endif()
120   endforeach()
121   set(${out_var} ${archs} PARENT_SCOPE)
122 endfunction()
124 # Provide some common commmandline flags for Sanitizer runtimes.
125 if (NOT MSVC)
126   set(SANITIZER_COMMON_CFLAGS
127     -fPIC
128     -fno-builtin
129     -fno-exceptions
130     -fomit-frame-pointer
131     -funwind-tables
132     -fno-stack-protector
133     -Wno-gnu  # Variadic macros with 0 arguments for ...
134     -O3
135     -fvisibility=hidden
136     )
137 else()
138   set(SANITIZER_COMMON_CFLAGS
139     /MT
140     /Zi
141     /Oy-
142     /GS-
143     /wd4722
144     )
145 endif()
146 # Build sanitizer runtimes with debug info. (MSVC gets /Zi above)
147 if (NOT MSVC)
148   check_cxx_compiler_flag(-gline-tables-only SUPPORTS_GLINE_TABLES_ONLY_FLAG)
149   if(SUPPORTS_GLINE_TABLES_ONLY_FLAG)
150     list(APPEND SANITIZER_COMMON_CFLAGS -gline-tables-only)
151   else()
152     list(APPEND SANITIZER_COMMON_CFLAGS -g)
153   endif()
154 endif()
155 # Warnings suppressions.
156 check_cxx_compiler_flag(-Wno-variadic-macros SUPPORTS_NO_VARIADIC_MACROS_FLAG)
157 if(SUPPORTS_NO_VARIADIC_MACROS_FLAG)
158   list(APPEND SANITIZER_COMMON_CFLAGS -Wno-variadic-macros)
159 endif()
160 check_cxx_compiler_flag(-Wno-c99-extensions SUPPORTS_NO_C99_EXTENSIONS_FLAG)
161 if(SUPPORTS_NO_C99_EXTENSIONS_FLAG)
162   list(APPEND SANITIZER_COMMON_CFLAGS -Wno-c99-extensions)
163 endif()
164 # Sanitizer may not have libstdc++, so we can have problems with virtual
165 # destructors.
166 check_cxx_compiler_flag(-Wno-non-virtual-dtor SUPPORTS_NO_NON_VIRTUAL_DTOR_FLAG)
167 if (SUPPORTS_NO_NON_VIRTUAL_DTOR_FLAG)
168   list(APPEND SANITIZER_COMMON_CFLAGS -Wno-non-virtual-dtor)
169 endif()
170 check_cxx_compiler_flag(-Wglobal-constructors SUPPORTS_GLOBAL_CONSTRUCTORS_FLAG)
171 # Not all sanitizers forbid global constructors.
173 # Setup min Mac OS X version.
174 if(APPLE)
175   if(COMPILER_RT_USES_LIBCXX)
176     set(SANITIZER_MIN_OSX_VERSION 10.7)
177   else()
178     set(SANITIZER_MIN_OSX_VERSION 10.6)
179   endif()
180   list(APPEND SANITIZER_COMMON_CFLAGS
181     -mmacosx-version-min=${SANITIZER_MIN_OSX_VERSION})
182 endif()
184 # Architectures supported by Sanitizer runtimes. Specific sanitizers may
185 # support only subset of these (e.g. TSan works on x86_64 only).
186 filter_available_targets(SANITIZER_COMMON_SUPPORTED_ARCH
187   x86_64 i386 powerpc64)
189 # Add the public header's directory to the includes for all of compiler-rt.
190 include_directories(include)
191 add_subdirectory(include)
193 set(SANITIZER_COMMON_LIT_TEST_DEPS
194   clang clang-headers FileCheck count not llvm-nm llvm-symbolizer
195   compiler-rt-headers)
196 # Check code style when running lit tests for sanitizers.
197 if(UNIX)
198   list(APPEND SANITIZER_COMMON_LIT_TEST_DEPS SanitizerLintCheck)
199 endif()
201 add_subdirectory(lib)
203 if(LLVM_INCLUDE_TESTS)
204   # Currently the tests have not been ported to CMake, so disable this
205   # directory.
206   #
207   #add_subdirectory(test)
208 endif()