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