Find Crashpad via CMake configuration

Makes it possible to point CMake to crashpad via CMAKE_PREFIX_PATH
if it was built to <crashpad>/out/Default, or by setting individual
CRASHPAD_* variables to the sources and build results.

Change-Id: I9634fe7ab8c1e14b7e0f3ccf3415396c8dc1e71a
Reviewed-by: Cristian Adam <cristian.adam@qt.io>
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
This commit is contained in:
Eike Ziller
2021-01-19 15:49:30 +01:00
parent acdb16dd4a
commit 44901a3863
4 changed files with 147 additions and 67 deletions

View File

@@ -55,6 +55,17 @@ find_package(Threads)
find_package(Clang QUIET)
find_package(KF5SyntaxHighlighting QUIET)
# Crashpad
set(CRASHPAD_BACKEND_URL "" CACHE STRING "Crashpad backend URL")
set(BUILD_WITH_CRASHPAD OFF)
if(CRASHPAD_BACKEND_URL AND (WIN32 OR APPLE)) # Linux is not supported for now
find_package(Crashpad QUIET)
if(TARGET Crashpad::Crashpad)
set(BUILD_WITH_CRASHPAD ON)
endif()
endif()
add_feature_info("Build with Crashpad" ${BUILD_WITH_CRASHPAD} "")
function (set_if_target var target)
if (TARGET "${target}")
set(_result ON)

119
cmake/FindCrashpad.cmake Normal file
View File

@@ -0,0 +1,119 @@
#.rst:
# FindCrashpad
# ------------
# Locate Crashpad sources and build
#
# The ``CRASHPAD_BUILD_DIR``, ``CRASHPAD_SOURCE_DIR``, and ``CRASHPAD_OBJECT_DIR``
# (APPLE-only) variables can be used as additional hints.
#
# If you built crashpad with the default setup in "out/Default" within the
# source directory, you can set the ``Crashpad_ROOT`` variable to the source
# directory, or add it to ``CMAKE_PREFIX_PATH``.
#
# If found, this will define the following variables:
#
# ``Crashpad_FOUND``
# True if the necessary Crashpad files have been found
#
# ``Crashpad::Crashpad``
# Imported target to build against
#
# ``CRASHPAD_BIN_DIR``
# Directory where the crashpad_handler executable is found
if(TARGET Crashpad::Crashpad)
set(Crashpad_FOUND TRUE)
return()
endif()
find_path(CRASHPAD_BIN_DIR
NAMES crashpad_handler crashpad_handler.exe
PATH_SUFFIXES out/Default
HINTS
"${CRASHPAD_BUILD_DIR}"
"${CMAKE_PREFIX_PATH}"
)
find_path(CRASHPAD_INCLUDE_DIR
NAMES client/crashpad_client.h
HINTS
"${CRASHPAD_SOURCE_DIR}"
"${CMAKE_PREFIX_PATH}"
)
find_path(CRASHPAD_LIB_DIR
NAMES util/libutil.a util/util.lib
PATH_SUFFIXES out/Default/obj
HINTS
"${CRASHPAD_BIN_DIR}/obj"
"${CMAKE_PREFIX_PATH}"
)
if(APPLE)
find_path(CRASHPAD_OBJ_DIR
NAMES mig_output.child_portServer.o
PATH_SUFFIXES gen/util/mach
HINTS
"${CRASHPAD_OBJECT_DIR}"
"${CRASHPAD_LIB_DIR}/out/Default"
"${CMAKE_PREFIX_PATH}"
)
find_path(CRASHPAD_GEN_DIR
NAMES build/chromeos_buildflags.h
PATH_SUFFIXES gen
HINTS
"${CRASHPAD_BIN_DIR}"
"${CMAKE_PREFIX_PATH}"
)
set(CRASHPAD_APPLE_VARS CRASHPAD_OBJ_DIR CRASHPAD_GEN_DIR)
find_library(FWbsm bsm)
find_library(FWAppKit AppKit)
find_library(FWIOKit IOKit)
find_library(FWSecurity Security)
endif()
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Crashpad DEFAULT_MSG
CRASHPAD_BIN_DIR CRASHPAD_INCLUDE_DIR CRASHPAD_LIB_DIR ${CRASHPAD_APPLE_VARS}
)
if(Crashpad_FOUND)
add_library(Crashpad::Crashpad UNKNOWN IMPORTED)
target_include_directories(Crashpad::Crashpad INTERFACE
"${CRASHPAD_INCLUDE_DIR}"
"${CRASHPAD_INCLUDE_DIR}/third_party/mini_chromium/mini_chromium")
if(WIN32)
target_link_libraries(Crashpad::Crashpad INTERFACE
"${CRASHPAD_LIB_DIR}/third_party/mini_chromium/mini_chromium/base/base.lib"
"${CRASHPAD_LIB_DIR}/util/util.lib"
"${CRASHPAD_LIB_DIR}/client/client.lib"
advapi32)
set_target_properties(Crashpad::Crashpad PROPERTIES
IMPORTED_LOCATION "${CRASHPAD_LIB_DIR}/client/client.lib")
elseif(APPLE)
target_link_libraries(Crashpad::Crashpad INTERFACE
"${CRASHPAD_LIB_DIR}/third_party/mini_chromium/mini_chromium/base/libbase.a"
"${CRASHPAD_LIB_DIR}/util/libutil.a"
"${CRASHPAD_LIB_DIR}/client/libclient.a"
"${CRASHPAD_OBJ_DIR}/mig_output.child_portServer.o"
"${CRASHPAD_OBJ_DIR}/mig_output.child_portUser.o"
"${CRASHPAD_OBJ_DIR}/mig_output.excServer.o"
"${CRASHPAD_OBJ_DIR}/mig_output.excUser.o"
"${CRASHPAD_OBJ_DIR}/mig_output.mach_excServer.o"
"${CRASHPAD_OBJ_DIR}/mig_output.mach_excUser.o"
"${CRASHPAD_OBJ_DIR}/mig_output.notifyServer.o"
"${CRASHPAD_OBJ_DIR}/mig_output.notifyUser.o"
${FWbsm} ${FWAppKit} ${FWIOKit} ${FWSecurity})
set_target_properties(Crashpad::Crashpad PROPERTIES
IMPORTED_LOCATION "${CRASHPAD_LIB_DIR}/client/libclient.a")
target_include_directories(Crashpad::Crashpad INTERFACE "${CRASHPAD_GEN_DIR}")
elseif(UNIX)
# TODO: Crashpad is not well supported on linux currently
target_link_libraries(Crashpad::Crashpad INTERFACE
"${CRASHPAD_LIB_DIR}/third_party/mini_chromium/mini_chromium/base/libbase.a"
"${CRASHPAD_LIB_DIR}/util/libutil.a"
"${CRASHPAD_LIB_DIR}/client/libclient.a")
set_target_properties(Crashpad::Crashpad PROPERTIES
IMPORTED_LOCATION "${CRASHPAD_LIB_DIR}/client/libclient.a")
endif()
endif()

View File

@@ -80,53 +80,14 @@ if (APPLE)
)
endif()
# Crashpad
set(CRASHPAD_BACKEND_URL "" CACHE STRING "Crashpad backend URL")
set(CRASHPAD_SRC "" CACHE STRING "Path to Crashpad source code")
set(CRASHPAD_BUILD "" CACHE STRING "Path to Crashpad build folder")
if (CRASHPAD_BACKEND_URL
AND CRASHPAD_SRC
AND EXISTS "${CRASHPAD_SRC}"
AND CRASHPAD_BUILD
AND EXISTS "${CRASHPAD_BUILD}"
AND (WIN32 OR APPLE)) # LINUX isn't supported for now
target_compile_definitions(qtcreator PRIVATE
CRASHPAD_BACKEND_URL="${CRASHPAD_BACKEND_URL}"
ENABLE_CRASHPAD
WIN32_LEAN_AND_MEAN) # It comes usually with precompiled header, but at the installer they are disabled
target_include_directories(qtcreator PRIVATE
"${CRASHPAD_SRC}"
"${CRASHPAD_SRC}/third_party/mini_chromium/mini_chromium")
if (WIN32)
target_link_libraries(qtcreator PUBLIC ${CRASHPAD_BUILD}/obj/third_party/mini_chromium/mini_chromium/base/base.lib
${CRASHPAD_BUILD}/obj/util/util.lib
${CRASHPAD_BUILD}/obj/client/client.lib
advapi32)
install(FILES ${CRASHPAD_BUILD}/crashpad_handler.exe DESTINATION "${IDE_LIBEXEC_PATH}")
elseif(APPLE)
find_library(FWbsm bsm)
target_link_libraries(qtcreator PUBLIC ${CRASHPAD_BUILD}/obj/third_party/mini_chromium/mini_chromium/base/libbase.a
${CRASHPAD_BUILD}/obj/util/libutil.a
${CRASHPAD_BUILD}/obj/client/libclient.a
${CRASHPAD_BUILD}/obj/out/Default/gen/util/mach/mig_output.child_portServer.o
${CRASHPAD_BUILD}/obj/out/Default/gen/util/mach/mig_output.child_portUser.o
${CRASHPAD_BUILD}/obj/out/Default/gen/util/mach/mig_output.excServer.o
${CRASHPAD_BUILD}/obj/out/Default/gen/util/mach/mig_output.excUser.o
${CRASHPAD_BUILD}/obj/out/Default/gen/util/mach/mig_output.mach_excServer.o
${CRASHPAD_BUILD}/obj/out/Default/gen/util/mach/mig_output.mach_excUser.o
${CRASHPAD_BUILD}/obj/out/Default/gen/util/mach/mig_output.notifyServer.o
${CRASHPAD_BUILD}/obj/out/Default/gen/util/mach/mig_output.notifyUser.o
${FWbsm} ${FWAppKit} ${FWIOKit} ${FWSecurity})
install(FILES ${CRASHPAD_BUILD}/crashpad_handler DESTINATION "${IDE_LIBEXEC_PATH}")
elseif(UNIX)
# TODO: Crashpad is not well supported on linux currently
target_link_libraries(qtcreator PUBLIC ${CRASHPAD_BUILD}/obj/third_party/mini_chromium/mini_chromium/base/libbase.a
${CRASHPAD_BUILD}/obj/util/libutil.a
${CRASHPAD_BUILD}/obj/client/libclient.a)
install(FILES ${CRASHPAD_BUILD}/crashpad_handler DESTINATION "${IDE_LIBEXEC_PATH}")
endif()
extend_qtc_executable(qtcreator
CONDITION BUILD_WITH_CRASHPAD
DEFINES
CRASHPAD_BACKEND_URL="${CRASHPAD_BACKEND_URL}"
ENABLE_CRASHPAD
WIN32_LEAN_AND_MEAN # It comes usually with precompiled header, but at the installer they are disabled
DEPENDS Crashpad::Crashpad
)
if(BUILD_WITH_CRASHPAD)
install(FILES ${CRASHPAD_BIN_DIR}/crashpad_handler${CMAKE_EXECUTABLE_SUFFIX} DESTINATION "${IDE_LIBEXEC_PATH}")
endif()

View File

@@ -211,21 +211,10 @@ extend_qtc_executable(qml2puppet
# Crashpad
# only windows requires separate crashpad client per process until client->SetHandlerIPCPipe()
# is implemented (check the TODO inside startCrashpad())
if (CRASHPAD_BACKEND_URL
AND CRASHPAD_SRC
AND EXISTS "${CRASHPAD_SRC}"
AND CRASHPAD_BUILD
AND EXISTS "${CRASHPAD_BUILD}"
AND WIN32)
target_compile_definitions(qml2puppet PRIVATE
CRASHPAD_BACKEND_URL="${CRASHPAD_BACKEND_URL}"
ENABLE_CRASHPAD)
target_include_directories(qml2puppet PRIVATE
"${CRASHPAD_SRC}"
"${CRASHPAD_SRC}/third_party/mini_chromium/mini_chromium")
target_link_libraries(qml2puppet PUBLIC ${CRASHPAD_BUILD}/obj/third_party/mini_chromium/mini_chromium/base/base.lib
${CRASHPAD_BUILD}/obj/util/util.lib
${CRASHPAD_BUILD}/obj/client/client.lib
advapi32)
endif()
extend_qtc_executable(qml2puppet
CONDITION BUILD_WITH_CRASHPAD AND WIN32
DEFINES
CRASHPAD_BACKEND_URL="${CRASHPAD_BACKEND_URL}"
ENABLE_CRASHPAD
DEPENDS Crashpad::Crashpad
)