aboutsummaryrefslogtreecommitdiff
path: root/lldb/tools/lldb-rpc/LLDBRPCGeneration.cmake
blob: a4cacf8692a850d8c10048fec2f703683dc68c43 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
if (NOT DEFINED LLDB_RPC_GEN_EXE)
  message(FATAL_ERROR
    "Unable to generate lldb-rpc sources because LLDB_RPC_GEN_EXE is not
    defined. If you are cross-compiling, please build lldb-rpc-gen for your host
    platform.")
endif()
set(lldb_rpc_generated_dir "${CMAKE_CURRENT_BINARY_DIR}/generated")
set(lldb_rpc_server_generated_source_dir "${lldb_rpc_generated_dir}/server")

file(GLOB api_headers ${LLDB_SOURCE_DIR}/include/lldb/API/SB*.h)
# We don't generate SBCommunication
list(REMOVE_ITEM api_headers ${LLDB_SOURCE_DIR}/include/lldb/API/SBCommunication.h)
# SBDefines.h is mostly definitions and forward declarations, nothing to
# generate.
list(REMOVE_ITEM api_headers ${LLDB_SOURCE_DIR}/include/lldb/API/SBDefines.h)

# Generate the list of byproducts. Note that we cannot just glob the files in
# the directory with the generated sources because BYPRODUCTS needs to be known
# at configure time but the files are generated at build time.
set(lldb_rpc_gen_byproducts
  ${lldb_rpc_generated_dir}/SBClasses.def
  ${lldb_rpc_generated_dir}/SBAPI.def
  ${lldb_rpc_generated_dir}/lldb.py
  ${lldb_rpc_server_generated_source_dir}/SBAPI.h
)

set(lldb_rpc_gen_server_impl_files)
foreach(path ${api_headers})
  get_filename_component(filename_no_ext ${path} NAME_WLE)

  set(server_header_file "Server_${filename_no_ext}.h")
  list(APPEND lldb_rpc_gen_byproducts "${lldb_rpc_server_generated_source_dir}/${server_header_file}")

  set(server_impl_file "Server_${filename_no_ext}.cpp")
  list(APPEND lldb_rpc_gen_byproducts "${lldb_rpc_server_generated_source_dir}/${server_impl_file}")
  list(APPEND lldb_rpc_gen_server_impl_files "${lldb_rpc_server_generated_source_dir}/${server_impl_file}")

endforeach()

# Make sure that the clang-resource-dir is set correctly or else the tool will
# fail to run. This is only needed when we do a standalone build.
set(clang_resource_dir_arg)
if (TARGET clang-resource-headers)
  set(clang_resource_headers_dir
    $<TARGET_PROPERTY:clang-resource-headers,INTERFACE_INCLUDE_DIRECTORIES>)
  set(clang_resource_dir_arg --extra-arg="-resource-dir=${clang_resource_headers_dir}/..")
else()
  set(clang_resource_dir_arg --extra-arg="-resource-dir=${LLDB_EXTERNAL_CLANG_RESOURCE_DIR}")
endif()

set(sysroot_arg)
if (DEFINED TOOLCHAIN_TARGET_SYSROOTFS)
  set(sysroot_arg --extra-arg="-resource-dir=${TOOLCHAIN_TARGET_SYSROOTFS}")
endif()

add_custom_command(OUTPUT ${lldb_rpc_gen_byproducts}
  COMMAND ${CMAKE_COMMAND} -E make_directory
    ${lldb_rpc_generated_dir}

  COMMAND ${CMAKE_COMMAND} -E make_directory
    ${lldb_rpc_server_generated_source_dir}

  COMMAND ${LLDB_RPC_GEN_EXE}
    -p ${CMAKE_BINARY_DIR}
    --output-dir=${lldb_rpc_generated_dir}
    ${sysroot_arg}
    --extra-arg="-USWIG"
    ${api_headers}

  DEPENDS ${LLDB_RPC_GEN_EXE} ${api_headers}
  COMMENT "Generating sources for lldb-rpc-server..."
  WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)

add_custom_target(lldb-rpc-generate-sources
  DEPENDS
  ${lldb_rpc_gen_byproducts}
  lldb-sbapi-dwarf-enums)

add_dependencies(lldb-rpc-generate-sources clang-resource-headers)