brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.9 KiB · 5bc4003 Raw
121 lines · plain
1import("//llvm/utils/gn/build/symlink_or_copy.gni")2import("//llvm/utils/gn/build/write_cmake_config.gni")3 4# create_clangd_xpc_framework() in cmake creates both the ClangdXPC.framework5# bundle and the clangd.xpc bundle within it in a single action.6# Since GN has some native support for macOS bundles, it's more natural7# to have one create_bundle() each for both ClangdXPC.framework and clangd.xpc.8# See `llvm/utils/gn/gn.py help create_bundle` and ../cmake/modules.9 10######################################################################11# clangd.xpc bundle12 13write_cmake_config("XPCServiceInfo.plist") {14  input = "../cmake/XPCServiceInfo.plist.in"15  output = "$target_gen_dir/XPCServiceInfo.plist"16  service_name = "clangd"17  values = [18    "CLANGD_XPC_SERVICE_NAME=$service_name",19    "CLANGD_XPC_SERVICE_BUNDLE_NAME=org.llvm.$service_name",20  ]21}22 23bundle_data("clangxpc_bundle_xpc_service_info_plist") {24  public_deps = [ ":XPCServiceInfo.plist" ]25  sources = [ "$target_gen_dir/XPCServiceInfo.plist" ]26  outputs = [ "{{bundle_contents_dir}}/Info.plist" ]27}28 29bundle_data("clangxpc_bundle_xpc_service_executable") {30  public_deps = [ "//clang-tools-extra/clangd/tool:clangd" ]31  sources = [ "$root_out_dir/bin/clangd" ]32  outputs = [ "{{bundle_executable_dir}}/{{source_file_part}}" ]33}34 35create_bundle("clangd.xpc") {36  # .app directory structure.37  # Since this target only exists to be copied into ClangdXPC.framework,38  # put it in $target_gen_dir, not $root_out_dir.39  bundle_root_dir = "$target_gen_dir/$target_name"40  bundle_contents_dir = "$bundle_root_dir/Contents"41  bundle_executable_dir = "$bundle_contents_dir/MacOS"42 43  deps = [44    ":clangxpc_bundle_xpc_service_executable",45    ":clangxpc_bundle_xpc_service_info_plist",46  ]47}48 49######################################################################50# ClangdXPC.framework51 52write_cmake_config("Info.plist") {53  input = "../cmake/Info.plist.in"54  output = "$target_gen_dir/Info.plist"55  values = [ "CLANGD_XPC_FRAMEWORK_NAME=ClangdXPC" ]56}57 58bundle_data("clangdxpc_bundle_info_plist") {59  public_deps = [ ":Info.plist" ]60  sources = [ "$target_gen_dir/Info.plist" ]61  outputs = [ "{{bundle_resources_dir}}/{{source_file_part}}" ]62}63 64shared_library("ClangdXPCLib") {65  deps = [ "//clang-tools-extra/clangd/tool:clangd" ]66  sources = [ "ClangdXPC.cpp" ]67}68 69bundle_data("clangdxpc_bundle_executable") {70  public_deps = [ ":ClangdXPCLib" ]71  sources = [ "$root_out_dir/lib/libClangdXPCLib.dylib" ]72  outputs = [ "{{bundle_executable_dir}}/ClangdXPC" ]73}74 75bundle_data("clangdxpc_bundle_xpc") {76  public_deps = [ ":clangd.xpc" ]77  sources = [ "$target_gen_dir/clangd.xpc" ]78  outputs = [ "{{bundle_contents_dir}}/XPCServices/{{source_file_part}}" ]79}80 81# .framework bundle symlinks:82# - ./ClangdXPC -> Versions/Current/ClangdXPC83# - ./Resources -> Versions/Current/Resources84# - ./XPCServices -> Versions/Current/XPCServices85# - ./Versions/Current -> Versions/A86# Since bundles are a mac thing, we know that symlink_or_copy() will symlink87# and not copy, and hence creating the symlink before the target exists is safe.88symlinks = [89  "ClangdXPC",90  "Resources",91  "XPCServices",92]93foreach(target, symlinks) {94  symlink_or_copy("clangdxpc_symlink_$target") {95    source = "Versions/Current/$target"96    output = "$root_out_dir/lib/ClangdXPC.framework/$target"97  }98}99symlink_or_copy("clangdxpc_symlink_Versions_Current") {100  source = "A"101  output = "$root_out_dir/lib/ClangdXPC.framework/Versions/Current"102}103 104create_bundle("ClangdXPC.framework") {105  # .framework directory structure.106  bundle_root_dir = "$root_out_dir/lib/$target_name"107  bundle_contents_dir = "$bundle_root_dir/Versions/A"108  bundle_executable_dir = "$bundle_contents_dir"109  bundle_resources_dir = "$bundle_contents_dir/Resources"110 111  deps = [112    ":clangdxpc_bundle_executable",113    ":clangdxpc_bundle_info_plist",114    ":clangdxpc_bundle_xpc",115    ":clangdxpc_symlink_Versions_Current",116  ]117  foreach(target, symlinks) {118    deps += [ ":clangdxpc_symlink_$target" ]119  }120}121