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 10include(LLVMParseArguments) 11 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. 16cmake_minimum_required(VERSION 2.8.8) 17 18# FIXME: Below we assume that the target build of LLVM/Clang is x86, which is 19# not at all valid. Much of this can be fixed just by switching to use 20# a just-built-clang binary for the compiles. 21 22# Detect whether the current target platform is 32-bit or 64-bit, and setup 23# the correct commandline flags needed to attempt to target 32-bit and 64-bit. 24if(CMAKE_SIZEOF_VOID_P EQUAL 4 OR LLVM_BUILD_32_BITS) 25 set(TARGET_X86_64_CFLAGS "-m64") 26 set(TARGET_I386_CFLAGS "") 27else() 28 if(NOT CMAKE_SIZEOF_VOID_P EQUAL 8) 29 message(FATAL_ERROR "Please use a sane architecture with 4 or 8 byte pointers.") 30 endif() 31 set(TARGET_X86_64_CFLAGS "") 32 set(TARGET_I386_CFLAGS "-m32") 33endif() 34 35# Try to compile a very simple source file to ensure we can target the given 36# platform. We use the results of these tests to build only the various target 37# runtime libraries supported by our current compilers cross-compiling 38# abilities. 39set(SIMPLE_SOURCE64 ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/simple64.c) 40file(WRITE ${SIMPLE_SOURCE64} "#include <stdlib.h>\nint main() {}") 41try_compile(CAN_TARGET_X86_64 ${CMAKE_BINARY_DIR} ${SIMPLE_SOURCE64} 42 COMPILE_DEFINITIONS "${TARGET_X86_64_CFLAGS}" 43 CMAKE_FLAGS "-DCMAKE_EXE_LINKER_FLAGS:STRING=${TARGET_X86_64_CFLAGS}") 44 45set(SIMPLE_SOURCE32 ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/simple32.c) 46file(WRITE ${SIMPLE_SOURCE32} "#include <stdlib.h>\nint main() {}") 47try_compile(CAN_TARGET_I386 ${CMAKE_BINARY_DIR} ${SIMPLE_SOURCE32} 48 COMPILE_DEFINITIONS "${TARGET_I386_CFLAGS}" 49 CMAKE_FLAGS "-DCMAKE_EXE_LINKER_FLAGS:STRING=${TARGET_I386_CFLAGS}") 50 51if(LLVM_ANDROID_TOOLCHAIN_DIR) 52 if(EXISTS ${LLVM_ANDROID_TOOLCHAIN_DIR}/arm-linux-androideabi) 53 set(CAN_TARGET_ARM_ANDROID 1) 54 set(TARGET_ARM_ANDROID_CFLAGS 55 -target arm-linux-androideabi 56 --sysroot=${LLVM_ANDROID_TOOLCHAIN_DIR}/sysroot 57 -B${LLVM_ANDROID_TOOLCHAIN_DIR} 58 ) 59 else() 60 set(CAN_TARGET_ARM_ANDROID 0) 61 endif() 62 # TODO: support i686 and MIPS Android toolchains 63endif() 64 65function(filter_available_targets out_var) 66 set(archs) 67 foreach(arch ${ARGN}) 68 if(${arch} STREQUAL "x86_64" AND CAN_TARGET_X86_64) 69 list(APPEND archs ${arch}) 70 elseif (${arch} STREQUAL "i386" AND CAN_TARGET_I386) 71 list(APPEND archs ${arch}) 72 endif() 73 endforeach() 74 set(${out_var} ${archs} PARENT_SCOPE) 75endfunction() 76 77# Provide some common commmandline flags for Sanitizer runtimes. 78set(SANITIZER_COMMON_CFLAGS 79 -fPIC 80 -fno-builtin 81 -fno-exceptions 82 -fomit-frame-pointer 83 -funwind-tables 84 -fvisibility=hidden 85 -O3 86 ) 87if(SUPPORTS_NO_VARIADIC_MACROS_FLAG) 88 list(APPEND SANITIZER_COMMON_CFLAGS -Wno-variadic-macros) 89endif() 90check_cxx_compiler_flag(-Wno-c99-extensions 91 SUPPORTS_NO_C99_EXTENSIONS_FLAG) 92if(SUPPORTS_NO_C99_EXTENSIONS_FLAG) 93 list(APPEND SANITIZER_COMMON_CFLAGS -Wno-c99-extensions) 94endif() 95if(APPLE) 96 list(APPEND SANITIZER_COMMON_CFLAGS -mmacosx-version-min=10.5) 97endif() 98 99# Because compiler-rt spends a lot of time setting up custom compile flags, 100# define a handy helper function for it. The compile flags setting in CMake 101# has serious issues that make its syntax challenging at best. 102function(set_target_compile_flags target) 103 foreach(arg ${ARGN}) 104 set(argstring "${argstring} ${arg}") 105 endforeach() 106 set_property(TARGET ${target} PROPERTY COMPILE_FLAGS "${argstring}") 107endfunction() 108 109# Add the public header's directory to the includes for all of compiler-rt. 110include_directories(include) 111 112# Build utils before building compiler-rt library. 113add_subdirectory(utils) 114 115add_subdirectory(lib) 116 117if(LLVM_INCLUDE_TESTS) 118 # Currently the tests have not been ported to CMake, so disable this 119 # directory. 120 # 121 #add_subdirectory(test) 122endif() 123