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