1# Path relative to the root binary directory
2get_filename_component(
3  framework_target_dir ${LLDB_FRAMEWORK_BUILD_DIR} ABSOLUTE
4  BASE_DIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}
5)
6
7message(STATUS "LLDB.framework: build path is '${framework_target_dir}'")
8message(STATUS "LLDB.framework: install path is '${LLDB_FRAMEWORK_INSTALL_DIR}'")
9message(STATUS "LLDB.framework: resources subdirectory is 'Versions/${LLDB_FRAMEWORK_VERSION}/Resources'")
10
11# Configure liblldb as a framework bundle
12set_target_properties(liblldb PROPERTIES
13  FRAMEWORK ON
14  FRAMEWORK_VERSION ${LLDB_FRAMEWORK_VERSION}
15
16  OUTPUT_NAME LLDB
17  VERSION ${LLDB_VERSION}
18  LIBRARY_OUTPUT_DIRECTORY ${framework_target_dir}
19
20  # Compatibility version
21  SOVERSION "1.0.0"
22
23  MACOSX_FRAMEWORK_IDENTIFIER com.apple.LLDB.framework
24  MACOSX_FRAMEWORK_BUNDLE_VERSION ${LLDB_VERSION}
25  MACOSX_FRAMEWORK_SHORT_VERSION_STRING ${LLDB_VERSION}
26  MACOSX_FRAMEWORK_INFO_PLIST ${LLDB_SOURCE_DIR}/resources/LLDB-Info.plist.in
27)
28
29# Used in llvm_add_library() to set default output directories for multi-config
30# generators. Overwrite to account for special framework output directory.
31set_output_directory(liblldb
32  BINARY_DIR ${framework_target_dir}
33  LIBRARY_DIR ${framework_target_dir}
34)
35
36lldb_add_post_install_steps_darwin(liblldb ${LLDB_FRAMEWORK_INSTALL_DIR})
37
38# Affects the layout of the framework bundle (default is macOS layout).
39if(IOS)
40  set_target_properties(liblldb PROPERTIES
41    XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET "${IPHONEOS_DEPLOYMENT_TARGET}")
42else()
43  set_target_properties(liblldb PROPERTIES
44    XCODE_ATTRIBUTE_MACOSX_DEPLOYMENT_TARGET "${MACOSX_DEPLOYMENT_TARGET}")
45endif()
46
47# Apart from this one, CMake creates all required symlinks in the framework bundle.
48add_custom_command(TARGET liblldb POST_BUILD
49  COMMAND ${CMAKE_COMMAND} -E create_symlink
50          Versions/Current/Headers
51          ${framework_target_dir}/LLDB.framework/Headers
52  COMMENT "LLDB.framework: create Headers symlink"
53)
54
55# At configuration time, collect headers for the framework bundle and copy them
56# into a staging directory. Later we can copy over the entire folder.
57file(GLOB public_headers ${LLDB_SOURCE_DIR}/include/lldb/API/*.h)
58file(GLOB root_public_headers ${LLDB_SOURCE_DIR}/include/lldb/lldb-*.h)
59file(GLOB root_private_headers ${LLDB_SOURCE_DIR}/include/lldb/lldb-private*.h)
60list(REMOVE_ITEM root_public_headers ${root_private_headers})
61
62set(lldb_header_staging ${CMAKE_CURRENT_BINARY_DIR}/FrameworkHeaders)
63foreach(header
64    ${public_headers}
65    ${root_public_headers}
66    ${LLDB_SOURCE_DIR}/include/lldb/Utility/SharingPtr.h)
67
68  get_filename_component(basename ${header} NAME)
69  set(staged_header ${lldb_header_staging}/${basename})
70
71  add_custom_command(
72    DEPENDS ${header} OUTPUT ${staged_header}
73    COMMAND ${CMAKE_COMMAND} -E copy ${header} ${staged_header}
74    COMMENT "LLDB.framework: collect framework header")
75
76  list(APPEND lldb_staged_headers ${staged_header})
77endforeach()
78
79# Wrap output in a target, so lldb-framework can depend on it.
80add_custom_target(liblldb-resource-headers DEPENDS ${lldb_staged_headers})
81set_target_properties(liblldb-resource-headers PROPERTIES FOLDER "lldb misc")
82add_dependencies(liblldb liblldb-resource-headers)
83
84# At build time, copy the staged headers into the framework bundle (and do
85# some post-processing in-place).
86add_custom_command(TARGET liblldb POST_BUILD
87  COMMAND ${CMAKE_COMMAND} -E copy_directory ${lldb_header_staging} $<TARGET_FILE_DIR:liblldb>/Headers
88  COMMAND ${LLDB_SOURCE_DIR}/scripts/framework-header-fix.sh $<TARGET_FILE_DIR:liblldb>/Headers ${LLDB_VERSION}
89  COMMENT "LLDB.framework: copy framework headers"
90)
91
92# Copy vendor-specific headers from clang (without staging).
93if(NOT IOS)
94  if (TARGET clang-resource-headers)
95    add_dependencies(liblldb clang-resource-headers)
96    set(clang_resource_headers_dir $<TARGET_PROPERTY:clang-resource-headers,RUNTIME_OUTPUT_DIRECTORY>)
97  else()
98    # In standalone builds try the best possible guess
99    if(Clang_DIR)
100      set(clang_lib_dir ${Clang_DIR}/../..)
101    elseif(LLVM_DIR)
102      set(clang_lib_dir ${LLVM_DIR}/../..)
103    elseif(LLVM_LIBRARY_DIRS)
104      set(clang_lib_dir ${LLVM_LIBRARY_DIRS})
105    elseif(LLVM_BUILD_LIBRARY_DIR)
106      set(clang_lib_dir ${LLVM_BUILD_LIBRARY_DIR})
107    elseif(LLVM_BINARY_DIR)
108      set(clang_lib_dir ${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX})
109    endif()
110    set(clang_version ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH})
111    set(clang_resource_headers_dir ${clang_lib_dir}/clang/${clang_version}/include)
112    if(NOT EXISTS ${clang_resource_headers_dir})
113      message(WARNING "Expected directory for clang-resource headers not found: ${clang_resource_headers_dir}")
114    endif()
115  endif()
116
117  add_custom_command(TARGET liblldb POST_BUILD
118    COMMAND ${CMAKE_COMMAND} -E copy_directory
119            ${clang_resource_headers_dir}
120            $<TARGET_FILE_DIR:liblldb>/Resources/Clang/include
121    COMMENT "LLDB.framework: copy clang vendor-specific headers"
122  )
123endif()
124