1# Creates the ClangdXPC framework. 2macro(create_clangd_xpc_framework target name) 3 set(CLANGD_FRAMEWORK_LOCATION "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${name}.framework") 4 set(CLANGD_FRAMEWORK_OUT_LOCATION "${CLANGD_FRAMEWORK_LOCATION}/Versions/A") 5 6 # Create the framework info PLIST. 7 set(CLANGD_XPC_FRAMEWORK_NAME "${name}") 8 configure_file( 9 "${CLANGD_XPC_SOURCE_DIR}/cmake/Info.plist.in" 10 "${CLANGD_XPC_BINARY_DIR}/${name}.Info.plist") 11 12 set(CLANGD_XPC_SERVICE_NAME "clangd") 13 set(CLANGD_XPC_SERVICE_OUT_LOCATION 14 "${CLANGD_FRAMEWORK_OUT_LOCATION}/XPCServices/${CLANGD_XPC_SERVICE_NAME}.xpc/Contents") 15 16 # Create the XPC service info PLIST. 17 set(CLANGD_XPC_SERVICE_BUNDLE_NAME "org.llvm.${CLANGD_XPC_SERVICE_NAME}") 18 configure_file( 19 "${CLANGD_XPC_SOURCE_DIR}/cmake/XPCServiceInfo.plist.in" 20 "${CLANGD_XPC_BINARY_DIR}/${name}Service.Info.plist") 21 22 # Create the custom command 23 add_custom_command(OUTPUT ${CLANGD_FRAMEWORK_LOCATION} 24 # Copy the PLIST. 25 COMMAND ${CMAKE_COMMAND} -E copy 26 "${CLANGD_XPC_BINARY_DIR}/${name}.Info.plist" 27 "${CLANGD_FRAMEWORK_OUT_LOCATION}/Resources/Info.plist" 28 29 # Copy the framework binary. 30 COMMAND ${CMAKE_COMMAND} -E copy 31 "$<TARGET_FILE:${target}>" 32 "${CLANGD_FRAMEWORK_OUT_LOCATION}/${name}" 33 34 # Copy the XPC Service PLIST. 35 COMMAND ${CMAKE_COMMAND} -E copy 36 "${CLANGD_XPC_BINARY_DIR}/${name}Service.Info.plist" 37 "${CLANGD_XPC_SERVICE_OUT_LOCATION}/Info.plist" 38 39 # Copy the Clangd binary. 40 COMMAND ${CMAKE_COMMAND} -E copy 41 "$<TARGET_FILE:clangd>" 42 "${CLANGD_XPC_SERVICE_OUT_LOCATION}/MacOS/clangd" 43 44 COMMAND ${CMAKE_COMMAND} -E create_symlink "A" 45 "${CLANGD_FRAMEWORK_LOCATION}/Versions/Current" 46 47 COMMAND ${CMAKE_COMMAND} -E create_symlink 48 "Versions/Current/Resources" 49 "${CLANGD_FRAMEWORK_LOCATION}/Resources" 50 51 COMMAND ${CMAKE_COMMAND} -E create_symlink 52 "Versions/Current/XPCServices" 53 "${CLANGD_FRAMEWORK_LOCATION}/XPCServices" 54 55 COMMAND ${CMAKE_COMMAND} -E create_symlink 56 "Versions/Current/${name}" 57 "${CLANGD_FRAMEWORK_LOCATION}/${name}" 58 59 DEPENDS 60 "${CLANGD_XPC_BINARY_DIR}/${name}.Info.plist" 61 "${CLANGD_XPC_BINARY_DIR}/${name}Service.Info.plist" 62 clangd 63 COMMENT "Creating ClangdXPC framework" 64 VERBATIM 65 ) 66 67 add_custom_target( 68 ClangdXPC 69 DEPENDS 70 ${target} 71 ${CLANGD_FRAMEWORK_LOCATION} 72 ) 73 74 # clangd is already signed as a standalone executable, so it must be forced. 75 llvm_codesign(ClangdXPC BUNDLE_PATH "${CLANGD_FRAMEWORK_OUT_LOCATION}/XPCServices/${CLANGD_XPC_SERVICE_NAME}.xpc/" FORCE) 76 # ClangdXPC library is already signed as a standalone library, so it must be forced. 77 llvm_codesign(ClangdXPC BUNDLE_PATH "${CLANGD_FRAMEWORK_LOCATION}" FORCE) 78endmacro(create_clangd_xpc_framework) 79