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