| # Add default compiler and linker flags to 'target'. |
| # |
| # FIXME: this is a HACK. All SourceKit CMake code using this function should be |
| # rewritten to use 'add_swift_host_library' or 'add_swift_target_library'. |
| function(add_sourcekit_default_compiler_flags target) |
| # Add variant-specific flags. |
| _add_host_variant_c_compile_flags(${target}) |
| _add_host_variant_link_flags(${target}) |
| |
| # SWIFT_ENABLE_TENSORFLOW |
| if(SWIFT_ENABLE_TENSORFLOW) |
| if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin") |
| # FIXME: This is a hack: adding rpaths with many `..` that jump across |
| # frameworks is bad practice. It would be cleaner/more robust to copy |
| # the TensorFlow libraries to sourcekitd.framework. |
| set_target_properties(${target} PROPERTIES |
| INSTALL_RPATH "@loader_path/../../../swift/${SOURCEKIT_DEPLOYMENT_OS};@loader_path/../../../../../../../swift/${SOURCEKIT_DEPLOYMENT_OS}") |
| endif() |
| endif() |
| |
| # Set compilation and link flags. |
| if(${SWIFT_HOST_VARIANT_SDK} STREQUAL WINDOWS) |
| swift_windows_include_for_arch(${SWIFT_HOST_VARIANT_ARCH} |
| ${SWIFT_HOST_VARIANT_ARCH}_INCLUDE) |
| target_include_directories(${target} SYSTEM PRIVATE |
| ${${SWIFT_HOST_VARIANT_ARCH}_INCLUDE}) |
| endif() |
| target_compile_options(${target} PRIVATE |
| -fblocks) |
| endfunction() |
| |
| # Add a new SourceKit library. |
| # |
| # Usage: |
| # add_sourcekit_library(name # Name of the library |
| # [DEPENDS dep1 ...] # Targets this library depends on |
| # [LLVM_LINK_COMPONENTS comp1 ...] # LLVM components this library depends on |
| # [INSTALL_IN_COMPONENT comp] # The Swift installation component that this library belongs to. |
| # [SHARED] |
| # source1 [source2 source3 ...]) # Sources to add into this library |
| macro(add_sourcekit_library name) |
| cmake_parse_arguments(SOURCEKITLIB |
| "SHARED" |
| "INSTALL_IN_COMPONENT" |
| "HEADERS;DEPENDS;LLVM_LINK_COMPONENTS" |
| ${ARGN}) |
| set(srcs ${SOURCEKITLIB_UNPARSED_ARGUMENTS}) |
| |
| llvm_process_sources(srcs ${srcs}) |
| if(MSVC_IDE OR XCODE) |
| # Add public headers |
| file(RELATIVE_PATH lib_path |
| ${SOURCEKIT_SOURCE_DIR}/lib/ |
| ${CMAKE_CURRENT_SOURCE_DIR} |
| ) |
| if(NOT lib_path MATCHES "^[.][.]") |
| file(GLOB_RECURSE headers |
| ${SOURCEKIT_SOURCE_DIR}/include/SourceKit/${lib_path}/*.h |
| ${SOURCEKIT_SOURCE_DIR}/include/SourceKit/${lib_path}/*.def |
| ) |
| set_source_files_properties(${headers} PROPERTIES HEADER_FILE_ONLY ON) |
| |
| file(GLOB_RECURSE tds |
| ${SOURCEKIT_SOURCE_DIR}/include/SourceKit/${lib_path}/*.td |
| ) |
| source_group("TableGen descriptions" FILES ${tds}) |
| set_source_files_properties(${tds} PROPERTIES HEADER_FILE_ONLY ON) |
| |
| set(srcs ${srcs} ${headers} ${tds}) |
| endif() |
| endif() |
| if (MODULE) |
| set(libkind MODULE) |
| elseif(SOURCEKITLIB_SHARED) |
| set(libkind SHARED) |
| else() |
| set(libkind) |
| endif() |
| add_library(${name} ${libkind} ${srcs}) |
| if(NOT SWIFT_BUILT_STANDALONE AND NOT CMAKE_C_COMPILER_ID MATCHES Clang) |
| add_dependencies(${name} clang) |
| endif() |
| llvm_update_compile_flags(${name}) |
| |
| set_output_directory(${name} |
| BINARY_DIR ${SOURCEKIT_RUNTIME_OUTPUT_INTDIR} |
| LIBRARY_DIR ${SOURCEKIT_LIBRARY_OUTPUT_INTDIR}) |
| |
| if(LLVM_COMMON_DEPENDS) |
| add_dependencies(${name} ${LLVM_COMMON_DEPENDS}) |
| endif(LLVM_COMMON_DEPENDS) |
| |
| if(SOURCEKITLIB_DEPENDS) |
| add_dependencies(${name} ${SOURCEKITLIB_DEPENDS}) |
| endif(SOURCEKITLIB_DEPENDS) |
| |
| swift_common_llvm_config(${name} ${SOURCEKITLIB_LLVM_LINK_COMPONENTS}) |
| |
| if(SOURCEKITLIB_SHARED AND EXPORTED_SYMBOL_FILE) |
| add_llvm_symbol_exports(${name} ${EXPORTED_SYMBOL_FILE}) |
| endif() |
| |
| if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin") |
| if(SOURCEKITLIB_SHARED) |
| set_target_properties(${name} PROPERTIES BUILD_WITH_INSTALL_RPATH TRUE) |
| set_target_properties(${name} PROPERTIES INSTALL_NAME_DIR "@rpath") |
| endif() |
| endif() |
| |
| if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") |
| if(SOURCEKITLIB_SHARED) |
| set_target_properties(${name} PROPERTIES BUILD_WITH_INSTALL_RPATH TRUE) |
| set_target_properties(${name} PROPERTIES INSTALL_RPATH "$ORIGIN/../lib/swift/linux:/usr/lib/swift/linux") |
| endif() |
| endif() |
| |
| if("${CMAKE_SYSTEM_NAME}" STREQUAL "Android") |
| if(SOURCEKITLIB_SHARED) |
| set_target_properties(${name} PROPERTIES BUILD_WITH_INSTALL_RPATH TRUE) |
| set_target_properties(${name} PROPERTIES INSTALL_RPATH "$ORIGIN/../lib/swift/android") |
| endif() |
| endif() |
| |
| if("${SOURCEKITLIB_INSTALL_IN_COMPONENT}" STREQUAL "") |
| if(SOURCEKITLIB_SHARED) |
| set(SOURCEKITLIB_INSTALL_IN_COMPONENT tools) |
| else() |
| set(SOURCEKITLIB_INSTALL_IN_COMPONENT dev) |
| endif() |
| endif() |
| add_dependencies(${SOURCEKITLIB_INSTALL_IN_COMPONENT} ${name}) |
| swift_install_in_component(TARGETS ${name} |
| LIBRARY |
| DESTINATION "lib${LLVM_LIBDIR_SUFFIX}" |
| COMPONENT "${SOURCEKITLIB_INSTALL_IN_COMPONENT}" |
| ARCHIVE |
| DESTINATION "lib${LLVM_LIBDIR_SUFFIX}" |
| COMPONENT "${SOURCEKITLIB_INSTALL_IN_COMPONENT}" |
| RUNTIME |
| DESTINATION "bin" |
| COMPONENT "${SOURCEKITLIB_INSTALL_IN_COMPONENT}") |
| swift_install_in_component(FILES ${SOURCEKITLIB_HEADERS} |
| DESTINATION "include/SourceKit" |
| COMPONENT "${SOURCEKITLIB_INSTALL_IN_COMPONENT}") |
| set_target_properties(${name} PROPERTIES FOLDER "SourceKit libraries") |
| add_sourcekit_default_compiler_flags("${name}") |
| |
| swift_is_installing_component("${SOURCEKITLIB_INSTALL_IN_COMPONENT}" is_installing) |
| if(NOT is_installing) |
| set_property(GLOBAL APPEND PROPERTY SWIFT_BUILDTREE_EXPORTS ${name}) |
| else() |
| set_property(GLOBAL APPEND PROPERTY SWIFT_EXPORTS ${name}) |
| endif() |
| endmacro() |
| |
| # Add a new SourceKit executable. |
| # |
| # Usage: |
| # add_sourcekit_executable(name # Name of the executable |
| # [LLVM_LINK_COMPONENTS comp1 ...] # LLVM components this executable |
| # # depends on |
| # source1 [source2 source3 ...]) # Sources to add into this executable |
| macro(add_sourcekit_executable name) |
| set(SOURCEKIT_EXECUTABLE_options) |
| set(SOURCEKIT_EXECUTABLE_single_parameter_options) |
| set(SOURCEKIT_EXECUTABLE_multiple_parameter_options LLVM_LINK_COMPONENTS) |
| cmake_parse_arguments(SOURCEKITEXE "${SOURCEKIT_EXECUTABLE_options}" |
| "${SOURCEKIT_EXECUTABLE_single_parameter_options}" |
| "${SOURCEKIT_EXECUTABLE_multiple_parameter_options}" ${ARGN}) |
| |
| add_executable(${name} ${SOURCEKITEXE_UNPARSED_ARGUMENTS}) |
| if(NOT SWIFT_BUILT_STANDALONE AND NOT CMAKE_C_COMPILER_ID MATCHES Clang) |
| add_dependencies(${name} clang) |
| endif() |
| llvm_update_compile_flags(${name}) |
| set_output_directory(${name} |
| BINARY_DIR ${SOURCEKIT_RUNTIME_OUTPUT_INTDIR} |
| LIBRARY_DIR ${SOURCEKIT_LIBRARY_OUTPUT_INTDIR}) |
| |
| # Add appropriate dependencies |
| if(LLVM_COMMON_DEPENDS) |
| add_dependencies(${name} ${LLVM_COMMON_DEPENDS}) |
| endif() |
| |
| swift_common_llvm_config(${name} ${SOURCEKITEXE_LLVM_LINK_COMPONENTS}) |
| target_link_libraries(${name} PRIVATE ${LLVM_COMMON_LIBS}) |
| |
| set_target_properties(${name} PROPERTIES FOLDER "SourceKit executables") |
| add_sourcekit_default_compiler_flags("${name}") |
| set_property(TARGET "${name}" APPEND_STRING PROPERTY |
| COMPILE_FLAGS " ${SOURCEKITEXE_C_COMPILE_FLAGS}") |
| endmacro() |
| |
| # Add a new SourceKit framework. |
| # |
| # Usage: |
| # add_sourcekit_framework(name # Name of the framework |
| # [LLVM_LINK_COMPONENTS comp1 ...] # LLVM components this framework depends on |
| # [MODULEMAP modulemap] # Module map file for this framework |
| # [INSTALL_IN_COMPONENT comp] # The Swift installation component that this framework belongs to. |
| # source1 [source2 source3 ...]) # Sources to add into this framework |
| macro(add_sourcekit_framework name) |
| cmake_parse_arguments(SOURCEKITFW |
| "" "MODULEMAP;INSTALL_IN_COMPONENT" "LLVM_LINK_COMPONENTS" ${ARGN}) |
| set(srcs ${SOURCEKITFW_UNPARSED_ARGUMENTS}) |
| |
| set(lib_dir ${SOURCEKIT_LIBRARY_OUTPUT_INTDIR}) |
| set(framework_location "${lib_dir}/${name}.framework") |
| |
| if (NOT SOURCEKIT_DEPLOYMENT_OS MATCHES "^macosx") |
| set(FLAT_FRAMEWORK_NAME "${name}") |
| set(FLAT_FRAMEWORK_IDENTIFIER "com.apple.${name}") |
| set(FLAT_FRAMEWORK_SHORT_VERSION_STRING "1.0") |
| set(FLAT_FRAMEWORK_BUNDLE_VERSION "${SOURCEKIT_VERSION_STRING}") |
| set(FLAT_FRAMEWORK_DEPLOYMENT_TARGET "${SOURCEKIT_DEPLOYMENT_TARGET}") |
| configure_file( |
| "${SOURCEKIT_SOURCE_DIR}/cmake/FlatFrameworkInfo.plist.in" |
| "${CMAKE_CURRENT_BINARY_DIR}/${name}.Info.plist") |
| add_custom_command(OUTPUT "${framework_location}/Info.plist" |
| DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${name}.Info.plist" |
| COMMAND ${CMAKE_COMMAND} -E copy_if_different |
| "${CMAKE_CURRENT_BINARY_DIR}/${name}.Info.plist" "${framework_location}/Info.plist") |
| list(APPEND srcs "${framework_location}/Info.plist") |
| endif() |
| |
| llvm_process_sources(srcs ${srcs}) |
| add_library(${name} SHARED ${srcs}) |
| llvm_update_compile_flags(${name}) |
| |
| set(headers) |
| foreach(src ${srcs}) |
| get_filename_component(extension ${src} EXT) |
| if(extension STREQUAL ".h") |
| list(APPEND headers ${src}) |
| endif() |
| endforeach() |
| |
| if(MSVC_IDE OR XCODE) |
| set_source_files_properties(${headers} PROPERTIES HEADER_FILE_ONLY ON) |
| endif(MSVC_IDE OR XCODE) |
| |
| if(LLVM_COMMON_DEPENDS) |
| add_dependencies(${name} ${LLVM_COMMON_DEPENDS}) |
| endif(LLVM_COMMON_DEPENDS) |
| |
| swift_common_llvm_config(${name} ${SOURCEKITFW_LLVM_LINK_COMPONENTS}) |
| |
| if (EXPORTED_SYMBOL_FILE) |
| add_llvm_symbol_exports(${name} ${EXPORTED_SYMBOL_FILE}) |
| endif() |
| |
| if(SOURCEKITFW_MODULEMAP) |
| set(modulemap "${CMAKE_CURRENT_SOURCE_DIR}/${SOURCEKITFW_MODULEMAP}") |
| if (SOURCEKIT_DEPLOYMENT_OS MATCHES "^macosx") |
| set(modules_dir "${framework_location}/Versions/A/Modules") |
| add_custom_command(TARGET ${name} PRE_BUILD |
| COMMAND ${CMAKE_COMMAND} -E copy "${modulemap}" "${modules_dir}/module.modulemap" |
| COMMAND ${CMAKE_COMMAND} -E create_symlink "Versions/Current/Modules" "${framework_location}/Modules") |
| else() |
| set(modules_dir "${framework_location}/Modules") |
| add_custom_command(TARGET ${name} PRE_BUILD |
| COMMAND ${CMAKE_COMMAND} -E copy "${modulemap}" "${modules_dir}/module.modulemap") |
| endif() |
| endif() |
| |
| if (SOURCEKIT_DEPLOYMENT_OS MATCHES "^macosx") |
| set_output_directory(${name} |
| BINARY_DIR ${SOURCEKIT_RUNTIME_OUTPUT_INTDIR} |
| LIBRARY_DIR ${SOURCEKIT_LIBRARY_OUTPUT_INTDIR}) |
| set_target_properties(${name} PROPERTIES |
| BUILD_WITH_INSTALL_RPATH TRUE |
| FOLDER "SourceKit frameworks" |
| FRAMEWORK TRUE |
| INSTALL_NAME_DIR "@rpath" |
| MACOSX_FRAMEWORK_INFO_PLIST "${SOURCEKIT_SOURCE_DIR}/cmake/MacOSXFrameworkInfo.plist.in" |
| MACOSX_FRAMEWORK_IDENTIFIER "com.apple.${name}" |
| MACOSX_FRAMEWORK_SHORT_VERSION_STRING "1.0" |
| MACOSX_FRAMEWORK_BUNDLE_VERSION "${SOURCEKIT_VERSION_STRING}" |
| PUBLIC_HEADER "${headers}") |
| add_dependencies(${SOURCEKITFW_INSTALL_IN_COMPONENT} ${name}) |
| swift_install_in_component(TARGETS ${name} |
| FRAMEWORK |
| DESTINATION lib${LLVM_LIBDIR_SUFFIX} |
| COMPONENT ${SOURCEKITFW_INSTALL_IN_COMPONENT} |
| LIBRARY |
| DESTINATION lib${LLVM_LIBDIR_SUFFIX} |
| COMPONENT ${SOURCEKITFW_INSTALL_IN_COMPONENT} |
| ARCHIVE |
| DESTINATION lib${LLVM_LIBDIR_SUFFIX} |
| COMPONENT ${SOURCEKITFW_INSTALL_IN_COMPONENT} |
| RUNTIME |
| DESTINATION bin |
| COMPONENT ${SOURCEKITFW_INSTALL_IN_COMPONENT}) |
| else() |
| set_output_directory(${name} |
| BINARY_DIR ${framework_location} |
| LIBRARY_DIR ${framework_location}) |
| set_target_properties(${name} PROPERTIES |
| BUILD_WITH_INSTALL_RPATH TRUE |
| FOLDER "SourceKit frameworks" |
| INSTALL_NAME_DIR "@rpath/${name}.framework" |
| PREFIX "" |
| SUFFIX "") |
| swift_install_in_component(DIRECTORY ${framework_location} |
| DESTINATION lib${LLVM_LIBDIR_SUFFIX} |
| COMPONENT ${SOURCEKITFW_INSTALL_IN_COMPONENT} |
| USE_SOURCE_PERMISSIONS) |
| |
| foreach(hdr ${headers}) |
| get_filename_component(hdrname ${hdr} NAME) |
| add_custom_command(TARGET ${name} PRE_BUILD |
| COMMAND ${CMAKE_COMMAND} -E copy "${hdr}" "${framework_location}/Headers/${hdrname}") |
| endforeach() |
| endif() |
| |
| swift_is_installing_component("${SOURCEKITFW_INSTALL_IN_COMPONENT}" is_installing) |
| if(NOT is_installing) |
| set_property(GLOBAL APPEND PROPERTY SWIFT_BUILDTREE_EXPORTS ${name}) |
| else() |
| set_property(GLOBAL APPEND PROPERTY SWIFT_EXPORTS ${name}) |
| endif() |
| |
| add_sourcekit_default_compiler_flags("${name}") |
| endmacro(add_sourcekit_framework) |
| |
| # Add a new SourceKit XPC service to a framework. |
| # |
| # Usage: |
| # add_sourcekit_xpc_service(name # Name of the XPC service |
| # [LLVM_LINK_COMPONENTS comp1 ...] # LLVM components this service depends on |
| # source1 [source2 source3 ...]) # Sources to add into this service |
| macro(add_sourcekit_xpc_service name framework_target) |
| cmake_parse_arguments(SOURCEKITXPC "" "" "LLVM_LINK_COMPONENTS" ${ARGN}) |
| set(srcs ${SOURCEKITXPC_UNPARSED_ARGUMENTS}) |
| |
| set(lib_dir ${SOURCEKIT_LIBRARY_OUTPUT_INTDIR}) |
| set(framework_location "${lib_dir}/${framework_target}.framework") |
| if (SOURCEKIT_DEPLOYMENT_OS MATCHES "^macosx") |
| set(xpc_bundle_dir "${framework_location}/Versions/A/XPCServices/${name}.xpc") |
| set(xpc_contents_dir "${xpc_bundle_dir}/Contents") |
| set(xpc_bin_dir "${xpc_contents_dir}/MacOS") |
| else() |
| set(xpc_bundle_dir "${framework_location}/XPCServices/${name}.xpc") |
| set(xpc_contents_dir "${xpc_bundle_dir}") |
| set(xpc_bin_dir "${xpc_contents_dir}") |
| endif() |
| |
| set(XPCSERVICE_NAME ${name}) |
| set(XPCSERVICE_IDENTIFIER "com.apple.${name}.${SOURCEKIT_VERSION_STRING}_${SOURCEKIT_PLATFORM_NAME}") |
| set(XPCSERVICE_BUNDLE_VERSION "${SOURCEKIT_VERSION_STRING}") |
| set(XPCSERVICE_SHORT_VERSION_STRING "1.0") |
| configure_file( |
| "${SOURCEKIT_SOURCE_DIR}/cmake/XPCServiceInfo.plist.in" |
| "${CMAKE_CURRENT_BINARY_DIR}/${name}.Info.plist") |
| add_custom_command(OUTPUT "${xpc_contents_dir}/Info.plist" |
| DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${name}.Info.plist" |
| COMMAND ${CMAKE_COMMAND} -E copy_if_different |
| "${CMAKE_CURRENT_BINARY_DIR}/${name}.Info.plist" "${xpc_contents_dir}/Info.plist") |
| list(APPEND srcs "${xpc_contents_dir}/Info.plist") |
| |
| add_llvm_executable(${name} ${srcs}) |
| set_target_properties(${name} PROPERTIES FOLDER "XPC Services") |
| set_target_properties(${name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${xpc_bin_dir}") |
| |
| set_output_directory(${name} |
| BINARY_DIR "${xpc_bin_dir}" |
| LIBRARY_DIR "${xpc_bin_dir}") |
| |
| # Add appropriate dependencies |
| if(LLVM_COMMON_DEPENDS) |
| add_dependencies(${name} ${LLVM_COMMON_DEPENDS}) |
| endif(LLVM_COMMON_DEPENDS) |
| |
| swift_common_llvm_config(${name} ${SOURCEKITXPC_LLVM_LINK_COMPONENTS}) |
| target_link_libraries(${name} PRIVATE ${LLVM_COMMON_LIBS}) |
| |
| add_dependencies(${framework_target} ${name}) |
| |
| # This is necessary to avoid having an rpath with an absolute build directory. |
| # Without this, such an rpath is added during build time and preserved at install time. |
| set_target_properties(${name} PROPERTIES |
| BUILD_WITH_INSTALL_RPATH On |
| INSTALL_RPATH "@loader_path/../lib" |
| INSTALL_NAME_DIR "@rpath") |
| |
| if (SOURCEKIT_DEPLOYMENT_OS MATCHES "^macosx") |
| add_custom_command(TARGET ${name} POST_BUILD |
| COMMAND ${CMAKE_COMMAND} -E create_symlink "Versions/Current/XPCServices" XPCServices |
| WORKING_DIRECTORY ${framework_location}) |
| endif() |
| |
| # ASan does not play well with exported_symbol option. This should be fixed soon. |
| if(NOT SWIFT_ASAN_BUILD) |
| if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin") |
| set_target_properties(${name} |
| PROPERTIES |
| LINK_FLAGS "-Wl,-exported_symbol,_main") |
| endif() |
| endif() |
| add_sourcekit_default_compiler_flags("${name}") |
| endmacro() |