1include(CheckCXXCompilerFlag) 2include(CheckLibraryExists) 3include_directories(${CMAKE_CURRENT_BINARY_DIR}/..) 4include_directories(${LLDB_SOURCE_DIR}/source) 5include_directories(MacOSX/DarwinLog) 6 7include_directories(MacOSX) 8 9function(check_certificate identity result_valid) 10 execute_process( 11 COMMAND security find-certificate -Z -p -c ${identity} /Library/Keychains/System.keychain 12 RESULT_VARIABLE exit_code OUTPUT_QUIET ERROR_QUIET) 13 if(exit_code) 14 set(${result_valid} FALSE PARENT_SCOPE) 15 else() 16 set(${result_valid} TRUE PARENT_SCOPE) 17 endif() 18endfunction() 19 20function(get_debugserver_codesign_identity result) 21 string(CONCAT not_found_help 22 "This will cause failures in the test suite." 23 "Pass '-DLLDB_USE_SYSTEM_DEBUGSERVER=ON' to use the system one instead." 24 "See 'Code Signing on macOS' in the documentation." 25 ) 26 27 # Explicit override: warn if unavailable 28 if(LLDB_CODESIGN_IDENTITY) 29 set(${result} ${LLDB_CODESIGN_IDENTITY} PARENT_SCOPE) 30 check_certificate(${LLDB_CODESIGN_IDENTITY} available) 31 if(NOT available) 32 message(WARNING "LLDB_CODESIGN_IDENTITY not found: '${LLDB_CODESIGN_IDENTITY}' ${not_found_help}") 33 endif() 34 return() 35 endif() 36 37 # Development signing identity: use if available 38 check_certificate(lldb_codesign available) 39 if(available) 40 set(${result} lldb_codesign PARENT_SCOPE) 41 return() 42 endif() 43 44 message(WARNING "Development code sign identiy not found: 'lldb_codesign' ${not_found_help}") 45 46 # LLVM pendant: fallback if available 47 if(LLVM_CODESIGNING_IDENTITY) 48 check_certificate(${LLVM_CODESIGNING_IDENTITY} available) 49 if(available) 50 set(${result} ${LLVM_CODESIGNING_IDENTITY} PARENT_SCOPE) 51 return() 52 endif() 53 endif() 54 55 # Ad-hoc signing: last resort 56 set(${result} "-" PARENT_SCOPE) 57endfunction() 58 59# debugserver does not depend on intrinsics_gen, or on llvm. Set the common 60# llvm dependencies in the current scope to the empty set. 61set(LLVM_COMMON_DEPENDS) 62 63set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++ -Wl,-sectcreate,__TEXT,__info_plist,${CMAKE_CURRENT_SOURCE_DIR}/../resources/lldb-debugserver-Info.plist") 64 65check_cxx_compiler_flag("-Wno-gnu-zero-variadic-macro-arguments" 66 CXX_SUPPORTS_NO_GNU_ZERO_VARIADIC_MACRO_ARGUMENTS) 67if (CXX_SUPPORTS_NO_GNU_ZERO_VARIADIC_MACRO_ARGUMENTS) 68 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-gnu-zero-variadic-macro-arguments") 69endif () 70 71check_cxx_compiler_flag("-Wno-zero-length-array" 72 CXX_SUPPORTS_NO_ZERO_LENGTH_ARRAY) 73if (CXX_SUPPORTS_NO_ZERO_LENGTH_ARRAY) 74 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-zero-length-array") 75endif () 76 77check_cxx_compiler_flag("-Wno-extended-offsetof" 78 CXX_SUPPORTS_NO_EXTENDED_OFFSETOF) 79if (CXX_SUPPORTS_NO_EXTENDED_OFFSETOF) 80 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-extended-offsetof") 81endif () 82 83check_library_exists(compression compression_encode_buffer "" HAVE_LIBCOMPRESSION) 84 85add_subdirectory(MacOSX) 86 87set(LLDB_CODESIGN_IDENTITY "" CACHE STRING 88 "Identity override for debugserver; see 'Code Signing on macOS' in the documentation (Darwin only)") 89 90get_debugserver_codesign_identity(debugserver_codesign_identity) 91 92# Override locally, so the identity is used for targets created in this scope. 93set(LLVM_CODESIGNING_IDENTITY ${debugserver_codesign_identity}) 94 95# Use the same identity later in the test suite. 96set_property(GLOBAL PROPERTY 97 LLDB_DEBUGSERVER_CODESIGN_IDENTITY ${debugserver_codesign_identity}) 98 99if(APPLE) 100 if(IOS) 101 find_library(BACKBOARD_LIBRARY BackBoardServices 102 PATHS ${CMAKE_OSX_SYSROOT}/System/Library/PrivateFrameworks) 103 find_library(FRONTBOARD_LIBRARY FrontBoardServices 104 PATHS ${CMAKE_OSX_SYSROOT}/System/Library/PrivateFrameworks) 105 find_library(SPRINGBOARD_LIBRARY SpringBoardServices 106 PATHS ${CMAKE_OSX_SYSROOT}/System/Library/PrivateFrameworks) 107 find_library(MOBILESERVICES_LIBRARY MobileCoreServices 108 PATHS ${CMAKE_OSX_SYSROOT}/System/Library/PrivateFrameworks) 109 find_library(LOCKDOWN_LIBRARY lockdown) 110 111 if(NOT BACKBOARD_LIBRARY) 112 set(SKIP_TEST_DEBUGSERVER ON CACHE BOOL "" FORCE) 113 endif() 114 endif() 115endif() 116 117if(HAVE_LIBCOMPRESSION) 118 set(LIBCOMPRESSION compression) 119endif() 120 121if(LLDB_USE_ENTITLEMENTS) 122 if(IOS) 123 set(entitlements ${CMAKE_CURRENT_SOURCE_DIR}/debugserver-entitlements.plist) 124 else() 125 # Same entitlements file as used for lldb-server 126 set(entitlements ${LLDB_SOURCE_DIR}/resources/debugserver-macosx-entitlements.plist) 127 endif() 128endif() 129 130set(generated_mach_interfaces 131 ${CMAKE_CURRENT_BINARY_DIR}/mach_exc.h 132 ${CMAKE_CURRENT_BINARY_DIR}/mach_excServer.c 133 ${CMAKE_CURRENT_BINARY_DIR}/mach_excUser.c 134 ) 135 136set(MIG_ARCH_FLAGS "") 137foreach(ARCH ${CMAKE_OSX_ARCHITECTURES}) 138 set(MIG_ARCH_FLAGS "${MIG_ARCH_FLAGS} -arch ${ARCH}") 139endforeach() 140separate_arguments(MIG_ARCH_FLAGS_SEPARTED NATIVE_COMMAND "${MIG_ARCH_FLAGS}") 141 142add_custom_command(OUTPUT ${generated_mach_interfaces} 143 VERBATIM COMMAND mig ${MIG_ARCH_FLAGS_SEPARTED} -isysroot ${CMAKE_OSX_SYSROOT} ${CMAKE_CURRENT_SOURCE_DIR}/MacOSX/dbgnub-mig.defs 144 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/MacOSX/dbgnub-mig.defs 145 ) 146 147set(DEBUGSERVER_VERS_GENERATED_FILE ${CMAKE_CURRENT_BINARY_DIR}/debugserver_vers.c) 148configure_file(debugserver_vers.c.in 149 ${DEBUGSERVER_VERS_GENERATED_FILE} @ONLY) 150 151set(lldbDebugserverCommonSources 152 DNBArch.cpp 153 DNBBreakpoint.cpp 154 DNB.cpp 155 DNBDataRef.cpp 156 DNBError.cpp 157 DNBLog.cpp 158 DNBRegisterInfo.cpp 159 DNBThreadResumeActions.cpp 160 JSON.cpp 161 StdStringExtractor.cpp 162 # JSON reader depends on the following LLDB-common files 163 ${LLDB_SOURCE_DIR}/source/Host/common/StringConvert.cpp 164 ${LLDB_SOURCE_DIR}/source/Host/common/SocketAddress.cpp 165 # end JSON reader dependencies 166 libdebugserver.cpp 167 PseudoTerminal.cpp 168 PThreadEvent.cpp 169 PThreadMutex.cpp 170 RNBContext.cpp 171 RNBRemote.cpp 172 RNBServices.cpp 173 RNBSocket.cpp 174 SysSignal.cpp 175 TTYState.cpp 176 177 MacOSX/CFBundle.cpp 178 MacOSX/CFString.cpp 179 MacOSX/Genealogy.cpp 180 MacOSX/MachException.cpp 181 MacOSX/MachProcess.mm 182 MacOSX/MachTask.mm 183 MacOSX/MachThread.cpp 184 MacOSX/MachThreadList.cpp 185 MacOSX/MachVMMemory.cpp 186 MacOSX/MachVMRegion.cpp 187 MacOSX/OsLogger.cpp 188 ${generated_mach_interfaces} 189 ${DEBUGSERVER_VERS_GENERATED_FILE}) 190 191add_library(lldbDebugserverCommon ${lldbDebugserverCommonSources}) 192set_target_properties(lldbDebugserverCommon PROPERTIES FOLDER "lldb libraries/debugserver") 193 194target_link_libraries(lldbDebugserverCommon 195 INTERFACE ${COCOA_LIBRARY} 196 ${CORE_FOUNDATION_LIBRARY} 197 ${FOUNDATION_LIBRARY} 198 ${BACKBOARD_LIBRARY} 199 ${FRONTBOARD_LIBRARY} 200 ${SPRINGBOARD_LIBRARY} 201 ${MOBILESERVICES_LIBRARY} 202 ${LOCKDOWN_LIBRARY} 203 lldbDebugserverArchSupport 204 lldbDebugserverDarwin_DarwinLog 205 ${LIBCOMPRESSION}) 206if(HAVE_LIBCOMPRESSION) 207 set_property(TARGET lldbDebugserverCommon APPEND PROPERTY 208 COMPILE_DEFINITIONS HAVE_LIBCOMPRESSION) 209endif() 210set(LLVM_OPTIONAL_SOURCES ${lldbDebugserverCommonSources}) 211add_lldb_tool(debugserver ADD_TO_FRAMEWORK 212 debugserver.cpp 213 LINK_LIBS lldbDebugserverCommon 214 ENTITLEMENTS ${entitlements} 215) 216 217# Workaround for Xcode-specific code-signing behavior: 218# The XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY option causes debugserver to be copied 219# into the framework first and code-signed afterwards. Sign the copy manually. 220if (debugserver_codesign_identity AND LLDB_BUILD_FRAMEWORK AND 221 CMAKE_GENERATOR STREQUAL "Xcode") 222 if(NOT CMAKE_CODESIGN_ALLOCATE) 223 execute_process( 224 COMMAND xcrun -f codesign_allocate 225 OUTPUT_STRIP_TRAILING_WHITESPACE 226 OUTPUT_VARIABLE CMAKE_CODESIGN_ALLOCATE 227 ) 228 endif() 229 if(entitlements) 230 set(pass_entitlements --entitlements ${entitlements}) 231 endif() 232 233 set(copy_location ${LLDB_FRAMEWORK_ABSOLUTE_BUILD_DIR}/LLDB.framework/Versions/${LLDB_FRAMEWORK_VERSION}/Resources/debugserver) 234 235 add_custom_command(TARGET debugserver POST_BUILD 236 COMMAND ${CMAKE_COMMAND} -E 237 env CODESIGN_ALLOCATE=${CMAKE_CODESIGN_ALLOCATE} 238 xcrun codesign -f -s ${debugserver_codesign_identity} 239 ${pass_entitlements} ${copy_location} 240 COMMENT "Code-sign debugserver copy in the build-tree framework: ${copy_location}" 241 ) 242endif() 243 244set_target_properties(debugserver PROPERTIES FOLDER "lldb libraries/debugserver") 245 246if(IOS) 247 set_property(TARGET lldbDebugserverCommon APPEND PROPERTY COMPILE_DEFINITIONS 248 WITH_LOCKDOWN 249 WITH_FBS 250 WITH_BKS 251 ) 252 set_property(TARGET debugserver APPEND PROPERTY COMPILE_DEFINITIONS 253 WITH_LOCKDOWN 254 WITH_FBS 255 WITH_BKS 256 ) 257 set_property(TARGET lldbDebugserverCommon APPEND PROPERTY COMPILE_FLAGS 258 -F${CMAKE_OSX_SYSROOT}/System/Library/PrivateFrameworks 259 ) 260 261 add_library(lldbDebugserverCommon_NonUI ${lldbDebugserverCommonSources}) 262 target_link_libraries(lldbDebugserverCommon_NonUI 263 INTERFACE ${COCOA_LIBRARY} 264 ${CORE_FOUNDATION_LIBRARY} 265 ${FOUNDATION_LIBRARY} 266 lldbDebugserverArchSupport 267 lldbDebugserverDarwin_DarwinLog 268 ${LIBCOMPRESSION}) 269 if(HAVE_LIBCOMPRESSION) 270 set_property(TARGET lldbDebugserverCommon_NonUI APPEND PROPERTY 271 COMPILE_DEFINITIONS HAVE_LIBCOMPRESSION) 272 endif() 273 274 add_lldb_tool(debugserver-nonui 275 debugserver.cpp 276 277 LINK_LIBS 278 lldbDebugserverCommon_NonUI 279 280 ENTITLEMENTS 281 ${entitlements} 282 ) 283endif() 284