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