Files
swift-mirror/tools/SourceKit/CMakeLists.txt
Argyrios Kyrtzidis 3156180c08 [SourceKit] For the XPC service identifier, also include the platform name
This is useful because the embedded platforms may have the same toolchain version but they contain
different stdlibs. We need to make sure the XPC service name is unique between them, otherwise we may load
and use the incorrect toolchain service.

rdar://39077520
2018-04-10 11:24:55 -07:00

161 lines
7.2 KiB
CMake

include(CheckSymbolExists)
# Append our own modules to the module path.
list(APPEND CMAKE_MODULE_PATH
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules")
if (DARWIN_TOOLCHAIN_VERSION)
set(SOURCEKIT_VERSION_STRING "${DARWIN_TOOLCHAIN_VERSION}")
else()
set(SOURCEKIT_VERSION_STRING "${SWIFT_COMPILER_VERSION}")
endif()
set(SOURCEKIT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
set(SOURCEKIT_BINARY_DIR ${SWIFT_BINARY_DIR})
set(SOURCEKIT_RUNTIME_OUTPUT_INTDIR "${SWIFT_RUNTIME_OUTPUT_INTDIR}")
set(SOURCEKIT_LIBRARY_OUTPUT_INTDIR "${SWIFT_LIBRARY_OUTPUT_INTDIR}")
check_symbol_exists(dispatch_block_create "dispatch/dispatch.h" HAVE_DISPATCH_BLOCK_CREATE)
configure_file(
${SOURCEKIT_SOURCE_DIR}/include/SourceKit/Config/config.h.cmake
${SOURCEKIT_BINARY_DIR}/include/SourceKit/Config/config.h)
set(SOURCEKIT_DEPLOYMENT_OS "${SWIFT_HOST_VARIANT}")
set(SOURCEKIT_DEPLOYMENT_TARGET "${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_DEPLOYMENT_VERSION}")
STRING(TOLOWER "${SWIFT_PRIMARY_VARIANT_SDK}" SOURCEKIT_PLATFORM_NAME)
# Remove '_simulator' from the name if it exists
STRING(REPLACE "_simulator" "" SOURCEKIT_PLATFORM_NAME "${SOURCEKIT_PLATFORM_NAME}")
if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin" AND NOT CMAKE_CROSSCOMPILING)
set(CMAKE_OSX_SYSROOT "${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_PATH}")
set(CMAKE_OSX_ARCHITECTURES "${SWIFT_HOST_VARIANT_ARCH}")
set(CMAKE_OSX_DEPLOYMENT_TARGET "")
endif()
# Now include AddSwiftSourceKit
include(AddSwiftSourceKit)
if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")
# Choose a deployment target if none was set.
set(SOURCEKIT_DEPLOYMENT_TARGET "" CACHE STRING
"Deployment target for SourceKit.")
if (NOT SOURCEKIT_DEPLOYMENT_TARGET)
execute_process(COMMAND sw_vers -productVersion
OUTPUT_VARIABLE SOURCEKIT_DEPLOYMENT_TARGET
OUTPUT_STRIP_TRAILING_WHITESPACE)
string(REGEX MATCH "[0-9]+\\.[0-9]+" SOURCEKIT_DEPLOYMENT_TARGET ${SOURCEKIT_DEPLOYMENT_TARGET})
endif()
# Sadly there are two OS naming conventions.
# xcrun SDK name: macosx iphoneos iphonesimulator (+ "internal" or version)
# -mOS-version-min: macosx ios ios-simulator
if (SOURCEKIT_DEPLOYMENT_OS MATCHES "^iphoneos")
set(version_min_os "ios")
set(triple_os "ios")
set(SOURCEKIT_DEFAULT_TARGET_SDK "IOS")
elseif (SOURCEKIT_DEPLOYMENT_OS MATCHES "^iphonesimulator")
set(version_min_os "ios-simulator")
set(triple_os "ios")
set(SOURCEKIT_DEFAULT_TARGET_SDK "IOS_SIMULATOR")
elseif (SOURCEKIT_DEPLOYMENT_OS MATCHES "^macosx")
set(version_min_os "macosx")
set(triple_os "macosx")
set(SOURCEKIT_DEFAULT_TARGET_SDK "OSX")
else()
message(FATAL_ERROR "Can't understand SOURCEKIT_DEPLOYMENT_OS '${SOURCEKIT_DEPLOYMENT_OS}';")
endif()
# Add deployment target to C/C++ compiler and linker flags.
# FIXME: CMAKE_OSX_DEPLOYMENT_TARGET falls over when used for iOS versions.
if (XCODE)
if (${SOURCEKIT_DEPLOYMENT_OS} MATCHES "^macosx")
set(CMAKE_XCODE_ATTRIBUTE_MACOSX_DEPLOYMENT_TARGET ${SOURCEKIT_DEPLOYMENT_TARGET})
else()
set(CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET ${SOURCEKIT_DEPLOYMENT_TARGET})
endif()
else()
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m${version_min_os}-version-min=${SOURCEKIT_DEPLOYMENT_TARGET}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m${version_min_os}-version-min=${SOURCEKIT_DEPLOYMENT_TARGET}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -m${version_min_os}-version-min=${SOURCEKIT_DEPLOYMENT_TARGET}")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -m${version_min_os}-version-min=${SOURCEKIT_DEPLOYMENT_TARGET}")
endif()
endif()
include_directories(BEFORE
${SOURCEKIT_BINARY_DIR}/include
${SOURCEKIT_SOURCE_DIR}/include
${SOURCEKIT_BINARY_DIR}/tools/SourceKit/include
)
if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
if(SWIFT_BUILD_SOURCEKIT)
include(ExternalProject)
ExternalProject_Add(libdispatch
SOURCE_DIR
"${SWIFT_PATH_TO_LIBDISPATCH_SOURCE}"
BINARY_DIR
"${SWIFT_PATH_TO_LIBDISPATCH_BUILD}"
CMAKE_ARGS
-DCMAKE_C_COMPILER=${PATH_TO_CLANG_BUILD}/bin/clang
-DCMAKE_CXX_COMPILER=${PATH_TO_CLANG_BUILD}/bin/clang++
-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}
-DCMAKE_SWIFT_COMPILER=$<TARGET_FILE:swift>c
-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
-DENABLE_SWIFT=YES
BUILD_BYPRODUCTS
${SWIFT_PATH_TO_LIBDISPATCH_BUILD}/src/${CMAKE_SHARED_LIBRARY_PREFIX}dispatch${CMAKE_SHARED_LIBRARY_SUFFIX}
${SWIFT_PATH_TO_LIBDISPATCH_BUILD}/${CMAKE_STATIC_LIBRARY_PREFIX}BlocksRuntime${CMAKE_STATIC_LIBRARY_SUFFIX}
STEP_TARGETS
configure
BUILD_ALWAYS
1)
# CMake does not like the addition of INTERFACE_INCLUDE_DIRECTORIES without
# the directory existing. Just create the location which will be populated
# during the installation.
ExternalProject_Get_Property(libdispatch install_dir)
file(MAKE_DIRECTORY ${install_dir}/include)
# TODO(compnerd) this should be taken care of by the
# INTERFACE_INCLUDE_DIRECTORIES below
include_directories(AFTER
${SWIFT_PATH_TO_LIBDISPATCH_SOURCE}/src/BlocksRuntime
${SWIFT_PATH_TO_LIBDISPATCH_SOURCE})
add_dependencies(libdispatch
swift
copy_shim_headers
swiftCore-${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_LIB_SUBDIR}-${SWIFT_HOST_VARIANT_ARCH}
swiftSwiftOnoneSupport-${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_LIB_SUBDIR}-${SWIFT_HOST_VARIANT_ARCH}
swiftCore-swiftmodule-${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_LIB_SUBDIR}-${SWIFT_HOST_VARIANT_ARCH}
swiftSwiftOnoneSupport-swiftmodule-${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_LIB_SUBDIR}-${SWIFT_HOST_VARIANT_ARCH})
endif()
ExternalProject_Get_Property(libdispatch install_dir)
add_library(dispatch SHARED IMPORTED)
set_target_properties(dispatch
PROPERTIES
IMPORTED_LOCATION
${SWIFT_PATH_TO_LIBDISPATCH_BUILD}/src/${CMAKE_SHARED_LIBRARY_PREFIX}dispatch${CMAKE_SHARED_LIBRARY_SUFFIX}
INTERFACE_INCLUDE_DIRECTORIES
${install_dir}/include
IMPORTED_LINK_INTERFACE_LIBRARIES
swiftCore-${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_LIB_SUBDIR}-${SWIFT_HOST_VARIANT_ARCH})
add_library(BlocksRuntime STATIC IMPORTED)
set_target_properties(BlocksRuntime
PROPERTIES
IMPORTED_LOCATION
${SWIFT_PATH_TO_LIBDISPATCH_BUILD}/${CMAKE_STATIC_LIBRARY_PREFIX}BlocksRuntime${CMAKE_STATIC_LIBRARY_SUFFIX}
INTERFACE_INCLUDE_DIRECTORIES
${SWIFT_PATH_TO_LIBDISPATCH_SOURCE}/src/BlocksRuntime)
set(SOURCEKIT_NEED_EXPLICIT_LIBDISPATCH TRUE)
endif()
add_subdirectory(include)
add_subdirectory(lib)
add_subdirectory(tools)