| Chandler Carruth | 1f5d5c0 | 2012-04-04 22:12:04 +0000 | [diff] [blame] | 1 | # CMake build for CompilerRT. | 
|  | 2 | # | 
|  | 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. | 
|  | 6 | # | 
|  | 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. | 
|  | 9 |  | 
|  | 10 | include(LLVMParseArguments) | 
|  | 11 |  | 
| Chandler Carruth | c78ad00 | 2012-06-25 08:40:10 +0000 | [diff] [blame] | 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) | 
|  | 17 |  | 
| Alexey Samsonov | 8c2cd86 | 2013-01-20 13:58:10 +0000 | [diff] [blame] | 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) | 
| Alexey Samsonov | 4c17c1b | 2013-03-19 09:17:35 +0000 | [diff] [blame] | 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}) | 
| Alexey Samsonov | 8c2cd86 | 2013-01-20 13:58:10 +0000 | [diff] [blame] | 28 | set(COMPILER_RT_LIBRARY_INSTALL_DIR | 
| Alexey Samsonov | 4c17c1b | 2013-03-19 09:17:35 +0000 | [diff] [blame] | 29 | ${LIBCLANG_INSTALL_PATH}/lib/${LIBCLANG_OS_DIR}) | 
| Alexey Samsonov | 8c2cd86 | 2013-01-20 13:58:10 +0000 | [diff] [blame] | 30 |  | 
| Alexey Samsonov | ca7fcf2 | 2012-12-19 12:33:39 +0000 | [diff] [blame] | 31 | # Add path for custom modules | 
|  | 32 | set(CMAKE_MODULE_PATH | 
|  | 33 | ${CMAKE_MODULE_PATH} | 
|  | 34 | "${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules" | 
|  | 35 | ) | 
| Alexey Samsonov | 163ab9d | 2013-01-18 16:05:21 +0000 | [diff] [blame] | 36 | include(AddCompilerRT) | 
| Alexey Samsonov | ca7fcf2 | 2012-12-19 12:33:39 +0000 | [diff] [blame] | 37 |  | 
|  | 38 | set(COMPILER_RT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) | 
| Alexey Samsonov | 6a65b18 | 2013-06-06 12:35:48 +0000 | [diff] [blame] | 39 | set(COMPILER_RT_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) | 
| Alexey Samsonov | 4c17c1b | 2013-03-19 09:17:35 +0000 | [diff] [blame] | 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) | 
| Alexey Samsonov | ca7fcf2 | 2012-12-19 12:33:39 +0000 | [diff] [blame] | 43 |  | 
| Chandler Carruth | 1f5d5c0 | 2012-04-04 22:12:04 +0000 | [diff] [blame] | 44 | # Detect whether the current target platform is 32-bit or 64-bit, and setup | 
|  | 45 | # the correct commandline flags needed to attempt to target 32-bit and 64-bit. | 
| Alexey Samsonov | 36796b4 | 2012-08-07 12:14:29 +0000 | [diff] [blame] | 46 | if(CMAKE_SIZEOF_VOID_P EQUAL 4 OR LLVM_BUILD_32_BITS) | 
| Alexey Samsonov | 4b0ee8e | 2013-01-18 13:10:42 +0000 | [diff] [blame] | 47 | set(TARGET_64_BIT_CFLAGS "-m64") | 
|  | 48 | set(TARGET_32_BIT_CFLAGS "") | 
| Chandler Carruth | 1f5d5c0 | 2012-04-04 22:12:04 +0000 | [diff] [blame] | 49 | else() | 
|  | 50 | if(NOT CMAKE_SIZEOF_VOID_P EQUAL 8) | 
|  | 51 | message(FATAL_ERROR "Please use a sane architecture with 4 or 8 byte pointers.") | 
|  | 52 | endif() | 
| Alexey Samsonov | 4b0ee8e | 2013-01-18 13:10:42 +0000 | [diff] [blame] | 53 | set(TARGET_64_BIT_CFLAGS "") | 
|  | 54 | set(TARGET_32_BIT_CFLAGS "-m32") | 
| Chandler Carruth | 1f5d5c0 | 2012-04-04 22:12:04 +0000 | [diff] [blame] | 55 | endif() | 
|  | 56 |  | 
| Alexey Samsonov | b670018 | 2013-01-21 14:31:45 +0000 | [diff] [blame] | 57 | # List of architectures we can target. | 
|  | 58 | set(COMPILER_RT_SUPPORTED_ARCH) | 
| Alexey Samsonov | 4b0ee8e | 2013-01-18 13:10:42 +0000 | [diff] [blame] | 59 |  | 
| Alexey Samsonov | 85bd73d | 2012-12-19 15:17:23 +0000 | [diff] [blame] | 60 | function(get_target_flags_for_arch arch out_var) | 
| Alexey Samsonov | 4b0ee8e | 2013-01-18 13:10:42 +0000 | [diff] [blame] | 61 | list(FIND COMPILER_RT_SUPPORTED_ARCH ${arch} ARCH_INDEX) | 
|  | 62 | if(ARCH_INDEX EQUAL -1) | 
| Alexey Samsonov | 85bd73d | 2012-12-19 15:17:23 +0000 | [diff] [blame] | 63 | message(FATAL_ERROR "Unsupported architecture: ${arch}") | 
| Alexey Samsonov | 4b0ee8e | 2013-01-18 13:10:42 +0000 | [diff] [blame] | 64 | else() | 
|  | 65 | set(${out_var} ${TARGET_${arch}_CFLAGS} PARENT_SCOPE) | 
| Alexey Samsonov | 85bd73d | 2012-12-19 15:17:23 +0000 | [diff] [blame] | 66 | endif() | 
|  | 67 | endfunction() | 
|  | 68 |  | 
| Chandler Carruth | 1f5d5c0 | 2012-04-04 22:12:04 +0000 | [diff] [blame] | 69 | # Try to compile a very simple source file to ensure we can target the given | 
|  | 70 | # platform. We use the results of these tests to build only the various target | 
|  | 71 | # runtime libraries supported by our current compilers cross-compiling | 
|  | 72 | # abilities. | 
| Alexey Samsonov | b670018 | 2013-01-21 14:31:45 +0000 | [diff] [blame] | 73 | set(SIMPLE_SOURCE ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/simple.c) | 
|  | 74 | file(WRITE ${SIMPLE_SOURCE} "#include <stdlib.h>\nint main() {}") | 
| Chandler Carruth | 1f5d5c0 | 2012-04-04 22:12:04 +0000 | [diff] [blame] | 75 |  | 
| Alexey Samsonov | b670018 | 2013-01-21 14:31:45 +0000 | [diff] [blame] | 76 | # test_target_arch(<arch> <target flags...>) | 
|  | 77 | # Sets the target flags for a given architecture and determines if this | 
|  | 78 | # architecture is supported by trying to build a simple file. | 
|  | 79 | macro(test_target_arch arch) | 
|  | 80 | set(TARGET_${arch}_CFLAGS ${ARGN}) | 
|  | 81 | try_compile(CAN_TARGET_${arch} ${CMAKE_BINARY_DIR} ${SIMPLE_SOURCE} | 
|  | 82 | COMPILE_DEFINITIONS "${TARGET_${arch}_CFLAGS}" | 
|  | 83 | CMAKE_FLAGS "-DCMAKE_EXE_LINKER_FLAGS:STRING=${TARGET_${arch}_CFLAGS}") | 
|  | 84 | if(${CAN_TARGET_${arch}}) | 
|  | 85 | list(APPEND COMPILER_RT_SUPPORTED_ARCH ${arch}) | 
|  | 86 | endif() | 
|  | 87 | endmacro() | 
|  | 88 |  | 
|  | 89 | if("${LLVM_NATIVE_ARCH}" STREQUAL "X86") | 
|  | 90 | test_target_arch(x86_64 ${TARGET_64_BIT_CFLAGS}) | 
|  | 91 | test_target_arch(i386 ${TARGET_32_BIT_CFLAGS}) | 
|  | 92 | elseif("${LLVM_NATIVE_ARCH}" STREQUAL "PowerPC") | 
|  | 93 | # Explicitly set -m flag on powerpc, because on ppc64 defaults for gcc and | 
|  | 94 | # clang are different. | 
|  | 95 | test_target_arch(powerpc64 "-m64") | 
|  | 96 | test_target_arch(powerpc "-m32") | 
|  | 97 | endif() | 
| Chandler Carruth | 1f5d5c0 | 2012-04-04 22:12:04 +0000 | [diff] [blame] | 98 |  | 
| Alexey Samsonov | c20f5d2 | 2012-12-27 13:19:23 +0000 | [diff] [blame] | 99 | # We only support running instrumented tests when we're not cross compiling | 
|  | 100 | # and target a unix-like system. On Android we define the rules for building | 
|  | 101 | # unit tests, but don't execute them. | 
|  | 102 | if("${CMAKE_HOST_SYSTEM}" STREQUAL "${CMAKE_SYSTEM}" AND UNIX AND NOT ANDROID) | 
| Michael Gottesman | 4ddc215 | 2013-04-01 04:13:03 +0000 | [diff] [blame] | 103 | option(COMPILER_RT_CAN_EXECUTE_TESTS "Can we execute instrumented tests" ON) | 
| Alexey Samsonov | c20f5d2 | 2012-12-27 13:19:23 +0000 | [diff] [blame] | 104 | else() | 
| Michael Gottesman | 4ddc215 | 2013-04-01 04:13:03 +0000 | [diff] [blame] | 105 | option(COMPILER_RT_CAN_EXECUTE_TESTS "Can we execute instrumented tests" OFF) | 
| Alexey Samsonov | c20f5d2 | 2012-12-27 13:19:23 +0000 | [diff] [blame] | 106 | endif() | 
| Michael Gottesman | 4ddc215 | 2013-04-01 04:13:03 +0000 | [diff] [blame] | 107 |  | 
| Alexey Samsonov | 5cb7860 | 2013-02-08 07:39:25 +0000 | [diff] [blame] | 108 | # Check if compiler-rt is built with libc++. | 
|  | 109 | find_flag_in_string("${CMAKE_CXX_FLAGS}" "-stdlib=libc++" | 
|  | 110 | COMPILER_RT_USES_LIBCXX) | 
|  | 111 |  | 
| Alexey Samsonov | fb844c7 | 2012-08-10 14:45:52 +0000 | [diff] [blame] | 112 | function(filter_available_targets out_var) | 
|  | 113 | set(archs) | 
|  | 114 | foreach(arch ${ARGN}) | 
| Alexey Samsonov | 4b0ee8e | 2013-01-18 13:10:42 +0000 | [diff] [blame] | 115 | list(FIND COMPILER_RT_SUPPORTED_ARCH ${arch} ARCH_INDEX) | 
|  | 116 | if(NOT (ARCH_INDEX EQUAL -1) AND CAN_TARGET_${arch}) | 
| Alexey Samsonov | fb844c7 | 2012-08-10 14:45:52 +0000 | [diff] [blame] | 117 | list(APPEND archs ${arch}) | 
|  | 118 | endif() | 
|  | 119 | endforeach() | 
|  | 120 | set(${out_var} ${archs} PARENT_SCOPE) | 
|  | 121 | endfunction() | 
|  | 122 |  | 
| Chandler Carruth | c1c9d58 | 2012-08-29 00:13:11 +0000 | [diff] [blame] | 123 | # Provide some common commmandline flags for Sanitizer runtimes. | 
|  | 124 | set(SANITIZER_COMMON_CFLAGS | 
|  | 125 | -fPIC | 
| Alexey Samsonov | d83ccd0 | 2012-09-05 09:00:03 +0000 | [diff] [blame] | 126 | -fno-builtin | 
| Chandler Carruth | c1c9d58 | 2012-08-29 00:13:11 +0000 | [diff] [blame] | 127 | -fno-exceptions | 
| Alexey Samsonov | d83ccd0 | 2012-09-05 09:00:03 +0000 | [diff] [blame] | 128 | -fomit-frame-pointer | 
| Chandler Carruth | c1c9d58 | 2012-08-29 00:13:11 +0000 | [diff] [blame] | 129 | -funwind-tables | 
| Peter Collingbourne | 5829a98 | 2013-05-08 10:39:05 +0000 | [diff] [blame] | 130 | -fno-stack-protector | 
| Evgeniy Stepanov | ab25369 | 2013-05-23 11:10:23 +0000 | [diff] [blame] | 131 | -Wno-gnu  # Variadic macros with 0 arguments for ... | 
| Alexey Samsonov | d83ccd0 | 2012-09-05 09:00:03 +0000 | [diff] [blame] | 132 | -O3 | 
| Chandler Carruth | c1c9d58 | 2012-08-29 00:13:11 +0000 | [diff] [blame] | 133 | ) | 
| Alexey Samsonov | a555b3f | 2012-09-24 11:43:40 +0000 | [diff] [blame] | 134 | if(NOT WIN32) | 
|  | 135 | list(APPEND SANITIZER_COMMON_CFLAGS -fvisibility=hidden) | 
|  | 136 | endif() | 
| Alexey Samsonov | 75fb677 | 2012-11-08 14:49:28 +0000 | [diff] [blame] | 137 | # Build sanitizer runtimes with debug info. | 
|  | 138 | check_cxx_compiler_flag(-gline-tables-only SUPPORTS_GLINE_TABLES_ONLY_FLAG) | 
|  | 139 | if(SUPPORTS_GLINE_TABLES_ONLY_FLAG) | 
|  | 140 | list(APPEND SANITIZER_COMMON_CFLAGS -gline-tables-only) | 
|  | 141 | else() | 
|  | 142 | list(APPEND SANITIZER_COMMON_CFLAGS -g) | 
|  | 143 | endif() | 
|  | 144 | # Warnings suppressions. | 
| Alexey Samsonov | 3d53c4e | 2012-09-12 08:06:15 +0000 | [diff] [blame] | 145 | check_cxx_compiler_flag(-Wno-variadic-macros SUPPORTS_NO_VARIADIC_MACROS_FLAG) | 
| Chandler Carruth | c1c9d58 | 2012-08-29 00:13:11 +0000 | [diff] [blame] | 146 | if(SUPPORTS_NO_VARIADIC_MACROS_FLAG) | 
|  | 147 | list(APPEND SANITIZER_COMMON_CFLAGS -Wno-variadic-macros) | 
|  | 148 | endif() | 
| Alexey Samsonov | 3d53c4e | 2012-09-12 08:06:15 +0000 | [diff] [blame] | 149 | check_cxx_compiler_flag(-Wno-c99-extensions SUPPORTS_NO_C99_EXTENSIONS_FLAG) | 
| Chandler Carruth | c1c9d58 | 2012-08-29 00:13:11 +0000 | [diff] [blame] | 150 | if(SUPPORTS_NO_C99_EXTENSIONS_FLAG) | 
|  | 151 | list(APPEND SANITIZER_COMMON_CFLAGS -Wno-c99-extensions) | 
|  | 152 | endif() | 
| Alexey Samsonov | acfb82e | 2013-03-25 10:31:49 +0000 | [diff] [blame] | 153 | # Sanitizer may not have libstdc++, so we can have problems with virtual | 
|  | 154 | # destructors. | 
|  | 155 | check_cxx_compiler_flag(-Wno-non-virtual-dtor SUPPORTS_NO_NON_VIRTUAL_DTOR_FLAG) | 
|  | 156 | if (SUPPORTS_NO_NON_VIRTUAL_DTOR_FLAG) | 
|  | 157 | list(APPEND SANITIZER_COMMON_CFLAGS -Wno-non-virtual-dtor) | 
|  | 158 | endif() | 
| Alexey Samsonov | 5cb7860 | 2013-02-08 07:39:25 +0000 | [diff] [blame] | 159 |  | 
|  | 160 | # Setup min Mac OS X version. | 
| Alexey Samsonov | d83ccd0 | 2012-09-05 09:00:03 +0000 | [diff] [blame] | 161 | if(APPLE) | 
| Alexey Samsonov | 5cb7860 | 2013-02-08 07:39:25 +0000 | [diff] [blame] | 162 | if(COMPILER_RT_USES_LIBCXX) | 
|  | 163 | set(SANITIZER_MIN_OSX_VERSION 10.7) | 
|  | 164 | else() | 
|  | 165 | set(SANITIZER_MIN_OSX_VERSION 10.5) | 
|  | 166 | endif() | 
|  | 167 | list(APPEND SANITIZER_COMMON_CFLAGS | 
|  | 168 | -mmacosx-version-min=${SANITIZER_MIN_OSX_VERSION}) | 
| Alexey Samsonov | d83ccd0 | 2012-09-05 09:00:03 +0000 | [diff] [blame] | 169 | endif() | 
| Chandler Carruth | c1c9d58 | 2012-08-29 00:13:11 +0000 | [diff] [blame] | 170 |  | 
| Alexey Samsonov | b068483 | 2013-01-18 16:51:07 +0000 | [diff] [blame] | 171 | # Architectures supported by Sanitizer runtimes. Specific sanitizers may | 
|  | 172 | # support only subset of these (e.g. TSan works on x86_64 only). | 
|  | 173 | filter_available_targets(SANITIZER_COMMON_SUPPORTED_ARCH | 
| Alexey Samsonov | 575c599 | 2013-06-07 09:44:43 +0000 | [diff] [blame^] | 174 | x86_64 i386 powerpc64) | 
| Alexey Samsonov | b068483 | 2013-01-18 16:51:07 +0000 | [diff] [blame] | 175 |  | 
| Chandler Carruth | 1aa4fef | 2012-08-29 02:27:54 +0000 | [diff] [blame] | 176 | # Add the public header's directory to the includes for all of compiler-rt. | 
|  | 177 | include_directories(include) | 
| Alexey Samsonov | 9f3938e | 2013-04-11 15:49:52 +0000 | [diff] [blame] | 178 | add_subdirectory(include) | 
|  | 179 |  | 
|  | 180 | set(SANITIZER_COMMON_LIT_TEST_DEPS | 
|  | 181 | clang clang-headers FileCheck count not llvm-nm llvm-symbolizer | 
|  | 182 | compiler-rt-headers) | 
| Chandler Carruth | 1aa4fef | 2012-08-29 02:27:54 +0000 | [diff] [blame] | 183 |  | 
| Chandler Carruth | 1f5d5c0 | 2012-04-04 22:12:04 +0000 | [diff] [blame] | 184 | add_subdirectory(lib) | 
|  | 185 |  | 
|  | 186 | if(LLVM_INCLUDE_TESTS) | 
| Chandler Carruth | 84ba680 | 2012-06-22 20:17:27 +0000 | [diff] [blame] | 187 | # Currently the tests have not been ported to CMake, so disable this | 
|  | 188 | # directory. | 
|  | 189 | # | 
|  | 190 | #add_subdirectory(test) | 
| Chandler Carruth | 1f5d5c0 | 2012-04-04 22:12:04 +0000 | [diff] [blame] | 191 | endif() |