From 0b0bf90e0b47489751d6e9380c5422bbd9516f59 Mon Sep 17 00:00:00 2001 From: iTrooz Date: Sun, 26 May 2024 20:48:14 +0200 Subject: [PATCH] build: Compress debug info (#1719) This PR compress the debug info in the ELF files built. This has no impact on the packages (e.g. .deb files) because they themselves have compression, but once installed in the filesystem, they this compression will be beneficial The compression is opportunistic, happens automatically when possible For some reason, the web version doesn't work with this (most compiler tests after this seem to fail ?) so it is disabled there More information: https://github.com/WerWolv/ImHex/issues/1714#issuecomment-2131373826 --- CMakeLists.txt | 1 + cmake/build_helpers.cmake | 29 +++++++++++++++++++++++++++++ dist/web/Dockerfile | 1 + 3 files changed, 31 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1197251dd..1cfd610f9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,6 +21,7 @@ option(IMHEX_REPLACE_DWARF_WITH_PDB "Remove DWARF information from binaries option(IMHEX_ENABLE_STD_ASSERTS "Enable debug asserts in the C++ std library. (Breaks Plugin ABI!)" OFF) option(IMHEX_ENABLE_UNIT_TESTS "Enable building unit tests" OFF) option(IMHEX_ENABLE_PRECOMPILED_HEADERS "Enable precompiled headers" OFF) +option(IMHEX_COMPRESS_DEBUG_INFO "Compress debug information" ON ) set(IMHEX_BASE_FOLDER "${CMAKE_CURRENT_SOURCE_DIR}") set(CMAKE_MODULE_PATH "${IMHEX_BASE_FOLDER}/cmake/modules") diff --git a/cmake/build_helpers.cmake b/cmake/build_helpers.cmake index e0eacd9db..2df604b7d 100644 --- a/cmake/build_helpers.cmake +++ b/cmake/build_helpers.cmake @@ -531,6 +531,31 @@ function(downloadImHexPatternsFiles dest) endfunction() +# Compress debug info. See https://github.com/WerWolv/ImHex/issues/1714 for relevant problem +macro(setupDebugCompressionFlag) + include(CheckCXXCompilerFlag) + include(CheckLinkerFlag) + + check_cxx_compiler_flag(-gz=zstd ZSTD_AVAILABLE_COMPILER) + check_linker_flag(CXX -gz=zstd ZSTD_AVAILABLE_LINKER) + check_cxx_compiler_flag(-gz COMPRESS_AVAILABLE_COMPILER) + check_linker_flag(CXX -gz COMPRESS_AVAILABLE_LINKER) + + if (NOT DEBUG_COMPRESSION_FLAG) # Cache variable + if (ZSTD_AVAILABLE_COMPILER AND ZSTD_AVAILABLE_LINKER) + message("Using Zstd compression for debug info because both compiler and linker support it") + set(DEBUG_COMPRESSION_FLAG "-gz=zstd" CACHE STRING "Cache to use for debug info compression") + elseif (COMPRESS_AVAILABLE_COMPILER AND COMPRESS_AVAILABLE_LINKER) + message("Using default compression for debug info because both compiler and linker support it") + set(DEBUG_COMPRESSION_FLAG "-gz" CACHE STRING "Cache to use for debug info compression") + else() + message("No compression available for debug info") + endif() + endif() + + set(IMHEX_COMMON_FLAGS "${IMHEX_COMMON_FLAGS} ${DEBUG_COMPRESSION_FLAG}") +endmacro() + macro(setupCompilerFlags target) # IMHEX_COMMON_FLAGS: flags common for C, C++, Objective C, etc.. compilers @@ -566,6 +591,10 @@ macro(setupCompilerFlags target) set(IMHEX_C_CXX_FLAGS "${IMHEX_C_CXX_FLAGS} -pthread -Wno-dollar-in-identifier-extension -Wno-pthreads-mem-growth") endif () + if (IMHEX_COMPRESS_DEBUG_INFO) + setupDebugCompressionFlag() + endif() + # Set actual CMake flags set_target_properties(${target} PROPERTIES COMPILE_FLAGS "${IMHEX_COMMON_FLAGS} ${IMHEX_C_CXX_FLAGS}") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${IMHEX_COMMON_FLAGS} ${IMHEX_C_CXX_FLAGS}") diff --git a/dist/web/Dockerfile b/dist/web/Dockerfile index 9306b0009..a8198a23d 100644 --- a/dist/web/Dockerfile +++ b/dist/web/Dockerfile @@ -59,6 +59,7 @@ cmake /imhex -DIMHEX_OFFLINE_BUILD=ON \ -DIMHEX_STATIC_LINK_PLUGINS=ON \ -DIMHEX_EXCLUDE_PLUGINS="script_loader" \ + -DIMHEX_COMPRESS_DEBUG_INFO=OFF \ -DNATIVE_CMAKE_C_COMPILER=gcc \ -DNATIVE_CMAKE_CXX_COMPILER=g++ \ -DCMAKE_C_COMPILER_LAUNCHER=ccache \