diff --git a/CMakeLists.txt b/CMakeLists.txt index dc4b66829ae..b23103fdff1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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) diff --git a/cmake/FindCrashpad.cmake b/cmake/FindCrashpad.cmake new file mode 100644 index 00000000000..919ec93cd8f --- /dev/null +++ b/cmake/FindCrashpad.cmake @@ -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() diff --git a/src/app/CMakeLists.txt b/src/app/CMakeLists.txt index 41c56f03caa..127e364536b 100644 --- a/src/app/CMakeLists.txt +++ b/src/app/CMakeLists.txt @@ -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() diff --git a/src/tools/qml2puppet/CMakeLists.txt b/src/tools/qml2puppet/CMakeLists.txt index fab8774380a..0881e549437 100644 --- a/src/tools/qml2puppet/CMakeLists.txt +++ b/src/tools/qml2puppet/CMakeLists.txt @@ -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 +)