mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-11-08 02:53:25 -08:00
[CrashReporting] Split debug information out of packaged release binaries
-g is required so the CI symbol upload has DWARF to send, but it was left in the shipped binaries too: the Linux Release client is 563 MiB, 552 MiB of it debug info, and every distribution channel pays for that. Keep the build tree unchanged (CI uploads symbols from build/) and strip only the packaged copy. A CPack pre-build script extracts each ELF's debug info to COCKATRICE_DEBUG_SYMBOL_DIR and then runs `strip --strip-debug --strip-unneeded`. .eh_frame is allocatable and survives, so unwinding is unaffected, and the build ID is identical in the stripped binary and the sidecar. Measured on a local Release build (GCC -O2 -g, WITH_CRASH_REPORTING=ON), bytes: binary build tree packaged before packaged after .debug sidecar cockatrice 590,722,560 590,722,560 28,086,480 579,623,576 oracle 53,432,608 53,432,608 1,649,888 52,075,344 tar.gz of both trees: 289,964,521 -> 19,018,058 (~15x smaller). Only ELF (Linux/BSD) is handled: Windows already links /DEBUG with separate PDBs, and macOS extracts a dSYM from the bundle. Opt-out via COCKATRICE_SPLIT_DEBUG_SYMBOLS; skipped with a warning when objcopy/strip are missing. CPACK_PRE_BUILD_SCRIPTS (not CPACK_INSTALL_SCRIPTS, which runs before staging) invokes it, and the script refuses to run unless CPACK_TEMPORARY_DIRECTORY is a real CPack staging tree so a missing variable can never turn its glob into a filesystem-wide walk.
This commit is contained in:
parent
c4ba4047e1
commit
ee404ada3b
2 changed files with 116 additions and 0 deletions
|
|
@ -143,3 +143,39 @@ else()
|
|||
"(WITH_CRASH_REPORTING=${WITH_CRASH_REPORTING}, WITH_CLIENT=${WITH_CLIENT})"
|
||||
)
|
||||
endif()
|
||||
|
||||
# Packaged release binaries must not ship the DWARF that the symbol upload needs: it is
|
||||
# 80-90% of an unstripped binary and nobody downloads a 500 MB installer to get it. The
|
||||
# build tree keeps -g (CI uploads symbols from there); the *packaged copy* is split at
|
||||
# install time by a CPack install script, which extracts the debug info next to the staging
|
||||
# dir and strips the binary. Only ELF (Linux/BSD) needs this: Windows links /DEBUG with
|
||||
# separate PDBs, and macOS keeps its dSYM extracted from the bundle.
|
||||
option(COCKATRICE_SPLIT_DEBUG_SYMBOLS "Strip DWARF out of packaged release binaries" ON)
|
||||
set(COCKATRICE_DEBUG_SYMBOL_DIR
|
||||
"${CMAKE_BINARY_DIR}/debug-symbols"
|
||||
CACHE PATH "Where the packaged binaries' split debug information is written (kept out of the package)"
|
||||
)
|
||||
if(WITH_CRASH_REPORTING
|
||||
AND WITH_CLIENT
|
||||
AND COCKATRICE_SPLIT_DEBUG_SYMBOLS
|
||||
AND CMAKE_BUILD_TYPE STREQUAL "Release"
|
||||
AND UNIX
|
||||
AND NOT APPLE
|
||||
)
|
||||
find_program(COCKATRICE_OBJCOPY NAMES objcopy)
|
||||
find_program(COCKATRICE_STRIP_TOOL NAMES strip)
|
||||
if(COCKATRICE_OBJCOPY AND COCKATRICE_STRIP_TOOL)
|
||||
configure_file(
|
||||
"${CMAKE_CURRENT_LIST_DIR}/SplitDebugSymbols.cmake.in" "${CMAKE_BINARY_DIR}/cmake/SplitDebugSymbols.cmake" @ONLY
|
||||
)
|
||||
# PRE_BUILD runs after CPack stages the install tree and before the package is produced.
|
||||
# CPACK_INSTALL_SCRIPTS would run too early (staging is still empty); the script walks
|
||||
# CPACK_TEMPORARY_DIRECTORY, never CMAKE_INSTALL_PREFIX, and refuses to run otherwise.
|
||||
list(APPEND CPACK_PRE_BUILD_SCRIPTS "${CMAKE_BINARY_DIR}/cmake/SplitDebugSymbols.cmake")
|
||||
message(STATUS "Crash reporting: packaged binaries stripped, debug info split to ${COCKATRICE_DEBUG_SYMBOL_DIR}")
|
||||
else()
|
||||
message(WARNING "COCKATRICE_SPLIT_DEBUG_SYMBOLS is ON but objcopy/strip were not found; "
|
||||
"packaged release binaries will keep their debug information"
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue