forked from qt-creator/qt-creator
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:
@@ -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
119
cmake/FindCrashpad.cmake
Normal 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()
|
@@ -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
|
||||
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
|
||||
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()
|
||||
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()
|
||||
|
@@ -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
|
||||
extend_qtc_executable(qml2puppet
|
||||
CONDITION BUILD_WITH_CRASHPAD AND WIN32
|
||||
DEFINES
|
||||
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()
|
||||
ENABLE_CRASHPAD
|
||||
DEPENDS Crashpad::Crashpad
|
||||
)
|
||||
|
Reference in New Issue
Block a user