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