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