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 identity 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(DEBUGSERVER_RESOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../resources") 64set(DEBUGSERVER_INFO_PLIST "${DEBUGSERVER_RESOURCE_DIR}/lldb-debugserver-Info.plist") 65 66set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++ -Wl,-sectcreate,__TEXT,__info_plist,${DEBUGSERVER_INFO_PLIST}") 67 68check_cxx_compiler_flag("-Wno-gnu-zero-variadic-macro-arguments" 69 CXX_SUPPORTS_NO_GNU_ZERO_VARIADIC_MACRO_ARGUMENTS) 70if (CXX_SUPPORTS_NO_GNU_ZERO_VARIADIC_MACRO_ARGUMENTS) 71 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-gnu-zero-variadic-macro-arguments") 72endif () 73 74check_cxx_compiler_flag("-Wno-zero-length-array" 75 CXX_SUPPORTS_NO_ZERO_LENGTH_ARRAY) 76if (CXX_SUPPORTS_NO_ZERO_LENGTH_ARRAY) 77 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-zero-length-array") 78endif () 79 80check_cxx_compiler_flag("-Wno-extended-offsetof" 81 CXX_SUPPORTS_NO_EXTENDED_OFFSETOF) 82if (CXX_SUPPORTS_NO_EXTENDED_OFFSETOF) 83 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-extended-offsetof") 84endif () 85 86# When compiling for arm, build debugserver 2 way fat with an arm64 and arm64e 87# slice. You can only debug arm64e processes using an arm64e debugserver. 88include(CheckCSourceCompiles) 89check_c_source_compiles( 90 " 91 #include <TargetConditionals.h> 92 #if TARGET_CPU_ARM 93 #if TARGET_OS_OSX 94 #warning Building for macOS 95 #else 96 #error Not building for macOS 97 #endif 98 #else 99 #error Not building for ARM 100 #endif 101 int main() { return 0; } 102 " 103 BUILDING_FOR_ARM_OSX 104) 105 106if (BUILDING_FOR_ARM_OSX) 107 set(CMAKE_OSX_ARCHITECTURES "arm64;arm64e") 108endif () 109 110check_library_exists(compression compression_encode_buffer "" HAVE_LIBCOMPRESSION) 111 112find_library(SECURITY_LIBRARY Security) 113 114add_subdirectory(MacOSX) 115 116set(LLDB_CODESIGN_IDENTITY "" CACHE STRING 117 "Identity override for debugserver; see 'Code Signing on macOS' in the documentation (Darwin only)") 118 119get_debugserver_codesign_identity(debugserver_codesign_identity) 120 121# Override locally, so the identity is used for targets created in this scope. 122set(LLVM_CODESIGNING_IDENTITY ${debugserver_codesign_identity}) 123 124# Use the same identity later in the test suite. 125set_property(GLOBAL PROPERTY 126 LLDB_DEBUGSERVER_CODESIGN_IDENTITY ${debugserver_codesign_identity}) 127 128if(APPLE) 129 if(APPLE_EMBEDDED) 130 find_library(BACKBOARD_LIBRARY BackBoardServices 131 PATHS ${CMAKE_OSX_SYSROOT}/System/Library/PrivateFrameworks) 132 find_library(FRONTBOARD_LIBRARY FrontBoardServices 133 PATHS ${CMAKE_OSX_SYSROOT}/System/Library/PrivateFrameworks) 134 find_library(SPRINGBOARD_LIBRARY SpringBoardServices 135 PATHS ${CMAKE_OSX_SYSROOT}/System/Library/PrivateFrameworks) 136 find_library(MOBILESERVICES_LIBRARY MobileCoreServices 137 PATHS ${CMAKE_OSX_SYSROOT}/System/Library/PrivateFrameworks) 138 find_library(LOCKDOWN_LIBRARY lockdown) 139 if (APPLE_EMBEDDED STREQUAL "watchos") 140 find_library(CAROUSELSERVICES_LIBRARY CarouselServices 141 PATHS ${CMAKE_OSX_SYSROOT}/System/Library/PrivateFrameworks) 142 endif() 143 144 if(NOT BACKBOARD_LIBRARY) 145 set(SKIP_TEST_DEBUGSERVER ON CACHE BOOL "" FORCE) 146 endif() 147 endif() 148endif() 149 150if(HAVE_LIBCOMPRESSION) 151 set(LIBCOMPRESSION compression) 152endif() 153 154if(LLDB_USE_ENTITLEMENTS) 155 if(APPLE_EMBEDDED) 156 set(entitlements ${DEBUGSERVER_RESOURCE_DIR}/debugserver-entitlements.plist) 157 else() 158 if (LLDB_USE_PRIVATE_ENTITLEMENTS) 159 set(entitlements ${DEBUGSERVER_RESOURCE_DIR}/debugserver-macosx-private-entitlements.plist) 160 else() 161 set(entitlements ${DEBUGSERVER_RESOURCE_DIR}/debugserver-macosx-entitlements.plist) 162 endif() 163 endif() 164endif() 165 166add_definitions(-DLLDB_USE_OS_LOG) 167 168if(${CMAKE_OSX_SYSROOT} MATCHES ".Internal.sdk$") 169 message(STATUS "LLDB debugserver energy support is enabled") 170 add_definitions(-DLLDB_ENERGY) 171 set(ENERGY_LIBRARY -lpmenergy -lpmsample) 172else() 173 message(STATUS "LLDB debugserver energy support is disabled") 174endif() 175 176set(generated_mach_interfaces 177 ${CMAKE_CURRENT_BINARY_DIR}/mach_exc.h 178 ${CMAKE_CURRENT_BINARY_DIR}/mach_excServer.c 179 ${CMAKE_CURRENT_BINARY_DIR}/mach_excUser.c 180 ) 181 182set(MIG_ARCH_FLAGS "") 183if (DEFINED MIG_ARCHS) 184 foreach(ARCH ${MIG_ARCHS}) 185 set(MIG_ARCH_FLAGS "${MIG_ARCH_FLAGS} -arch ${ARCH}") 186 endforeach() 187endif() 188separate_arguments(MIG_ARCH_FLAGS_SEPARTED NATIVE_COMMAND "${MIG_ARCH_FLAGS}") 189 190add_custom_command(OUTPUT ${generated_mach_interfaces} 191 VERBATIM COMMAND mig ${MIG_ARCH_FLAGS_SEPARTED} -isysroot ${CMAKE_OSX_SYSROOT} ${CMAKE_CURRENT_SOURCE_DIR}/MacOSX/dbgnub-mig.defs 192 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/MacOSX/dbgnub-mig.defs 193 ) 194 195set(DEBUGSERVER_VERS_GENERATED_FILE ${CMAKE_CURRENT_BINARY_DIR}/debugserver_vers.c) 196configure_file(debugserver_vers.c.in 197 ${DEBUGSERVER_VERS_GENERATED_FILE} @ONLY) 198 199set(lldbDebugserverCommonSources 200 DNBArch.cpp 201 DNBBreakpoint.cpp 202 DNB.cpp 203 DNBDataRef.cpp 204 DNBError.cpp 205 DNBLog.cpp 206 DNBRegisterInfo.cpp 207 DNBThreadResumeActions.cpp 208 JSON.cpp 209 StdStringExtractor.cpp 210 # JSON reader depends on the following LLDB-common files 211 ${LLDB_SOURCE_DIR}/source/Host/common/StringConvert.cpp 212 ${LLDB_SOURCE_DIR}/source/Host/common/SocketAddress.cpp 213 # end JSON reader dependencies 214 libdebugserver.cpp 215 PseudoTerminal.cpp 216 PThreadEvent.cpp 217 PThreadMutex.cpp 218 RNBContext.cpp 219 RNBRemote.cpp 220 RNBServices.cpp 221 RNBSocket.cpp 222 SysSignal.cpp 223 TTYState.cpp 224 225 MacOSX/CFBundle.cpp 226 MacOSX/CFString.cpp 227 MacOSX/Genealogy.cpp 228 MacOSX/MachException.cpp 229 MacOSX/MachProcess.mm 230 MacOSX/MachTask.mm 231 MacOSX/MachThread.cpp 232 MacOSX/MachThreadList.cpp 233 MacOSX/MachVMMemory.cpp 234 MacOSX/MachVMRegion.cpp 235 MacOSX/OsLogger.cpp 236 ${generated_mach_interfaces} 237 ${DEBUGSERVER_VERS_GENERATED_FILE}) 238 239# Tell LLVM not to complain about these source files. 240set(LLVM_OPTIONAL_SOURCES 241 ${lldbDebugserverCommonSources} 242 debugserver.cpp) 243 244add_lldb_library(lldbDebugserverCommon ${lldbDebugserverCommonSources}) 245set_target_properties(lldbDebugserverCommon PROPERTIES FOLDER "lldb libraries/debugserver") 246 247target_link_libraries(lldbDebugserverCommon 248 INTERFACE ${COCOA_LIBRARY} 249 ${CORE_FOUNDATION_LIBRARY} 250 ${FOUNDATION_LIBRARY} 251 ${BACKBOARD_LIBRARY} 252 ${FRONTBOARD_LIBRARY} 253 ${SPRINGBOARD_LIBRARY} 254 ${MOBILESERVICES_LIBRARY} 255 ${LOCKDOWN_LIBRARY} 256 ${CAROUSELSERVICES_LIBRARY} 257 lldbDebugserverArchSupport 258 lldbDebugserverDarwin_DarwinLog 259 ${FOUNDATION_LIBRARY} 260 ${SECURITY_LIBRARY} 261 ${LIBCOMPRESSION} 262 ${ENERGY_LIBRARY}) 263if(HAVE_LIBCOMPRESSION) 264 set_property(TARGET lldbDebugserverCommon APPEND PROPERTY 265 COMPILE_DEFINITIONS HAVE_LIBCOMPRESSION) 266endif() 267add_lldb_tool(debugserver ADD_TO_FRAMEWORK 268 debugserver.cpp 269 LINK_LIBS lldbDebugserverCommon 270 ENTITLEMENTS ${entitlements} 271) 272 273# Workaround for Xcode-specific code-signing behavior: 274# The XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY option causes debugserver to be copied 275# into the framework first and code-signed afterwards. Sign the copy manually. 276if (debugserver_codesign_identity AND LLDB_BUILD_FRAMEWORK AND 277 CMAKE_GENERATOR STREQUAL "Xcode") 278 if(NOT CMAKE_CODESIGN_ALLOCATE) 279 execute_process( 280 COMMAND xcrun -f codesign_allocate 281 OUTPUT_STRIP_TRAILING_WHITESPACE 282 OUTPUT_VARIABLE CMAKE_CODESIGN_ALLOCATE 283 ) 284 endif() 285 if(entitlements) 286 set(pass_entitlements --entitlements ${entitlements}) 287 endif() 288 289 set(copy_location ${LLDB_FRAMEWORK_ABSOLUTE_BUILD_DIR}/LLDB.framework/Versions/${LLDB_FRAMEWORK_VERSION}/Resources/debugserver) 290 291 add_custom_command(TARGET debugserver POST_BUILD 292 COMMAND ${CMAKE_COMMAND} -E 293 env CODESIGN_ALLOCATE=${CMAKE_CODESIGN_ALLOCATE} 294 xcrun codesign -f -s ${debugserver_codesign_identity} 295 ${pass_entitlements} ${copy_location} 296 COMMENT "Code-sign debugserver copy in the build-tree framework: ${copy_location}" 297 ) 298endif() 299 300set_target_properties(debugserver PROPERTIES FOLDER "lldb libraries/debugserver") 301 302if(APPLE_EMBEDDED) 303 set_property(TARGET lldbDebugserverCommon APPEND PROPERTY COMPILE_DEFINITIONS 304 WITH_LOCKDOWN 305 WITH_FBS 306 WITH_BKS 307 ) 308 if(CAROUSELSERVICES_LIBRARY) 309 set_property(TARGET lldbDebugserverCommon APPEND PROPERTY COMPILE_DEFINITIONS 310 WITH_CAROUSEL 311 ) 312 endif() 313 set_property(TARGET debugserver APPEND PROPERTY COMPILE_DEFINITIONS 314 WITH_LOCKDOWN 315 WITH_FBS 316 WITH_BKS 317 ) 318 set_property(TARGET lldbDebugserverCommon APPEND PROPERTY COMPILE_FLAGS 319 -F${CMAKE_OSX_SYSROOT}/System/Library/PrivateFrameworks 320 ) 321 322 add_lldb_library(lldbDebugserverCommon_NonUI ${lldbDebugserverCommonSources}) 323 target_link_libraries(lldbDebugserverCommon_NonUI 324 INTERFACE ${COCOA_LIBRARY} 325 ${CORE_FOUNDATION_LIBRARY} 326 ${FOUNDATION_LIBRARY} 327 lldbDebugserverArchSupport 328 lldbDebugserverDarwin_DarwinLog 329 ${SECURITY_LIBRARY} 330 ${LIBCOMPRESSION}) 331 if(HAVE_LIBCOMPRESSION) 332 set_property(TARGET lldbDebugserverCommon_NonUI APPEND PROPERTY 333 COMPILE_DEFINITIONS HAVE_LIBCOMPRESSION) 334 endif() 335 336 add_lldb_tool(debugserver-nonui 337 debugserver.cpp 338 339 LINK_LIBS 340 lldbDebugserverCommon_NonUI 341 342 ENTITLEMENTS 343 ${entitlements} 344 ) 345endif() 346