| # Creates the ClangdXPC framework. |
| macro(create_clangd_xpc_framework target name) |
| set(CLANGD_FRAMEWORK_LOCATION "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${name}.framework") |
| set(CLANGD_FRAMEWORK_OUT_LOCATION "${CLANGD_FRAMEWORK_LOCATION}/Versions/A") |
| |
| # Create the framework info PLIST. |
| set(CLANGD_XPC_FRAMEWORK_NAME "${name}") |
| configure_file( |
| "${CLANGD_XPC_SOURCE_DIR}/cmake/Info.plist.in" |
| "${CLANGD_XPC_BINARY_DIR}/${name}.Info.plist") |
| |
| set(CLANGD_XPC_SERVICE_NAME "clangd") |
| set(CLANGD_XPC_SERVICE_OUT_LOCATION |
| "${CLANGD_FRAMEWORK_OUT_LOCATION}/XPCServices/${CLANGD_XPC_SERVICE_NAME}.xpc/Contents") |
| |
| # Create the XPC service info PLIST. |
| set(CLANGD_XPC_SERVICE_BUNDLE_NAME "org.llvm.${CLANGD_XPC_SERVICE_NAME}") |
| configure_file( |
| "${CLANGD_XPC_SOURCE_DIR}/cmake/XPCServiceInfo.plist.in" |
| "${CLANGD_XPC_BINARY_DIR}/${name}Service.Info.plist") |
| |
| # Create the custom command |
| add_custom_command(OUTPUT ${CLANGD_FRAMEWORK_LOCATION} |
| # Copy the PLIST. |
| COMMAND ${CMAKE_COMMAND} -E copy |
| "${CLANGD_XPC_BINARY_DIR}/${name}.Info.plist" |
| "${CLANGD_FRAMEWORK_OUT_LOCATION}/Resources/Info.plist" |
| |
| # Copy the framework binary. |
| COMMAND ${CMAKE_COMMAND} -E copy |
| "$<TARGET_FILE:${target}>" |
| "${CLANGD_FRAMEWORK_OUT_LOCATION}/${name}" |
| |
| # Copy the XPC Service PLIST. |
| COMMAND ${CMAKE_COMMAND} -E copy |
| "${CLANGD_XPC_BINARY_DIR}/${name}Service.Info.plist" |
| "${CLANGD_XPC_SERVICE_OUT_LOCATION}/Info.plist" |
| |
| # Copy the Clangd binary. |
| COMMAND ${CMAKE_COMMAND} -E copy |
| "$<TARGET_FILE:clangd>" |
| "${CLANGD_XPC_SERVICE_OUT_LOCATION}/MacOS/clangd" |
| |
| COMMAND ${CMAKE_COMMAND} -E create_symlink "A" |
| "${CLANGD_FRAMEWORK_LOCATION}/Versions/Current" |
| |
| COMMAND ${CMAKE_COMMAND} -E create_symlink |
| "Versions/Current/Resources" |
| "${CLANGD_FRAMEWORK_LOCATION}/Resources" |
| |
| COMMAND ${CMAKE_COMMAND} -E create_symlink |
| "Versions/Current/XPCServices" |
| "${CLANGD_FRAMEWORK_LOCATION}/XPCServices" |
| |
| COMMAND ${CMAKE_COMMAND} -E create_symlink |
| "Versions/Current/${name}" |
| "${CLANGD_FRAMEWORK_LOCATION}/${name}" |
| |
| DEPENDS |
| "${CLANGD_XPC_BINARY_DIR}/${name}.Info.plist" |
| "${CLANGD_XPC_BINARY_DIR}/${name}Service.Info.plist" |
| clangd |
| COMMENT "Creating ClangdXPC framework" |
| VERBATIM |
| ) |
| |
| add_custom_target( |
| ClangdXPC |
| DEPENDS |
| ${target} |
| ${CLANGD_FRAMEWORK_LOCATION} |
| ) |
| |
| # clangd is already signed as a standalone executable, so it must be forced. |
| llvm_codesign(ClangdXPC BUNDLE_PATH "${CLANGD_FRAMEWORK_OUT_LOCATION}/XPCServices/${CLANGD_XPC_SERVICE_NAME}.xpc/" FORCE) |
| # ClangdXPC library is already signed as a standalone library, so it must be forced. |
| llvm_codesign(ClangdXPC BUNDLE_PATH "${CLANGD_FRAMEWORK_LOCATION}" FORCE) |
| endmacro(create_clangd_xpc_framework) |