CMake 4 no longer sets the `CMAKE_OSX_SYSROOT` variable by default. If you've updated to CMake 4 on macOS (e.g. with brew) and try building LLDB with CMake/ninja, this will yield an error when building debugserver that clang is unable to run since it tries to compile files that don't exist. These files are supposed to be generated by the `mig` process. `mig` needs the `CMAKE_OSX_SYSROOT` variable in order to work and without it, it silently fails to generate the files that later on need to be compiled. This commit sets this SDK path for mig and will fatal error out of config when building debugserver without having set CMAKE_OSX_SYSROOT.
339 lines
11 KiB
CMake
339 lines
11 KiB
CMake
include(CheckCXXCompilerFlag)
|
|
include(CheckLibraryExists)
|
|
include_directories(${CMAKE_CURRENT_BINARY_DIR}/..)
|
|
include_directories(${LLDB_SOURCE_DIR}/source)
|
|
include_directories(MacOSX)
|
|
include_directories(MacOSX/x86_64)
|
|
include_directories(MacOSX/arm64)
|
|
|
|
function(check_certificate identity result_valid)
|
|
execute_process(
|
|
COMMAND security find-certificate -Z -p -c ${identity} /Library/Keychains/System.keychain
|
|
RESULT_VARIABLE exit_code OUTPUT_QUIET ERROR_QUIET)
|
|
if(exit_code)
|
|
set(${result_valid} FALSE PARENT_SCOPE)
|
|
else()
|
|
set(${result_valid} TRUE PARENT_SCOPE)
|
|
endif()
|
|
endfunction()
|
|
|
|
function(get_debugserver_codesign_identity result)
|
|
string(CONCAT not_found_help
|
|
"This will cause failures in the test suite. "
|
|
"Pass '-DLLDB_USE_SYSTEM_DEBUGSERVER=ON' to use the system one instead. "
|
|
"See 'Code Signing on macOS' in the documentation."
|
|
)
|
|
|
|
# Explicit override: warn if unavailable
|
|
if(LLDB_CODESIGN_IDENTITY)
|
|
set(${result} ${LLDB_CODESIGN_IDENTITY} PARENT_SCOPE)
|
|
check_certificate(${LLDB_CODESIGN_IDENTITY} available)
|
|
if(NOT available)
|
|
message(WARNING "LLDB_CODESIGN_IDENTITY not found: '${LLDB_CODESIGN_IDENTITY}' ${not_found_help}")
|
|
endif()
|
|
return()
|
|
endif()
|
|
|
|
# Development signing identity: use if available
|
|
check_certificate(lldb_codesign available)
|
|
if(available)
|
|
set(${result} lldb_codesign PARENT_SCOPE)
|
|
return()
|
|
endif()
|
|
|
|
message(WARNING "Development code sign identity not found: 'lldb_codesign' ${not_found_help}")
|
|
|
|
# LLVM pendant: fallback if available
|
|
if(LLVM_CODESIGNING_IDENTITY)
|
|
check_certificate(${LLVM_CODESIGNING_IDENTITY} available)
|
|
if(available)
|
|
set(${result} ${LLVM_CODESIGNING_IDENTITY} PARENT_SCOPE)
|
|
return()
|
|
endif()
|
|
endif()
|
|
|
|
# Ad-hoc signing: last resort
|
|
set(${result} "-" PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
# debugserver does not depend on intrinsics_gen, or on llvm. Set the common
|
|
# llvm dependencies in the current scope to the empty set.
|
|
set(LLVM_COMMON_DEPENDS)
|
|
|
|
set(DEBUGSERVER_RESOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../resources")
|
|
set(DEBUGSERVER_INFO_PLIST "${DEBUGSERVER_RESOURCE_DIR}/lldb-debugserver-Info.plist")
|
|
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++ -Wl,-sectcreate,__TEXT,__info_plist,${DEBUGSERVER_INFO_PLIST}")
|
|
|
|
check_cxx_compiler_flag("-Wno-gnu-zero-variadic-macro-arguments"
|
|
CXX_SUPPORTS_NO_GNU_ZERO_VARIADIC_MACRO_ARGUMENTS)
|
|
if (CXX_SUPPORTS_NO_GNU_ZERO_VARIADIC_MACRO_ARGUMENTS)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-gnu-zero-variadic-macro-arguments")
|
|
endif ()
|
|
|
|
check_cxx_compiler_flag("-Wno-zero-length-array"
|
|
CXX_SUPPORTS_NO_ZERO_LENGTH_ARRAY)
|
|
if (CXX_SUPPORTS_NO_ZERO_LENGTH_ARRAY)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-zero-length-array")
|
|
endif ()
|
|
|
|
check_cxx_compiler_flag("-Wno-extended-offsetof"
|
|
CXX_SUPPORTS_NO_EXTENDED_OFFSETOF)
|
|
if (CXX_SUPPORTS_NO_EXTENDED_OFFSETOF)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-extended-offsetof")
|
|
endif ()
|
|
|
|
include(CheckCSourceCompiles)
|
|
check_c_source_compiles(
|
|
"
|
|
#include <TargetConditionals.h>
|
|
#if TARGET_CPU_ARM64
|
|
#if TARGET_OS_OSX
|
|
#warning Building for macOS
|
|
#else
|
|
#error Not building for macOS
|
|
#endif
|
|
#else
|
|
#error Not building for ARM64
|
|
#endif
|
|
int main(void) { return 0; }
|
|
"
|
|
BUILDING_FOR_ARM64_OSX
|
|
)
|
|
|
|
# You can only debug arm64e processes using an arm64e debugserver.
|
|
option(LLDB_ENABLE_ARM64E_DEBUGSERVER "Build debugserver for arm64 and arm64e" OFF)
|
|
if (BUILDING_FOR_ARM64_OSX AND LLDB_ENABLE_ARM64E_DEBUGSERVER)
|
|
set(CMAKE_OSX_ARCHITECTURES "arm64;arm64e")
|
|
endif ()
|
|
|
|
find_library(SECURITY_LIBRARY Security)
|
|
|
|
set(LLDB_CODESIGN_IDENTITY "" CACHE STRING
|
|
"Identity override for debugserver; see 'Code Signing on macOS' in the documentation (Darwin only)")
|
|
|
|
get_debugserver_codesign_identity(debugserver_codesign_identity)
|
|
|
|
# Override locally, so the identity is used for targets created in this scope.
|
|
set(LLVM_CODESIGNING_IDENTITY ${debugserver_codesign_identity})
|
|
|
|
if(APPLE)
|
|
set(LIBCOMPRESSION compression)
|
|
if(APPLE_EMBEDDED)
|
|
find_library(BACKBOARD_LIBRARY BackBoardServices
|
|
PATHS ${CMAKE_OSX_SYSROOT}/System/Library/PrivateFrameworks)
|
|
find_library(FRONTBOARD_LIBRARY FrontBoardServices
|
|
PATHS ${CMAKE_OSX_SYSROOT}/System/Library/PrivateFrameworks)
|
|
find_library(SPRINGBOARD_LIBRARY SpringBoardServices
|
|
PATHS ${CMAKE_OSX_SYSROOT}/System/Library/PrivateFrameworks)
|
|
find_library(MOBILESERVICES_LIBRARY MobileCoreServices
|
|
PATHS ${CMAKE_OSX_SYSROOT}/System/Library/PrivateFrameworks)
|
|
find_library(LOCKDOWN_LIBRARY lockdown)
|
|
if (APPLE_EMBEDDED STREQUAL "watchos")
|
|
find_library(CAROUSELSERVICES_LIBRARY CarouselServices
|
|
PATHS ${CMAKE_OSX_SYSROOT}/System/Library/PrivateFrameworks)
|
|
endif()
|
|
|
|
if(NOT BACKBOARD_LIBRARY)
|
|
set(SKIP_TEST_DEBUGSERVER ON CACHE BOOL "" FORCE)
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
if(LLDB_USE_ENTITLEMENTS)
|
|
if(APPLE_EMBEDDED)
|
|
set(entitlements ${DEBUGSERVER_RESOURCE_DIR}/debugserver-entitlements.plist)
|
|
else()
|
|
if (LLDB_USE_PRIVATE_ENTITLEMENTS)
|
|
set(entitlements ${DEBUGSERVER_RESOURCE_DIR}/debugserver-macosx-private-entitlements.plist)
|
|
else()
|
|
set(entitlements ${DEBUGSERVER_RESOURCE_DIR}/debugserver-macosx-entitlements.plist)
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
add_definitions(-DLLDB_USE_OS_LOG)
|
|
|
|
# Make sure we have the macOS SDK root as mig needs it and will silently
|
|
# fail to generate its output files without it.
|
|
if(CMAKE_OSX_SYSROOT)
|
|
set(MIG_SYSROOT ${CMAKE_OSX_SYSROOT})
|
|
else()
|
|
execute_process(COMMAND xcrun --show-sdk-path
|
|
OUTPUT_VARIABLE MIG_SYSROOT
|
|
ERROR_QUIET
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
endif()
|
|
|
|
if(NOT MIG_SYSROOT)
|
|
message(FATAL_ERROR "Unable to obtain sysroot required by mig (Mach Interface Generator). Set CMAKE_OSX_SYSROOT to explicitly specify a sysroot.")
|
|
endif()
|
|
|
|
if(${CMAKE_OSX_SYSROOT} MATCHES ".Internal.sdk$")
|
|
message(STATUS "LLDB debugserver energy support is enabled")
|
|
add_definitions(-DLLDB_ENERGY)
|
|
set(ENERGY_LIBRARY -lpmenergy -lpmsample)
|
|
else()
|
|
message(STATUS "LLDB debugserver energy support is disabled")
|
|
endif()
|
|
|
|
set(generated_mach_interfaces
|
|
${CMAKE_CURRENT_BINARY_DIR}/mach_exc.h
|
|
${CMAKE_CURRENT_BINARY_DIR}/mach_excServer.c
|
|
${CMAKE_CURRENT_BINARY_DIR}/mach_excUser.c
|
|
)
|
|
|
|
set(MIG_ARCH_FLAGS "")
|
|
if (DEFINED MIG_ARCHS)
|
|
foreach(ARCH ${MIG_ARCHS})
|
|
set(MIG_ARCH_FLAGS "${MIG_ARCH_FLAGS} -arch ${ARCH}")
|
|
endforeach()
|
|
endif()
|
|
separate_arguments(MIG_ARCH_FLAGS_SEPARTED NATIVE_COMMAND "${MIG_ARCH_FLAGS}")
|
|
|
|
add_custom_command(OUTPUT ${generated_mach_interfaces}
|
|
VERBATIM COMMAND mig ${MIG_ARCH_FLAGS_SEPARTED} -isysroot ${MIG_SYSROOT} ${CMAKE_CURRENT_SOURCE_DIR}/MacOSX/dbgnub-mig.defs
|
|
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/MacOSX/dbgnub-mig.defs
|
|
)
|
|
|
|
set(DEBUGSERVER_VERS_GENERATED_FILE ${CMAKE_CURRENT_BINARY_DIR}/debugserver_vers.c)
|
|
configure_file(debugserver_vers.c.in
|
|
${DEBUGSERVER_VERS_GENERATED_FILE} @ONLY)
|
|
|
|
set(lldbDebugserverCommonSources
|
|
DNBArch.cpp
|
|
DNBBreakpoint.cpp
|
|
DNB.cpp
|
|
DNBDataRef.cpp
|
|
DNBError.cpp
|
|
DNBLog.cpp
|
|
DNBRegisterInfo.cpp
|
|
DNBThreadResumeActions.cpp
|
|
JSON.cpp
|
|
StdStringExtractor.cpp
|
|
StringConvert.cpp
|
|
# JSON reader depends on the following LLDB-common files
|
|
${LLDB_SOURCE_DIR}/source/Host/common/SocketAddress.cpp
|
|
# end JSON reader dependencies
|
|
libdebugserver.cpp
|
|
PseudoTerminal.cpp
|
|
PThreadEvent.cpp
|
|
RNBContext.cpp
|
|
RNBRemote.cpp
|
|
RNBServices.cpp
|
|
RNBSocket.cpp
|
|
SysSignal.cpp
|
|
TTYState.cpp
|
|
|
|
MacOSX/CFBundle.cpp
|
|
MacOSX/CFString.cpp
|
|
MacOSX/Genealogy.cpp
|
|
MacOSX/MachException.cpp
|
|
MacOSX/MachProcess.mm
|
|
MacOSX/MachTask.mm
|
|
MacOSX/MachThread.cpp
|
|
MacOSX/MachThreadList.cpp
|
|
MacOSX/MachVMMemory.cpp
|
|
MacOSX/MachVMRegion.cpp
|
|
MacOSX/OsLogger.cpp
|
|
MacOSX/arm64/DNBArchImplARM64.cpp
|
|
MacOSX/x86_64/DNBArchImplX86_64.cpp
|
|
${generated_mach_interfaces}
|
|
${DEBUGSERVER_VERS_GENERATED_FILE})
|
|
|
|
# Tell LLVM not to complain about these source files.
|
|
set(LLVM_OPTIONAL_SOURCES
|
|
${lldbDebugserverCommonSources}
|
|
debugserver.cpp)
|
|
|
|
add_lldb_library(lldbDebugserverCommon ${lldbDebugserverCommonSources})
|
|
set_target_properties(lldbDebugserverCommon PROPERTIES FOLDER "lldb libraries/debugserver")
|
|
|
|
target_link_libraries(lldbDebugserverCommon
|
|
INTERFACE ${COCOA_LIBRARY}
|
|
${CORE_FOUNDATION_LIBRARY}
|
|
${FOUNDATION_LIBRARY}
|
|
${BACKBOARD_LIBRARY}
|
|
${FRONTBOARD_LIBRARY}
|
|
${SPRINGBOARD_LIBRARY}
|
|
${MOBILESERVICES_LIBRARY}
|
|
${LOCKDOWN_LIBRARY}
|
|
${CAROUSELSERVICES_LIBRARY}
|
|
${FOUNDATION_LIBRARY}
|
|
${SECURITY_LIBRARY}
|
|
${LIBCOMPRESSION}
|
|
${ENERGY_LIBRARY})
|
|
add_lldb_tool(debugserver ADD_TO_FRAMEWORK
|
|
debugserver.cpp
|
|
LINK_LIBS lldbDebugserverCommon
|
|
ENTITLEMENTS ${entitlements}
|
|
)
|
|
|
|
# Workaround for Xcode-specific code-signing behavior:
|
|
# The XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY option causes debugserver to be copied
|
|
# into the framework first and code-signed afterwards. Sign the copy manually.
|
|
if (debugserver_codesign_identity AND LLDB_BUILD_FRAMEWORK AND
|
|
CMAKE_GENERATOR STREQUAL "Xcode")
|
|
if(NOT CMAKE_CODESIGN_ALLOCATE)
|
|
execute_process(
|
|
COMMAND xcrun -f codesign_allocate
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
OUTPUT_VARIABLE CMAKE_CODESIGN_ALLOCATE
|
|
)
|
|
endif()
|
|
if(entitlements)
|
|
set(pass_entitlements --entitlements ${entitlements})
|
|
endif()
|
|
|
|
set(copy_location ${LLDB_FRAMEWORK_ABSOLUTE_BUILD_DIR}/LLDB.framework/Versions/${LLDB_FRAMEWORK_VERSION}/Resources/debugserver)
|
|
|
|
add_custom_command(TARGET debugserver POST_BUILD
|
|
COMMAND ${CMAKE_COMMAND} -E
|
|
env CODESIGN_ALLOCATE=${CMAKE_CODESIGN_ALLOCATE}
|
|
xcrun codesign -f -s ${debugserver_codesign_identity}
|
|
${pass_entitlements} ${copy_location}
|
|
COMMENT "Code-sign debugserver copy in the build-tree framework: ${copy_location}"
|
|
)
|
|
endif()
|
|
|
|
set_target_properties(debugserver PROPERTIES FOLDER "lldb libraries/debugserver")
|
|
|
|
if(APPLE_EMBEDDED)
|
|
set_property(TARGET lldbDebugserverCommon APPEND PROPERTY COMPILE_DEFINITIONS
|
|
WITH_LOCKDOWN
|
|
WITH_FBS
|
|
WITH_BKS
|
|
)
|
|
if(CAROUSELSERVICES_LIBRARY)
|
|
set_property(TARGET lldbDebugserverCommon APPEND PROPERTY COMPILE_DEFINITIONS
|
|
WITH_CAROUSEL
|
|
)
|
|
endif()
|
|
set_property(TARGET debugserver APPEND PROPERTY COMPILE_DEFINITIONS
|
|
WITH_LOCKDOWN
|
|
WITH_FBS
|
|
WITH_BKS
|
|
)
|
|
set_property(TARGET lldbDebugserverCommon APPEND PROPERTY COMPILE_FLAGS
|
|
-F${CMAKE_OSX_SYSROOT}/System/Library/PrivateFrameworks
|
|
)
|
|
|
|
add_lldb_library(lldbDebugserverCommon_NonUI ${lldbDebugserverCommonSources})
|
|
target_link_libraries(lldbDebugserverCommon_NonUI
|
|
INTERFACE ${COCOA_LIBRARY}
|
|
${CORE_FOUNDATION_LIBRARY}
|
|
${FOUNDATION_LIBRARY}
|
|
${SECURITY_LIBRARY}
|
|
${LIBCOMPRESSION})
|
|
|
|
add_lldb_tool(debugserver-nonui
|
|
debugserver.cpp
|
|
|
|
LINK_LIBS
|
|
lldbDebugserverCommon_NonUI
|
|
|
|
ENTITLEMENTS
|
|
${entitlements}
|
|
)
|
|
endif()
|