| import("//llvm/utils/gn/build/symlink_or_copy.gni") |
| import("//llvm/utils/gn/build/write_cmake_config.gni") |
| |
| # create_clangd_xpc_framework() in cmake creates both the ClangdXPC.framework |
| # bundle and the clangd.xpc bundle within it in a single action. |
| # Since GN has some native support for macOS bundles, it's more natural |
| # to have one create_bundle() each for both ClangdXPC.framework and clangd.xpc. |
| # See `llvm/utils/gn/gn.py help create_bundle` and ../cmake/modules. |
| |
| ###################################################################### |
| # clangd.xpc bundle |
| |
| write_cmake_config("XPCServiceInfo.plist") { |
| input = "../cmake/XPCServiceInfo.plist.in" |
| output = "$target_gen_dir/XPCServiceInfo.plist" |
| service_name = "clangd" |
| values = [ |
| "CLANGD_XPC_SERVICE_NAME=$service_name", |
| "CLANGD_XPC_SERVICE_BUNDLE_NAME=org.llvm.$service_name", |
| ] |
| } |
| |
| bundle_data("clangxpc_bundle_xpc_service_info_plist") { |
| public_deps = [ |
| ":XPCServiceInfo.plist", |
| ] |
| sources = [ |
| "$target_gen_dir/XPCServiceInfo.plist", |
| ] |
| outputs = [ |
| "{{bundle_contents_dir}}/Info.plist", |
| ] |
| } |
| |
| bundle_data("clangxpc_bundle_xpc_service_executable") { |
| public_deps = [ |
| "//clang-tools-extra/clangd/tool:clangd", |
| ] |
| sources = [ |
| "$root_out_dir/bin/clangd", |
| ] |
| outputs = [ |
| "{{bundle_executable_dir}}/{{source_file_part}}", |
| ] |
| } |
| |
| create_bundle("clangd.xpc") { |
| # .app directory structure. |
| # Since this target only exists to be copied into ClangdXPC.framework, |
| # put it in $target_gen_dir, not $root_out_dir. |
| bundle_root_dir = "$target_gen_dir/$target_name" |
| bundle_contents_dir = "$bundle_root_dir/Contents" |
| bundle_executable_dir = "$bundle_contents_dir/MacOS" |
| |
| deps = [ |
| ":clangxpc_bundle_xpc_service_executable", |
| ":clangxpc_bundle_xpc_service_info_plist", |
| ] |
| } |
| |
| ###################################################################### |
| # ClangdXPC.framework |
| |
| write_cmake_config("Info.plist") { |
| input = "../cmake/Info.plist.in" |
| output = "$target_gen_dir/Info.plist" |
| values = [ "CLANGD_XPC_FRAMEWORK_NAME=ClangdXPC" ] |
| } |
| |
| bundle_data("clangdxpc_bundle_info_plist") { |
| public_deps = [ |
| ":Info.plist", |
| ] |
| sources = [ |
| "$target_gen_dir/Info.plist", |
| ] |
| outputs = [ |
| "{{bundle_resources_dir}}/{{source_file_part}}", |
| ] |
| } |
| |
| shared_library("ClangdXPCLib") { |
| deps = [ |
| "//clang-tools-extra/clangd/tool:clangd", |
| ] |
| sources = [ |
| "ClangdXPC.cpp", |
| ] |
| } |
| |
| bundle_data("clangdxpc_bundle_executable") { |
| public_deps = [ |
| ":ClangdXPCLib", |
| ] |
| sources = [ |
| "$root_out_dir/lib/libClangdXPCLib.dylib", |
| ] |
| outputs = [ |
| "{{bundle_executable_dir}}/ClangdXPC", |
| ] |
| } |
| |
| bundle_data("clangdxpc_bundle_xpc") { |
| public_deps = [ |
| ":clangd.xpc", |
| ] |
| sources = [ |
| "$target_gen_dir/clangd.xpc", |
| ] |
| outputs = [ |
| "{{bundle_contents_dir}}/XPCServices/{{source_file_part}}", |
| ] |
| } |
| |
| # .framework bundle symlinks: |
| # - ./ClangdXPC -> Versions/Current/ClangdXPC |
| # - ./Resources -> Versions/Current/Resources |
| # - ./XPCServices -> Versions/Current/XPCServices |
| # - ./Versions/Current -> Versions/A |
| # Since bundles are a mac thing, we know that symlink_or_copy() will symlink |
| # and not copy, and hence creating the symlink before the target exists is safe. |
| symlinks = [ |
| "ClangdXPC", |
| "Resources", |
| "XPCServices", |
| ] |
| foreach(target, symlinks) { |
| symlink_or_copy("clangdxpc_symlink_$target") { |
| source = "Versions/Current/$target" |
| output = "$root_out_dir/lib/ClangdXPC.framework/$target" |
| } |
| } |
| symlink_or_copy("clangdxpc_symlink_Versions_Current") { |
| source = "A" |
| output = "$root_out_dir/lib/ClangdXPC.framework/Versions/Current" |
| } |
| |
| create_bundle("ClangdXPC.framework") { |
| # .framework directory structure. |
| bundle_root_dir = "$root_out_dir/lib/$target_name" |
| bundle_contents_dir = "$bundle_root_dir/Versions/A" |
| bundle_executable_dir = "$bundle_contents_dir" |
| bundle_resources_dir = "$bundle_contents_dir/Resources" |
| |
| deps = [ |
| ":clangdxpc_bundle_executable", |
| ":clangdxpc_bundle_info_plist", |
| ":clangdxpc_bundle_xpc", |
| ":clangdxpc_symlink_Versions_Current", |
| ] |
| foreach(target, symlinks) { |
| deps += [ ":clangdxpc_symlink_$target" ] |
| } |
| } |