13cab2bb3Spatrick# The CompilerRT build system requires CMake version 2.8.8 or higher in order 23cab2bb3Spatrick# to use its support for building convenience "libraries" as a collection of 33cab2bb3Spatrick# .o files. This is particularly useful in producing larger, more complex 43cab2bb3Spatrick# runtime libraries. 53cab2bb3Spatrick 6*810390e3Srobertinclude(BuiltinTests) 73cab2bb3Spatrickinclude(CheckIncludeFile) 83cab2bb3Spatrickinclude(CheckCXXSourceCompiles) 9*810390e3Srobertinclude(GNUInstallDirs) 10*810390e3Srobertinclude(ExtendPath) 11*810390e3Srobertinclude(CompilerRTDarwinUtils) 123cab2bb3Spatrick 133cab2bb3Spatrickcheck_include_file(unwind.h HAVE_UNWIND_H) 143cab2bb3Spatrick 153cab2bb3Spatrick# Used by sanitizer_common and tests. 163cab2bb3Spatrickcheck_include_file(rpc/xdr.h HAVE_RPC_XDR_H) 173cab2bb3Spatrickif (NOT HAVE_RPC_XDR_H) 183cab2bb3Spatrick set(HAVE_RPC_XDR_H 0) 193cab2bb3Spatrickendif() 203cab2bb3Spatrick 213cab2bb3Spatrick# Top level target used to build all compiler-rt libraries. 223cab2bb3Spatrickadd_custom_target(compiler-rt ALL) 233cab2bb3Spatrickadd_custom_target(install-compiler-rt) 243cab2bb3Spatrickadd_custom_target(install-compiler-rt-stripped) 253cab2bb3Spatrickset_property( 263cab2bb3Spatrick TARGET 273cab2bb3Spatrick compiler-rt 283cab2bb3Spatrick install-compiler-rt 293cab2bb3Spatrick install-compiler-rt-stripped 303cab2bb3Spatrick PROPERTY 313cab2bb3Spatrick FOLDER "Compiler-RT Misc" 323cab2bb3Spatrick) 333cab2bb3Spatrick 343cab2bb3Spatrick# Setting these variables from an LLVM build is sufficient that compiler-rt can 353cab2bb3Spatrick# construct the output paths, so it can behave as if it were in-tree here. 363cab2bb3Spatrickif (LLVM_LIBRARY_OUTPUT_INTDIR AND LLVM_RUNTIME_OUTPUT_INTDIR AND PACKAGE_VERSION) 373cab2bb3Spatrick set(LLVM_TREE_AVAILABLE On) 383cab2bb3Spatrickendif() 393cab2bb3Spatrick 403cab2bb3Spatrickif (LLVM_TREE_AVAILABLE) 413cab2bb3Spatrick # Compute the Clang version from the LLVM version. 42*810390e3Srobert # FIXME: We should be able to reuse CLANG_VERSION_MAJOR variable calculated 433cab2bb3Spatrick # in Clang cmake files, instead of copying the rules here. 44*810390e3Srobert string(REGEX MATCH "^[0-9]+" CLANG_VERSION_MAJOR 453cab2bb3Spatrick ${PACKAGE_VERSION}) 463cab2bb3Spatrick # Setup the paths where compiler-rt runtimes and headers should be stored. 47*810390e3Srobert set(COMPILER_RT_OUTPUT_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}/clang/${CLANG_VERSION_MAJOR}) 483cab2bb3Spatrick set(COMPILER_RT_EXEC_OUTPUT_DIR ${LLVM_RUNTIME_OUTPUT_INTDIR}) 49*810390e3Srobert set(COMPILER_RT_INSTALL_PATH lib${LLVM_LIBDIR_SUFFIX}/clang/${CLANG_VERSION_MAJOR}) 503cab2bb3Spatrick option(COMPILER_RT_INCLUDE_TESTS "Generate and build compiler-rt unit tests." 513cab2bb3Spatrick ${LLVM_INCLUDE_TESTS}) 523cab2bb3Spatrick option(COMPILER_RT_ENABLE_WERROR "Fail and stop if warning is triggered" 533cab2bb3Spatrick ${LLVM_ENABLE_WERROR}) 543cab2bb3Spatrick 553cab2bb3Spatrick # Use just-built Clang to compile/link tests on all platforms. 563cab2bb3Spatrick if (CMAKE_CROSSCOMPILING) 573cab2bb3Spatrick if (CMAKE_HOST_WIN32) 583cab2bb3Spatrick set(_host_executable_suffix ".exe") 593cab2bb3Spatrick else() 603cab2bb3Spatrick set(_host_executable_suffix "") 613cab2bb3Spatrick endif() 623cab2bb3Spatrick else() 633cab2bb3Spatrick set(_host_executable_suffix ${CMAKE_EXECUTABLE_SUFFIX}) 643cab2bb3Spatrick endif() 653cab2bb3Spatrick set(COMPILER_RT_TEST_COMPILER 663cab2bb3Spatrick ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang${_host_executable_suffix}) 673cab2bb3Spatrick set(COMPILER_RT_TEST_CXX_COMPILER 683cab2bb3Spatrick ${LLVM_RUNTIME_OUTPUT_INTDIR}/clang++${_host_executable_suffix}) 693cab2bb3Spatrickelse() 703cab2bb3Spatrick # Take output dir and install path from the user. 713cab2bb3Spatrick set(COMPILER_RT_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR} CACHE PATH 723cab2bb3Spatrick "Path where built compiler-rt libraries should be stored.") 733cab2bb3Spatrick set(COMPILER_RT_EXEC_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR}/bin CACHE PATH 743cab2bb3Spatrick "Path where built compiler-rt executables should be stored.") 75d89ec533Spatrick set(COMPILER_RT_INSTALL_PATH "" CACHE PATH 76d89ec533Spatrick "Prefix for directories where built compiler-rt artifacts should be installed.") 773cab2bb3Spatrick option(COMPILER_RT_INCLUDE_TESTS "Generate and build compiler-rt unit tests." OFF) 783cab2bb3Spatrick option(COMPILER_RT_ENABLE_WERROR "Fail and stop if warning is triggered" OFF) 793cab2bb3Spatrick # Use a host compiler to compile/link tests. 803cab2bb3Spatrick set(COMPILER_RT_TEST_COMPILER ${CMAKE_C_COMPILER} CACHE PATH "Compiler to use for testing") 813cab2bb3Spatrick set(COMPILER_RT_TEST_CXX_COMPILER ${CMAKE_CXX_COMPILER} CACHE PATH "C++ Compiler to use for testing") 823cab2bb3Spatrickendif() 833cab2bb3Spatrick 843cab2bb3Spatrickif("${COMPILER_RT_TEST_COMPILER}" MATCHES "clang[+]*$") 853cab2bb3Spatrick set(COMPILER_RT_TEST_COMPILER_ID Clang) 863cab2bb3Spatrickelseif("${COMPILER_RT_TEST_COMPILER}" MATCHES "clang.*.exe$") 873cab2bb3Spatrick set(COMPILER_RT_TEST_COMPILER_ID Clang) 883cab2bb3Spatrickelse() 893cab2bb3Spatrick set(COMPILER_RT_TEST_COMPILER_ID GNU) 903cab2bb3Spatrickendif() 913cab2bb3Spatrick 923cab2bb3Spatrickif(NOT DEFINED COMPILER_RT_OS_DIR) 93*810390e3Srobert if(ANDROID) 94*810390e3Srobert # The CMAKE_SYSTEM_NAME for Android is Android, but the OS is Linux and the 95*810390e3Srobert # driver will search for compiler-rt libraries in the "linux" directory. 96*810390e3Srobert set(COMPILER_RT_OS_DIR linux) 97*810390e3Srobert else() 983cab2bb3Spatrick string(TOLOWER ${CMAKE_SYSTEM_NAME} COMPILER_RT_OS_DIR) 993cab2bb3Spatrick endif() 100*810390e3Srobertendif() 1013cab2bb3Spatrickif(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE) 102d89ec533Spatrick set(COMPILER_RT_OUTPUT_LIBRARY_DIR 103d89ec533Spatrick ${COMPILER_RT_OUTPUT_DIR}/lib) 104*810390e3Srobert extend_path(default_install_path "${COMPILER_RT_INSTALL_PATH}" lib) 105d89ec533Spatrick set(COMPILER_RT_INSTALL_LIBRARY_DIR "${default_install_path}" CACHE PATH 106d89ec533Spatrick "Path where built compiler-rt libraries should be installed.") 107d89ec533Spatrickelse(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR AND NOT APPLE) 108d89ec533Spatrick set(COMPILER_RT_OUTPUT_LIBRARY_DIR 1093cab2bb3Spatrick ${COMPILER_RT_OUTPUT_DIR}/lib/${COMPILER_RT_OS_DIR}) 110*810390e3Srobert extend_path(default_install_path "${COMPILER_RT_INSTALL_PATH}" "lib/${COMPILER_RT_OS_DIR}") 111d89ec533Spatrick set(COMPILER_RT_INSTALL_LIBRARY_DIR "${default_install_path}" CACHE PATH 112d89ec533Spatrick "Path where built compiler-rt libraries should be installed.") 1133cab2bb3Spatrickendif() 114*810390e3Srobertextend_path(default_install_path "${COMPILER_RT_INSTALL_PATH}" "${CMAKE_INSTALL_BINDIR}") 115d89ec533Spatrickset(COMPILER_RT_INSTALL_BINARY_DIR "${default_install_path}" CACHE PATH 116d89ec533Spatrick "Path where built compiler-rt executables should be installed.") 117*810390e3Srobertextend_path(default_install_path "${COMPILER_RT_INSTALL_PATH}" "${CMAKE_INSTALL_INCLUDEDIR}") 118d89ec533Spatrickset(COMPILER_RT_INSTALL_INCLUDE_DIR "${default_install_path}" CACHE PATH 119d89ec533Spatrick "Path where compiler-rt headers should be installed.") 120*810390e3Srobertextend_path(default_install_path "${COMPILER_RT_INSTALL_PATH}" "${CMAKE_INSTALL_DATADIR}") 121d89ec533Spatrickset(COMPILER_RT_INSTALL_DATA_DIR "${default_install_path}" CACHE PATH 122d89ec533Spatrick "Path where compiler-rt data files should be installed.") 1233cab2bb3Spatrick 1243cab2bb3Spatrickif(APPLE) 1253cab2bb3Spatrick # On Darwin if /usr/include/c++ doesn't exist, the user probably has Xcode but 1263cab2bb3Spatrick # not the command line tools (or is using macOS 10.14 or newer). If this is 1273cab2bb3Spatrick # the case, we need to find the OS X sysroot to pass to clang. 1283cab2bb3Spatrick if(NOT EXISTS /usr/include/c++) 1293cab2bb3Spatrick execute_process(COMMAND xcrun -sdk macosx --show-sdk-path 1303cab2bb3Spatrick OUTPUT_VARIABLE OSX_SYSROOT 1313cab2bb3Spatrick ERROR_QUIET 1323cab2bb3Spatrick OUTPUT_STRIP_TRAILING_WHITESPACE) 1333cab2bb3Spatrick if (NOT OSX_SYSROOT OR NOT EXISTS ${OSX_SYSROOT}) 1343cab2bb3Spatrick message(WARNING "Detected OSX_SYSROOT ${OSX_SYSROOT} does not exist") 1353cab2bb3Spatrick else() 1363cab2bb3Spatrick message(STATUS "Found OSX_SYSROOT: ${OSX_SYSROOT}") 1373cab2bb3Spatrick set(OSX_SYSROOT_FLAG "-isysroot${OSX_SYSROOT}") 1383cab2bb3Spatrick endif() 1393cab2bb3Spatrick else() 1403cab2bb3Spatrick set(OSX_SYSROOT_FLAG "") 1413cab2bb3Spatrick endif() 1423cab2bb3Spatrick 143*810390e3Srobert try_compile_only(COMPILER_RT_HAS_DARWIN_TARGET_VARIANT_FLAG 144*810390e3Srobert FLAGS 145*810390e3Srobert "-target" "x86_64-apple-macos10.15" 146*810390e3Srobert "-darwin-target-variant" "x86_64-apple-ios13.1-macabi" 147*810390e3Srobert "-Werror") 148*810390e3Srobert option(COMPILER_RT_ENABLE_MACCATALYST "Enable building for Mac Catalyst" ${COMPILER_RT_HAS_DARWIN_TARGET_VARIANT_FLAG}) 149*810390e3Srobert 150*810390e3Srobert # Don't enable COMPILER_RT_ENABLE_IOS if we can't find the sdk dir. 151*810390e3Srobert # This can happen when you only have the commandline tools installed 152*810390e3Srobert # which doesn't come with the iOS SDK. 153*810390e3Srobert find_darwin_sdk_dir(HAS_IOS_SDK "iphoneos") 154*810390e3Srobert set(COMPILER_RT_ENABLE_IOS_DEFAULT On) 155*810390e3Srobert if("${HAS_IOS_SDK}" STREQUAL "") 156*810390e3Srobert message(WARNING "iOS SDK not found! Building compiler-rt without iOS support.") 157*810390e3Srobert set(COMPILER_RT_ENABLE_IOS_DEFAULT Off) 158*810390e3Srobert endif() 159*810390e3Srobert option(COMPILER_RT_ENABLE_IOS "Enable building for iOS" ${COMPILER_RT_ENABLE_IOS_DEFAULT}) 160*810390e3Srobert 1613cab2bb3Spatrick option(COMPILER_RT_ENABLE_WATCHOS "Enable building for watchOS - Experimental" Off) 1623cab2bb3Spatrick option(COMPILER_RT_ENABLE_TVOS "Enable building for tvOS - Experimental" Off) 1633cab2bb3Spatrick 1643cab2bb3Spatrickelse() 1653cab2bb3Spatrick option(COMPILER_RT_DEFAULT_TARGET_ONLY "Build builtins only for the default target" Off) 1663cab2bb3Spatrickendif() 1673cab2bb3Spatrick 1683cab2bb3Spatrickif(WIN32 AND NOT MINGW AND NOT CYGWIN) 1693cab2bb3Spatrick set(CMAKE_SHARED_LIBRARY_PREFIX_C "") 1703cab2bb3Spatrick set(CMAKE_SHARED_LIBRARY_PREFIX_CXX "") 1713cab2bb3Spatrick set(CMAKE_STATIC_LIBRARY_PREFIX_C "") 1723cab2bb3Spatrick set(CMAKE_STATIC_LIBRARY_PREFIX_CXX "") 1733cab2bb3Spatrick set(CMAKE_STATIC_LIBRARY_SUFFIX_C ".lib") 1743cab2bb3Spatrick set(CMAKE_STATIC_LIBRARY_SUFFIX_CXX ".lib") 1753cab2bb3Spatrickendif() 1763cab2bb3Spatrick 1773cab2bb3Spatrickmacro(test_targets) 1783cab2bb3Spatrick # Find and run MSVC (not clang-cl) and get its version. This will tell clang-cl 1793cab2bb3Spatrick # what version of MSVC to pretend to be so that the STL works. 1803cab2bb3Spatrick set(MSVC_VERSION_FLAG "") 1813cab2bb3Spatrick if (MSVC) 1823cab2bb3Spatrick execute_process(COMMAND "$ENV{VSINSTALLDIR}/VC/bin/cl.exe" 1833cab2bb3Spatrick OUTPUT_QUIET 1843cab2bb3Spatrick ERROR_VARIABLE MSVC_COMPAT_VERSION 1853cab2bb3Spatrick ) 1863cab2bb3Spatrick string(REGEX REPLACE "^.*Compiler Version ([0-9.]+) for .*$" "\\1" 1873cab2bb3Spatrick MSVC_COMPAT_VERSION "${MSVC_COMPAT_VERSION}") 1883cab2bb3Spatrick if (MSVC_COMPAT_VERSION MATCHES "^[0-9].+$") 1893cab2bb3Spatrick set(MSVC_VERSION_FLAG "-fms-compatibility-version=${MSVC_COMPAT_VERSION}") 1903cab2bb3Spatrick # Add this flag into the host build if this is clang-cl. 1913cab2bb3Spatrick if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") 1923cab2bb3Spatrick append("${MSVC_VERSION_FLAG}" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) 1933cab2bb3Spatrick elseif (COMPILER_RT_TEST_COMPILER_ID MATCHES "Clang") 1943cab2bb3Spatrick # Add this flag to test compiles to suppress clang's auto-detection 1953cab2bb3Spatrick # logic. 1963cab2bb3Spatrick append("${MSVC_VERSION_FLAG}" COMPILER_RT_TEST_COMPILER_CFLAGS) 1973cab2bb3Spatrick endif() 1983cab2bb3Spatrick endif() 1993cab2bb3Spatrick endif() 2003cab2bb3Spatrick 2013cab2bb3Spatrick # Generate the COMPILER_RT_SUPPORTED_ARCH list. 2023cab2bb3Spatrick if(ANDROID) 2033cab2bb3Spatrick # Examine compiler output to determine target architecture. 2043cab2bb3Spatrick detect_target_arch() 2053cab2bb3Spatrick set(COMPILER_RT_OS_SUFFIX "-android") 2063cab2bb3Spatrick elseif(NOT APPLE) # Supported archs for Apple platforms are generated later 2073cab2bb3Spatrick if(COMPILER_RT_DEFAULT_TARGET_ONLY) 2083cab2bb3Spatrick add_default_target_arch(${COMPILER_RT_DEFAULT_TARGET_ARCH}) 2093cab2bb3Spatrick elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "i[2-6]86|x86|amd64") 2103cab2bb3Spatrick if(NOT MSVC) 2113cab2bb3Spatrick test_target_arch(x86_64 "" "-m64") 2123cab2bb3Spatrick test_target_arch(i386 __i386__ "-m32") 2133cab2bb3Spatrick else() 2143cab2bb3Spatrick if (CMAKE_SIZEOF_VOID_P EQUAL 4) 2153cab2bb3Spatrick test_target_arch(i386 "" "") 2163cab2bb3Spatrick else() 2173cab2bb3Spatrick test_target_arch(x86_64 "" "") 2183cab2bb3Spatrick endif() 2193cab2bb3Spatrick endif() 220*810390e3Srobert elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "loongarch64") 221*810390e3Srobert test_target_arch(loongarch64 "" "") 222*810390e3Srobert elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "powerpc64le|ppc64le") 2233cab2bb3Spatrick test_target_arch(powerpc64le "" "-m64") 224d89ec533Spatrick elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "powerpc") 225d89ec533Spatrick test_target_arch(powerpc "" "-m32") 226d89ec533Spatrick test_target_arch(powerpc64 "" "-m64") 2273cab2bb3Spatrick elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "s390x") 2283cab2bb3Spatrick test_target_arch(s390x "" "") 2293cab2bb3Spatrick elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "sparc") 2303cab2bb3Spatrick test_target_arch(sparc "" "-m32") 2313cab2bb3Spatrick test_target_arch(sparcv9 "" "-m64") 232*810390e3Srobert elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "mips") 2333cab2bb3Spatrick # FIXME: Ideally, we would build the N32 library too. 234*810390e3Srobert if("${COMPILER_RT_MIPS_EL}" AND ("${COMPILER_RT_MIPS32R6}" OR "${COMPILER_RT_MIPS64R6}")) 235*810390e3Srobert test_target_arch(mipsel "" "-mips32r6" "-mabi=32" "-D_LARGEFILE_SOURCE" "-D_FILE_OFFSET_BITS=64") 236*810390e3Srobert test_target_arch(mips64el "" "-mips64r6" "-mabi=64") 237*810390e3Srobert elseif("${COMPILER_RT_MIPS_EL}") 2383cab2bb3Spatrick test_target_arch(mipsel "" "-mips32r2" "-mabi=32" "-D_LARGEFILE_SOURCE" "-D_FILE_OFFSET_BITS=64") 2393cab2bb3Spatrick test_target_arch(mips64el "" "-mips64r2" "-mabi=64") 240*810390e3Srobert elseif("${COMPILER_RT_MIPS32R6}" OR "${COMPILER_RT_MIPS64R6}") 241*810390e3Srobert test_target_arch(mips "" "-mips32r6" "-mabi=32" "-D_LARGEFILE_SOURCE" "-D_FILE_OFFSET_BITS=64") 242*810390e3Srobert test_target_arch(mips64 "" "-mips64r6" "-mabi=64") 243*810390e3Srobert else() 2443cab2bb3Spatrick test_target_arch(mips "" "-mips32r2" "-mabi=32" "-D_LARGEFILE_SOURCE" "-D_FILE_OFFSET_BITS=64") 2453cab2bb3Spatrick test_target_arch(mips64 "" "-mips64r2" "-mabi=64") 246*810390e3Srobert endif() 2473cab2bb3Spatrick elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "arm") 2483cab2bb3Spatrick if(WIN32) 2493cab2bb3Spatrick test_target_arch(arm "" "" "") 2503cab2bb3Spatrick else() 251*810390e3Srobert test_target_arch(armv4t "" "-march=armv4t" "-mfloat-abi=soft") 252*810390e3Srobert test_target_arch(armv6m "" "-march=armv6m" "-mfloat-abi=soft") 2533cab2bb3Spatrick test_target_arch(arm "" "-march=armv7-a" "-mfloat-abi=soft") 2543cab2bb3Spatrick test_target_arch(armhf "" "-march=armv7-a" "-mfloat-abi=hard") 2553cab2bb3Spatrick endif() 256*810390e3Srobert elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "avr") 257*810390e3Srobert test_target_arch(avr "__AVR__" "--target=avr") 2583cab2bb3Spatrick elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "aarch32") 2593cab2bb3Spatrick test_target_arch(aarch32 "" "-march=armv8-a") 2603cab2bb3Spatrick elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "aarch64") 2613cab2bb3Spatrick test_target_arch(aarch64 "" "-march=armv8-a") 2623cab2bb3Spatrick elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "riscv32") 2633cab2bb3Spatrick test_target_arch(riscv32 "" "") 2643cab2bb3Spatrick elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "riscv64") 2653cab2bb3Spatrick test_target_arch(riscv64 "" "") 2663cab2bb3Spatrick elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "wasm32") 2673cab2bb3Spatrick test_target_arch(wasm32 "" "--target=wasm32-unknown-unknown") 2683cab2bb3Spatrick elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "wasm64") 2693cab2bb3Spatrick test_target_arch(wasm64 "" "--target=wasm64-unknown-unknown") 2701f9cb04fSpatrick elseif("${COMPILER_RT_DEFAULT_TARGET_ARCH}" MATCHES "ve") 2711f9cb04fSpatrick test_target_arch(ve "__ve__" "--target=ve-unknown-none") 2723cab2bb3Spatrick endif() 2733cab2bb3Spatrick set(COMPILER_RT_OS_SUFFIX "") 2743cab2bb3Spatrick endif() 2753cab2bb3Spatrickendmacro() 276