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