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