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