118 lines
4.8 KiB
CMake
118 lines
4.8 KiB
CMake
|
# OS X 10.11 El Capitan has just been released. One of the new features, System
|
||
|
# Integrity Protection, prevents modifying the base OS install, even with sudo.
|
||
|
# This prevents LLVM developers on OS X from being able to easily install new
|
||
|
# system compilers. The feature can be disabled, but to make it easier for
|
||
|
# developers to work without disabling SIP, this file can generate an Xcode
|
||
|
# toolchain. Xcode toolchains are a mostly-undocumented feature that allows
|
||
|
# multiple copies of low level tools to be installed to different locations, and
|
||
|
# users can easily switch between them.
|
||
|
|
||
|
# Setting an environment variable TOOLCHAINS to the toolchain's identifier will
|
||
|
# result in /usr/bin/<tool> or xcrun <tool> to find the tool in the toolchain.
|
||
|
|
||
|
# To make this work with Xcode 7.1 and later you can install the toolchain this
|
||
|
# file generates anywhere on your system and set EXTERNAL_TOOLCHAINS_DIR to the
|
||
|
# path specified by $CMAKE_INSTALL_PREFIX/Toolchains
|
||
|
|
||
|
# This file generates a custom install-xcode-toolchain target which constructs
|
||
|
# and installs a toolchain with the identifier in the pattern:
|
||
|
# org.llvm.${PACKAGE_VERSION}. This toolchain can then be used to override the
|
||
|
# system compiler by setting TOOLCHAINS=org.llvm.${PACKAGE_VERSION} in the
|
||
|
# in the environment.
|
||
|
|
||
|
# Example usage:
|
||
|
# cmake -G Ninja -DLLVM_CREATE_XCODE_TOOLCHAIN=On
|
||
|
# -DCMAKE_INSTALL_PREFIX=$PWD/install
|
||
|
# ninja install-xcode-toolchain
|
||
|
# export EXTERNAL_TOOLCHAINS_DIR=$PWD/install/Toolchains
|
||
|
# export TOOLCHAINS=org.llvm.3.8.0svn
|
||
|
|
||
|
# `xcrun -find clang` should return the installed clang, and `clang --version`
|
||
|
# should show 3.8.0svn.
|
||
|
|
||
|
if(NOT APPLE)
|
||
|
return()
|
||
|
endif()
|
||
|
|
||
|
option(LLVM_CREATE_XCODE_TOOLCHAIN "Create a target to install LLVM into an Xcode toolchain" Off)
|
||
|
|
||
|
if(NOT LLVM_CREATE_XCODE_TOOLCHAIN)
|
||
|
return()
|
||
|
endif()
|
||
|
|
||
|
# XCODE_VERSION is set by CMake when using the Xcode generator, otherwise we need
|
||
|
# to detect it manually here.
|
||
|
if(NOT XCODE_VERSION)
|
||
|
execute_process(
|
||
|
COMMAND xcodebuild -version
|
||
|
OUTPUT_VARIABLE xcodebuild_version
|
||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||
|
ERROR_FILE /dev/null
|
||
|
)
|
||
|
string(REGEX MATCH "Xcode ([0-9][0-9]?([.][0-9])+)" version_match ${xcodebuild_version})
|
||
|
if(version_match)
|
||
|
message(STATUS "Identified Xcode Version: ${CMAKE_MATCH_1}")
|
||
|
set(XCODE_VERSION ${CMAKE_MATCH_1})
|
||
|
else()
|
||
|
# If detecting Xcode version failed, set a crazy high version so we default
|
||
|
# to the newest.
|
||
|
set(XCODE_VERSION 99)
|
||
|
message(WARNING "Failed to detect the version of an installed copy of Xcode, falling back to highest supported version. Set XCODE_VERSION to override.")
|
||
|
endif()
|
||
|
endif()
|
||
|
|
||
|
# Xcode 8 requires CompatibilityVersion 2
|
||
|
set(COMPAT_VERSION 2)
|
||
|
if(XCODE_VERSION VERSION_LESS 8.0.0)
|
||
|
# Xcode 7.3 (the first version supporting external toolchains) requires
|
||
|
# CompatibilityVersion 1
|
||
|
set(COMPAT_VERSION 1)
|
||
|
endif()
|
||
|
|
||
|
execute_process(
|
||
|
COMMAND xcrun -find otool
|
||
|
OUTPUT_VARIABLE clang_path
|
||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||
|
ERROR_FILE /dev/null
|
||
|
)
|
||
|
string(REGEX MATCH "(.*/Toolchains)/.*" toolchains_match ${clang_path})
|
||
|
if(NOT toolchains_match)
|
||
|
message(FATAL_ERROR "Could not identify toolchain dir")
|
||
|
endif()
|
||
|
set(toolchains_dir ${CMAKE_MATCH_1})
|
||
|
|
||
|
set(LLVMToolchainDir "${CMAKE_INSTALL_PREFIX}/Toolchains/LLVM${PACKAGE_VERSION}.xctoolchain/")
|
||
|
|
||
|
add_custom_command(OUTPUT ${LLVMToolchainDir}
|
||
|
COMMAND ${CMAKE_COMMAND} -E make_directory ${LLVMToolchainDir})
|
||
|
|
||
|
add_custom_command(OUTPUT ${LLVMToolchainDir}/Info.plist
|
||
|
DEPENDS ${LLVMToolchainDir}
|
||
|
COMMAND ${CMAKE_COMMAND} -E remove ${LLVMToolchainDir}/Info.plist
|
||
|
COMMAND /usr/libexec/PlistBuddy -c "Add:CFBundleIdentifier string org.llvm.${PACKAGE_VERSION}" "${LLVMToolchainDir}/Info.plist"
|
||
|
COMMAND /usr/libexec/PlistBuddy -c "Add:CompatibilityVersion integer ${COMPAT_VERSION}" "${LLVMToolchainDir}/Info.plist"
|
||
|
)
|
||
|
|
||
|
add_custom_target(build-xcode-toolchain
|
||
|
COMMAND "${CMAKE_COMMAND}" --build ${CMAKE_BINARY_DIR} --target all)
|
||
|
add_llvm_install_targets(install-xcode-toolchain
|
||
|
DEPENDS ${LLVMToolchainDir}/Info.plist build-xcode-toolchain
|
||
|
PREFIX ${LLVMToolchainDir}/usr/)
|
||
|
|
||
|
if(LLVM_DISTRIBUTION_COMPONENTS)
|
||
|
if(LLVM_ENABLE_IDE)
|
||
|
message(FATAL_ERROR "LLVM_DISTRIBUTION_COMPONENTS cannot be specified with multi-configuration generators (i.e. Xcode or Visual Studio)")
|
||
|
endif()
|
||
|
|
||
|
add_custom_target(install-distribution-toolchain
|
||
|
DEPENDS ${LLVMToolchainDir}/Info.plist distribution)
|
||
|
|
||
|
foreach(target ${LLVM_DISTRIBUTION_COMPONENTS})
|
||
|
add_llvm_install_targets(install-distribution-${target}
|
||
|
DEPENDS ${target}
|
||
|
COMPONENT ${target}
|
||
|
PREFIX ${LLVMToolchainDir}/usr/)
|
||
|
add_dependencies(install-distribution-toolchain install-distribution-${target})
|
||
|
endforeach()
|
||
|
endif()
|