diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index b0bfd881f..1e35af257 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -176,13 +176,13 @@ if (GoogleCrashpad_FOUND) ${OLIVE_TARGET} PRIVATE ${CRASHPAD_INCLUDE_DIRS} - ) + ) target_link_libraries( ${OLIVE_TARGET} PRIVATE ${CRASHPAD_LIBRARIES} - ) + ) set(OLIVE_CRASH_TARGET "olive-crashhandler") @@ -221,14 +221,21 @@ if (GoogleCrashpad_FOUND) ${CRASHPAD_LIBRARIES} ) + set(CRASHPAD_HANDLER "crashpad_handler${CMAKE_EXECUTABLE_SUFFIX}") + set(MINIDUMP_STACKWALK "minidump_stackwalk${CMAKE_EXECUTABLE_SUFFIX}") + if(UNIX AND NOT APPLE) install(TARGETS ${OLIVE_TARGET} ${OLIVE_CRASH_TARGET} RUNTIME DESTINATION bin) + install(PROGRAMS ${CRASHPAD_LIBRARY_DIRS}/${CRASHPAD_HANDLER} DESTINATION bin) + install(PROGRAMS ${BREAKPAD_BIN_DIR}/${MINIDUMP_STACKWALK} DESTINATION bin) endif() if(APPLE) - # Move crash handler program inside Mac app bundle + # Move crash handler executables inside Mac app bundle add_custom_command(TARGET ${OLIVE_CRASH_TARGET} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${OLIVE_CRASH_TARGET} $ + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${OLIVE_CRASH_TARGET} $ + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CRASHPAD_LIBRARY_DIRS}/${CRASHPAD_HANDLER} $ + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${BREAKPAD_BIN_DIR}/${MINIDUMP_STACKWALK} $ ) endif() endif() diff --git a/cmake/FindGoogleCrashpad.cmake b/cmake/FindGoogleCrashpad.cmake index 17474a407..0e56c35ec 100644 --- a/cmake/FindGoogleCrashpad.cmake +++ b/cmake/FindGoogleCrashpad.cmake @@ -18,73 +18,91 @@ include(FindPackageHandleStandardArgs) # Try to find include files find_path(CRASHPAD_CLIENT_INCLUDE_DIR - client/crashpad_client.h - HINTS - "${CRASHPAD_LOCATION}" - "$ENV{CRASHPAD_LOCATION}" - "${CRASHPAD_BASE_DIR}" + client/crashpad_client.h + HINTS + "${CRASHPAD_LOCATION}" + "$ENV{CRASHPAD_LOCATION}" + "${CRASHPAD_BASE_DIR}" ) list(APPEND CRASHPAD_INCLUDE_DIRS ${CRASHPAD_CLIENT_INCLUDE_DIR}) find_path(CRASHPAD_BASE_INCLUDE_DIR - base/files/file_path.h - HINTS - "${CRASHPAD_LOCATION}" - "$ENV{CRASHPAD_LOCATION}" - "${CRASHPAD_BASE_DIR}" - PATH_SUFFIXES - "third_party/mini_chromium/mini_chromium" + base/files/file_path.h + HINTS + "${CRASHPAD_LOCATION}" + "$ENV{CRASHPAD_LOCATION}" + "${CRASHPAD_BASE_DIR}" + PATH_SUFFIXES + "third_party/mini_chromium/mini_chromium" ) list(APPEND CRASHPAD_INCLUDE_DIRS ${CRASHPAD_BASE_INCLUDE_DIR}) # Try to find build files if (WIN32) find_path(CRASHPAD_LIBRARY_DIRS - obj/client/client.lib - HINTS - "${CRASHPAD_LOCATION}" - "$ENV{CRASHPAD_LOCATION}" - "${CRASHPAD_BASE_DIR}" - PATH_SUFFIXES - "out/Default" + obj/client/client.lib + HINTS + "${CRASHPAD_LOCATION}" + "$ENV{CRASHPAD_LOCATION}" + "${CRASHPAD_BASE_DIR}" + PATH_SUFFIXES + "out/Default" ) elseif(UNIX) # Assuming macOS works this way, don't actually know find_path(CRASHPAD_LIBRARY_DIRS - obj/client/libclient.a - HINTS - "${CRASHPAD_LOCATION}" - "$ENV{CRASHPAD_LOCATION}" - "${CRASHPAD_BASE_DIR}" - PATH_SUFFIXES - "out/Default" + obj/client/libclient.a + HINTS + "${CRASHPAD_LOCATION}" + "$ENV{CRASHPAD_LOCATION}" + "${CRASHPAD_BASE_DIR}" + PATH_SUFFIXES + "out/Default" ) endif() # Find the libraries we need set (_crashpad_components - client/client - util/util - third_party/mini_chromium/mini_chromium/base/base) + client + util + third_party/mini_chromium/mini_chromium/base + compat) foreach (COMPONENT ${_crashpad_components}) - string(REGEX MATCH "^(.*[\\\/])" SUBDIR ${COMPONENT}) - string(REGEX MATCH "([^\/]+$)" SHORT_COMPONENT ${COMPONENT}) - string(TOUPPER ${SHORT_COMPONENT} UPPERCOMPONENT) + get_filename_component(SHORT_COMPONENT ${COMPONENT} NAME) + string(TOUPPER ${SHORT_COMPONENT} UPPER_COMPONENT) - find_library(CRASHPAD_${UPPERCOMPONENT}_LIB - ${SHORT_COMPONENT} - HINTS "${CRASHPAD_LIBRARY_DIRS}/obj/${SUBDIR}" + find_library(CRASHPAD_${UPPER_COMPONENT}_LIB + ${SHORT_COMPONENT} + HINTS + "${CRASHPAD_LIBRARY_DIRS}/obj/${COMPONENT}" ) - list(APPEND CRASHPAD_LIBRARIES ${CRASHPAD_${UPPERCOMPONENT}_LIB}) + list(APPEND CRASHPAD_LIBRARIES ${CRASHPAD_${UPPER_COMPONENT}_LIB}) endforeach() if (UNIX AND NOT APPLE) - list(APPEND CRASHPAD_LIBRARIES ${CMAKE_DL_LIBS} Threads::Threads) + list(APPEND CRASHPAD_LIBRARIES + ${CMAKE_DL_LIBS} # Crashpad compat lib needs libdl.so (-ldl) + Threads::Threads # Link against libpthread.so (-lpthread) + ) +endif() + +# Find Breakpad's minidump_stackwalk +if (UNIX) + find_path(BREAKPAD_BIN_DIR + minidump_stackwalk + HINTS + "${BREAKPAD_LOCATION}" + "$ENV{BREAKPAD_LOCATION}" + "${BREAKPAD_BASE_DIR}" + PATH_SUFFIXES + breakpad/bin + ) endif() find_package_handle_standard_args(GoogleCrashpad - REQUIRED_VARS - CRASHPAD_LIBRARIES - CRASHPAD_INCLUDE_DIRS + REQUIRED_VARS + CRASHPAD_LIBRARIES + CRASHPAD_INCLUDE_DIRS + BREAKPAD_BIN_DIR )