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 64 get_filename_component(basename ${header} NAME) 65 set(staged_header ${lldb_header_staging}/${basename}) 66 67 add_custom_command( 68 DEPENDS ${header} OUTPUT ${staged_header} 69 COMMAND ${CMAKE_COMMAND} -E copy ${header} ${staged_header} 70 COMMENT "LLDB.framework: collect framework header") 71 72 list(APPEND lldb_staged_headers ${staged_header}) 73endforeach() 74 75# Wrap output in a target, so lldb-framework can depend on it. 76add_custom_target(liblldb-resource-headers DEPENDS ${lldb_staged_headers}) 77set_target_properties(liblldb-resource-headers PROPERTIES FOLDER "lldb misc") 78add_dependencies(liblldb liblldb-resource-headers) 79 80# At build time, copy the staged headers into the framework bundle (and do 81# some post-processing in-place). 82if (NOT IOS) 83add_custom_command(TARGET liblldb POST_BUILD 84 COMMAND ${CMAKE_COMMAND} -E copy_directory ${lldb_header_staging} $<TARGET_FILE_DIR:liblldb>/Headers 85 COMMAND ${LLDB_SOURCE_DIR}/scripts/framework-header-fix.sh $<TARGET_FILE_DIR:liblldb>/Headers ${LLDB_VERSION} 86 COMMENT "LLDB.framework: copy framework headers" 87) 88endif() 89 90# Copy vendor-specific headers from clang (without staging). 91if(NOT IOS) 92 if (TARGET clang-resource-headers) 93 add_dependencies(liblldb clang-resource-headers) 94 set(clang_resource_headers_dir $<TARGET_PROPERTY:clang-resource-headers,RUNTIME_OUTPUT_DIRECTORY>) 95 else() 96 # In standalone builds try the best possible guess 97 if(Clang_DIR) 98 set(clang_lib_dir ${Clang_DIR}/../..) 99 elseif(LLVM_DIR) 100 set(clang_lib_dir ${LLVM_DIR}/../..) 101 elseif(LLVM_LIBRARY_DIRS) 102 set(clang_lib_dir ${LLVM_LIBRARY_DIRS}) 103 elseif(LLVM_BUILD_LIBRARY_DIR) 104 set(clang_lib_dir ${LLVM_BUILD_LIBRARY_DIR}) 105 elseif(LLVM_BINARY_DIR) 106 set(clang_lib_dir ${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}) 107 endif() 108 set(clang_version ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}) 109 set(clang_resource_headers_dir ${clang_lib_dir}/clang/${clang_version}/include) 110 if(NOT EXISTS ${clang_resource_headers_dir}) 111 message(WARNING "Expected directory for clang-resource headers not found: ${clang_resource_headers_dir}") 112 endif() 113 endif() 114 115 add_custom_command(TARGET liblldb POST_BUILD 116 COMMAND ${CMAKE_COMMAND} -E copy_directory 117 ${clang_resource_headers_dir} 118 $<TARGET_FILE_DIR:liblldb>/Resources/Clang/include 119 COMMENT "LLDB.framework: copy clang vendor-specific headers" 120 ) 121endif() 122 123# Add an rpath pointing to the directory where LLDB.framework is installed. 124# This allows frameworks (relying on @rpath) to be installed in the same folder and found at runtime. 125set_property(TARGET liblldb APPEND PROPERTY INSTALL_RPATH 126 "@loader_path/../../../") 127