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(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 85find_library(SECURITY_LIBRARY Security) 86 87add_subdirectory(MacOSX) 88 89set(LLDB_CODESIGN_IDENTITY "" CACHE STRING 90 "Identity override for debugserver; see 'Code Signing on macOS' in the documentation (Darwin only)") 91 92get_debugserver_codesign_identity(debugserver_codesign_identity) 93 94# Override locally, so the identity is used for targets created in this scope. 95set(LLVM_CODESIGNING_IDENTITY ${debugserver_codesign_identity}) 96 97# Use the same identity later in the test suite. 98set_property(GLOBAL PROPERTY 99 LLDB_DEBUGSERVER_CODESIGN_IDENTITY ${debugserver_codesign_identity}) 100 101if(APPLE) 102 if(APPLE_EMBEDDED) 103 find_library(BACKBOARD_LIBRARY BackBoardServices 104 PATHS ${CMAKE_OSX_SYSROOT}/System/Library/PrivateFrameworks) 105 find_library(FRONTBOARD_LIBRARY FrontBoardServices 106 PATHS ${CMAKE_OSX_SYSROOT}/System/Library/PrivateFrameworks) 107 find_library(SPRINGBOARD_LIBRARY SpringBoardServices 108 PATHS ${CMAKE_OSX_SYSROOT}/System/Library/PrivateFrameworks) 109 find_library(MOBILESERVICES_LIBRARY MobileCoreServices 110 PATHS ${CMAKE_OSX_SYSROOT}/System/Library/PrivateFrameworks) 111 find_library(LOCKDOWN_LIBRARY lockdown) 112 if (APPLE_EMBEDDED STREQUAL "watchos") 113 find_library(CAROUSELSERVICES_LIBRARY CarouselServices 114 PATHS ${CMAKE_OSX_SYSROOT}/System/Library/PrivateFrameworks) 115 endif() 116 117 if(NOT BACKBOARD_LIBRARY) 118 set(SKIP_TEST_DEBUGSERVER ON CACHE BOOL "" FORCE) 119 endif() 120 endif() 121endif() 122 123if(HAVE_LIBCOMPRESSION) 124 set(LIBCOMPRESSION compression) 125endif() 126 127if(LLDB_USE_ENTITLEMENTS) 128 if(APPLE_EMBEDDED) 129 set(entitlements ${CMAKE_CURRENT_SOURCE_DIR}/debugserver-entitlements.plist) 130 else() 131 # Same entitlements file as used for lldb-server 132 set(entitlements ${LLDB_SOURCE_DIR}/resources/debugserver-macosx-entitlements.plist) 133 endif() 134endif() 135 136add_definitions(-DLLDB_USE_OS_LOG) 137 138if(${CMAKE_OSX_SYSROOT} MATCHES ".Internal.sdk$") 139 message(STATUS "LLDB debugserver energy support is enabled") 140 add_definitions(-DLLDB_ENERGY) 141 set(ENERGY_LIBRARY -lpmenergy -lpmsample) 142else() 143 message(STATUS "LLDB debugserver energy support is disabled") 144endif() 145 146set(generated_mach_interfaces 147 ${CMAKE_CURRENT_BINARY_DIR}/mach_exc.h 148 ${CMAKE_CURRENT_BINARY_DIR}/mach_excServer.c 149 ${CMAKE_CURRENT_BINARY_DIR}/mach_excUser.c 150 ) 151 152set(MIG_ARCH_FLAGS "") 153if (DEFINED MIG_ARCHS) 154 foreach(ARCH ${MIG_ARCHS}) 155 set(MIG_ARCH_FLAGS "${MIG_ARCH_FLAGS} -arch ${ARCH}") 156 endforeach() 157endif() 158separate_arguments(MIG_ARCH_FLAGS_SEPARTED NATIVE_COMMAND "${MIG_ARCH_FLAGS}") 159 160add_custom_command(OUTPUT ${generated_mach_interfaces} 161 VERBATIM COMMAND mig ${MIG_ARCH_FLAGS_SEPARTED} -isysroot ${CMAKE_OSX_SYSROOT} ${CMAKE_CURRENT_SOURCE_DIR}/MacOSX/dbgnub-mig.defs 162 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/MacOSX/dbgnub-mig.defs 163 ) 164 165set(DEBUGSERVER_VERS_GENERATED_FILE ${CMAKE_CURRENT_BINARY_DIR}/debugserver_vers.c) 166configure_file(debugserver_vers.c.in 167 ${DEBUGSERVER_VERS_GENERATED_FILE} @ONLY) 168 169set(lldbDebugserverCommonSources 170 DNBArch.cpp 171 DNBBreakpoint.cpp 172 DNB.cpp 173 DNBDataRef.cpp 174 DNBError.cpp 175 DNBLog.cpp 176 DNBRegisterInfo.cpp 177 DNBThreadResumeActions.cpp 178 JSON.cpp 179 StdStringExtractor.cpp 180 # JSON reader depends on the following LLDB-common files 181 ${LLDB_SOURCE_DIR}/source/Host/common/StringConvert.cpp 182 ${LLDB_SOURCE_DIR}/source/Host/common/SocketAddress.cpp 183 # end JSON reader dependencies 184 libdebugserver.cpp 185 PseudoTerminal.cpp 186 PThreadEvent.cpp 187 PThreadMutex.cpp 188 RNBContext.cpp 189 RNBRemote.cpp 190 RNBServices.cpp 191 RNBSocket.cpp 192 SysSignal.cpp 193 TTYState.cpp 194 195 MacOSX/CFBundle.cpp 196 MacOSX/CFString.cpp 197 MacOSX/Genealogy.cpp 198 MacOSX/MachException.cpp 199 MacOSX/MachProcess.mm 200 MacOSX/MachTask.mm 201 MacOSX/MachThread.cpp 202 MacOSX/MachThreadList.cpp 203 MacOSX/MachVMMemory.cpp 204 MacOSX/MachVMRegion.cpp 205 MacOSX/OsLogger.cpp 206 ${generated_mach_interfaces} 207 ${DEBUGSERVER_VERS_GENERATED_FILE}) 208 209add_library(lldbDebugserverCommon ${lldbDebugserverCommonSources}) 210set_target_properties(lldbDebugserverCommon PROPERTIES FOLDER "lldb libraries/debugserver") 211 212target_link_libraries(lldbDebugserverCommon 213 INTERFACE ${COCOA_LIBRARY} 214 ${CORE_FOUNDATION_LIBRARY} 215 ${FOUNDATION_LIBRARY} 216 ${BACKBOARD_LIBRARY} 217 ${FRONTBOARD_LIBRARY} 218 ${SPRINGBOARD_LIBRARY} 219 ${MOBILESERVICES_LIBRARY} 220 ${LOCKDOWN_LIBRARY} 221 ${CAROUSELSERVICES_LIBRARY} 222 lldbDebugserverArchSupport 223 lldbDebugserverDarwin_DarwinLog 224 ${FOUNDATION_LIBRARY} 225 ${SECURITY_LIBRARY} 226 ${LIBCOMPRESSION} 227 ${ENERGY_LIBRARY}) 228if(HAVE_LIBCOMPRESSION) 229 set_property(TARGET lldbDebugserverCommon APPEND PROPERTY 230 COMPILE_DEFINITIONS HAVE_LIBCOMPRESSION) 231endif() 232set(LLVM_OPTIONAL_SOURCES ${lldbDebugserverCommonSources}) 233add_lldb_tool(debugserver ADD_TO_FRAMEWORK 234 debugserver.cpp 235 LINK_LIBS lldbDebugserverCommon 236 ENTITLEMENTS ${entitlements} 237) 238 239# Workaround for Xcode-specific code-signing behavior: 240# The XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY option causes debugserver to be copied 241# into the framework first and code-signed afterwards. Sign the copy manually. 242if (debugserver_codesign_identity AND LLDB_BUILD_FRAMEWORK AND 243 CMAKE_GENERATOR STREQUAL "Xcode") 244 if(NOT CMAKE_CODESIGN_ALLOCATE) 245 execute_process( 246 COMMAND xcrun -f codesign_allocate 247 OUTPUT_STRIP_TRAILING_WHITESPACE 248 OUTPUT_VARIABLE CMAKE_CODESIGN_ALLOCATE 249 ) 250 endif() 251 if(entitlements) 252 set(pass_entitlements --entitlements ${entitlements}) 253 endif() 254 255 set(copy_location ${LLDB_FRAMEWORK_ABSOLUTE_BUILD_DIR}/LLDB.framework/Versions/${LLDB_FRAMEWORK_VERSION}/Resources/debugserver) 256 257 add_custom_command(TARGET debugserver POST_BUILD 258 COMMAND ${CMAKE_COMMAND} -E 259 env CODESIGN_ALLOCATE=${CMAKE_CODESIGN_ALLOCATE} 260 xcrun codesign -f -s ${debugserver_codesign_identity} 261 ${pass_entitlements} ${copy_location} 262 COMMENT "Code-sign debugserver copy in the build-tree framework: ${copy_location}" 263 ) 264endif() 265 266set_target_properties(debugserver PROPERTIES FOLDER "lldb libraries/debugserver") 267 268if(APPLE_EMBEDDED) 269 set_property(TARGET lldbDebugserverCommon APPEND PROPERTY COMPILE_DEFINITIONS 270 WITH_LOCKDOWN 271 WITH_FBS 272 WITH_BKS 273 ) 274 if(CAROUSELSERVICES_LIBRARY) 275 set_property(TARGET lldbDebugserverCommon APPEND PROPERTY COMPILE_DEFINITIONS 276 WITH_CAROUSEL 277 ) 278 endif() 279 set_property(TARGET debugserver APPEND PROPERTY COMPILE_DEFINITIONS 280 WITH_LOCKDOWN 281 WITH_FBS 282 WITH_BKS 283 ) 284 set_property(TARGET lldbDebugserverCommon APPEND PROPERTY COMPILE_FLAGS 285 -F${CMAKE_OSX_SYSROOT}/System/Library/PrivateFrameworks 286 ) 287 288 add_library(lldbDebugserverCommon_NonUI ${lldbDebugserverCommonSources}) 289 target_link_libraries(lldbDebugserverCommon_NonUI 290 INTERFACE ${COCOA_LIBRARY} 291 ${CORE_FOUNDATION_LIBRARY} 292 ${FOUNDATION_LIBRARY} 293 lldbDebugserverArchSupport 294 lldbDebugserverDarwin_DarwinLog 295 ${SECURITY_LIBRARY} 296 ${LIBCOMPRESSION}) 297 if(HAVE_LIBCOMPRESSION) 298 set_property(TARGET lldbDebugserverCommon_NonUI APPEND PROPERTY 299 COMPILE_DEFINITIONS HAVE_LIBCOMPRESSION) 300 endif() 301 302 add_lldb_tool(debugserver-nonui 303 debugserver.cpp 304 305 LINK_LIBS 306 lldbDebugserverCommon_NonUI 307 308 ENTITLEMENTS 309 ${entitlements} 310 ) 311endif() 312