From 9a94da70da608b794f6183f618adc05ec6232dc7 Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Thu, 21 Nov 2024 10:33:18 +0100 Subject: [PATCH] KArchive: Add creator specific changes Change-Id: I8227bffd0e83d69d456e49a9d5f66a5ef00ba60e Reviewed-by: Eike Ziller --- scripts/build.py | 3 + src/libs/3rdparty/CMakeLists.txt | 3 +- src/libs/3rdparty/karchive/CMakeLists.txt | 398 ++++++++++++------ src/libs/3rdparty/karchive/CMakeLists.txt.kde | 152 +++++++ src/libs/3rdparty/karchive/src/k7zip.cpp | 11 +- src/libs/3rdparty/karchive/src/karchive.cpp | 16 +- .../karchive/src/kcompressiondevice.cpp | 2 - .../3rdparty/karchive/src/kgzipfilter.cpp | 3 + src/libs/3rdparty/karchive/src/ktar.cpp | 2 +- src/libs/3rdparty/karchive/src/kzip.cpp | 80 ++-- 10 files changed, 496 insertions(+), 174 deletions(-) create mode 100644 src/libs/3rdparty/karchive/CMakeLists.txt.kde diff --git a/scripts/build.py b/scripts/build.py index 6f2cd39e668..737c84a7066 100755 --- a/scripts/build.py +++ b/scripts/build.py @@ -169,6 +169,9 @@ def build_qtcreator(args, paths): '-DBUILD_DEVELOPER_DOCS=' + cmake_option(not args.no_docs), '-DBUILD_EXECUTABLE_SDKTOOL=' + cmake_option(args.with_sdk_tool), '-DQTC_FORCE_XCB=ON', + '-DQTC_USE_SYSTEM_ZLIB=OFF', + '-DQTC_USE_SYSTEM_BZIP2=OFF', + '-DQTC_USE_SYSTEM_LZMA=OFF', '-DWITH_TESTS=' + cmake_option(args.with_tests)] cmake_args += common_cmake_arguments(args) diff --git a/src/libs/3rdparty/CMakeLists.txt b/src/libs/3rdparty/CMakeLists.txt index 3c28a28afd1..e11e6cea919 100644 --- a/src/libs/3rdparty/CMakeLists.txt +++ b/src/libs/3rdparty/CMakeLists.txt @@ -5,8 +5,7 @@ add_subdirectory(libptyqt) add_subdirectory(qtkeychain) add_subdirectory(lua) add_subdirectory(sol2) -# Do not enable it yet, as the necessary changes are only introduced with the next patch. -#add_subdirectory(karchive) +add_subdirectory(karchive) if(WIN32) add_subdirectory(winpty) diff --git a/src/libs/3rdparty/karchive/CMakeLists.txt b/src/libs/3rdparty/karchive/CMakeLists.txt index 43b61a998f1..26fe6ae5484 100644 --- a/src/libs/3rdparty/karchive/CMakeLists.txt +++ b/src/libs/3rdparty/karchive/CMakeLists.txt @@ -1,152 +1,302 @@ -cmake_minimum_required(VERSION 3.16) +option(QTC_USE_SYSTEM_BZIP2 "Use system bzip2 instead of included bzip2" ON) +option(QTC_USE_SYSTEM_ZLIB "Use system zlib instead of included zlib" ON) +option(QTC_USE_SYSTEM_LZMA "Use system liblzma instead of included liblzma" ON) -set(KF_VERSION "6.10.0") # handled by release scripts -project(KArchive VERSION ${KF_VERSION}) - -include(FeatureSummary) -find_package(ECM 6.9.0 NO_MODULE) -set_package_properties(ECM PROPERTIES TYPE REQUIRED DESCRIPTION "Extra CMake Modules." URL "https://commits.kde.org/extra-cmake-modules") -feature_summary(WHAT REQUIRED_PACKAGES_NOT_FOUND FATAL_ON_MISSING_REQUIRED_PACKAGES) - -option(WITH_BZIP2 "Make bzip2 required" ON) -option(WITH_LIBLZMA "Make liblzma required" ON) -option(WITH_LIBZSTD "Make libzstd required" ON) - -set(PKGCONFIG_REQUIRED_TYPE "") - -if(WITH_BZIP2) - set(BZIP2_PACKAGE_TYPE "REQUIRED") -else() - set(BZIP2_PACKAGE_TYPE "RECOMMENDED") +if (QTC_USE_SYSTEM_BZIP2) + find_package(BZip2) + if (NOT TARGET BZip2::BZip2) + set(BZIP2_FALLBACK " (No system bzip2 found)") + endif() endif() -if(WITH_LIBLZMA) - set(LIBLZMA_PACKAGE_TYPE "REQUIRED") -else() - set(LIBLZMA_PACKAGE_TYPE "RECOMMENDED") +if (QTC_USE_SYSTEM_ZLIB) + find_package(ZLIB) + if (NOT TARGET ZLIB::ZLIB) + set(ZLIB_FALLBACK " (No system zlib found)") + endif() endif() -if(WITH_LIBZSTD) - set(PKGCONFIG_REQUIRED_TYPE "REQUIRED") - set(LIBZSTD_REQUIRED_TYPE "REQUIRED") -else() - set(LIBZSTD_REQUIRED_TYPE "") +if (QTC_USE_SYSTEM_LZMA) + find_package(LibLZMA) + if (NOT TARGET LibLZMA::LibLZMA) + set(LZMA_FALLBACK " (No system liblzma found)") + endif() endif() -set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH}) - -include(KDEInstallDirs) -include(KDEFrameworkCompilerSettings NO_POLICY_SCOPE) -include(KDECMakeSettings) -include(KDEGitCommitHooks) - -include(ECMGenerateExportHeader) - -set(REQUIRED_QT_VERSION 6.6.0) -find_package(Qt6Core ${REQUIRED_QT_VERSION} REQUIRED NO_MODULE) - -find_package(ZLIB) -set_package_properties(ZLIB PROPERTIES - URL "https://www.zlib.net" - DESCRIPTION "Support for gzip compressed files and data streams" - TYPE REQUIRED - PURPOSE "Support for gzip compressed files and data streams" +add_qtc_library( + karchive + DEPENDS Qt::Core + PUBLIC_INCLUDES src + SOURCES + src/kar.cpp + src/kar.h + src/karchive_export.h + src/karchive_p.h + src/karchive.cpp + src/karchive.h + src/karchivedirectory.h + src/karchiveentry.h + src/karchivefile.h + src/kcompressiondevice_p.h + src/kcompressiondevice.cpp + src/kcompressiondevice.h + src/kfilterbase.cpp + src/kfilterbase.h + src/klimitediodevice_p.h + src/klimitediodevice.cpp + src/knonefilter.cpp + src/knonefilter.h + src/krcc.cpp + src/krcc.h + src/ktar.cpp + src/ktar.h + src/kzipfileentry.h + src/loggingcategory.cpp + src/loggingcategory.h ) -find_package(BZip2) -set_package_properties(BZip2 PROPERTIES - URL "https://sourceware.org/bzip2/" - DESCRIPTION "Support for BZip2 compressed files and data streams" - TYPE ${BZIP2_PACKAGE_TYPE} - PURPOSE "Support for BZip2 compressed files and data streams" +# ZIP support +extend_qtc_library( + karchive + CONDITION QTC_USE_SYSTEM_ZLIB AND TARGET ZLIB::ZLIB + FEATURE_INFO "KArchive (System) zlib support" + DEPENDS ZLIB::ZLIB + DEFINES + HAVE_ZLIB_SUPPORT=1 + SOURCES + src/kgzipfilter.cpp + src/kgzipfilter.h + src/kzip.cpp + src/kzip.h ) -find_package(LibLZMA) -set_package_properties(LibLZMA PROPERTIES - URL "https://tukaani.org/xz/" - DESCRIPTION "Support for xz compressed files and data streams" - TYPE ${LIBLZMA_PACKAGE_TYPE} - PURPOSE "Support for xz compressed files and data streams" +extend_qtc_library( + karchive + CONDITION NOT QTC_USE_SYSTEM_ZLIB OR NOT TARGET ZLIB::ZLIB + SKIP_AUTOMOC + DEFINES + HAVE_ZLIB_SUPPORT=1 + PUBLIC_DEFINES + KARCHIVE_HAS_ZLIB + FEATURE_INFO "KArchive zlib support${ZLIB_FALLBACK}" + INCLUDES + ${CMAKE_CURRENT_LIST_DIR}/../zlib/src/ + SOURCES + src/kgzipfilter.cpp + src/kgzipfilter.h + src/kzip.cpp + src/kzip.h + + # Embed zlib sources + ${CMAKE_CURRENT_LIST_DIR}/../zlib/src/adler32.c + ${CMAKE_CURRENT_LIST_DIR}/../zlib/src/compress.c + ${CMAKE_CURRENT_LIST_DIR}/../zlib/src/crc32.c + ${CMAKE_CURRENT_LIST_DIR}/../zlib/src/crc32.h + ${CMAKE_CURRENT_LIST_DIR}/../zlib/src/deflate.c + ${CMAKE_CURRENT_LIST_DIR}/../zlib/src/deflate.h + ${CMAKE_CURRENT_LIST_DIR}/../zlib/src/gzclose.c + ${CMAKE_CURRENT_LIST_DIR}/../zlib/src/gzguts.h + ${CMAKE_CURRENT_LIST_DIR}/../zlib/src/gzlib.c + ${CMAKE_CURRENT_LIST_DIR}/../zlib/src/gzread.c + ${CMAKE_CURRENT_LIST_DIR}/../zlib/src/gzwrite.c + ${CMAKE_CURRENT_LIST_DIR}/../zlib/src/infback.c + ${CMAKE_CURRENT_LIST_DIR}/../zlib/src/inffast.c + ${CMAKE_CURRENT_LIST_DIR}/../zlib/src/inffast.h + ${CMAKE_CURRENT_LIST_DIR}/../zlib/src/inffixed.h + ${CMAKE_CURRENT_LIST_DIR}/../zlib/src/inflate.c + ${CMAKE_CURRENT_LIST_DIR}/../zlib/src/inflate.h + ${CMAKE_CURRENT_LIST_DIR}/../zlib/src/inftrees.c + ${CMAKE_CURRENT_LIST_DIR}/../zlib/src/inftrees.h + ${CMAKE_CURRENT_LIST_DIR}/../zlib/src/trees.c + ${CMAKE_CURRENT_LIST_DIR}/../zlib/src/trees.h + ${CMAKE_CURRENT_LIST_DIR}/../zlib/src/uncompr.c + ${CMAKE_CURRENT_LIST_DIR}/../zlib/src/zconf.h + ${CMAKE_CURRENT_LIST_DIR}/../zlib/src/zlib.h + ${CMAKE_CURRENT_LIST_DIR}/../zlib/src/zutil.c + ${CMAKE_CURRENT_LIST_DIR}/../zlib/src/zutil.h ) +# BZip2 support +extend_qtc_library(karchive + CONDITION QTC_USE_SYSTEM_BZIP2 AND TARGET BZip2::BZip2 + FEATURE_INFO "KArchive (System) BZip2 support" + DEPENDS BZip2::BZip2 + DEFINES + HAVE_BZIP2_SUPPORT=1 + NEED_BZ2_PREFIX=1 + PUBLIC_DEFINES + KARCHIVE_HAS_BZIP2 -find_package(PkgConfig ${PKGCONFIG_REQUIRED_TYPE}) -if (PkgConfig_FOUND) - pkg_check_modules(LibZstd ${LIBZSTD_REQUIRED_TYPE} IMPORTED_TARGET "libzstd") -endif() -add_feature_info(LibZstd LibZstd_FOUND - "Support for zstd compressed files and data streams" + SOURCES + src/kbzip2filter.cpp ) -include(ECMSetupVersion) -include(ECMGenerateHeaders) -include(ECMQtDeclareLoggingCategory) -include(ECMAddQch) -include(ECMDeprecationSettings) -include(ECMPoQmTools) +extend_qtc_library( + karchive + CONDITION NOT QTC_USE_SYSTEM_BZIP2 OR NOT TARGET BZip2::BZip2 + INCLUDES ./3rdparty/bzip2 + FEATURE_INFO "KArchive BZip2 support${BZIP2_FALLBACK}" + DEFINES + HAVE_BZIP2_SUPPORT=1 + NEED_BZ2_PREFIX=1 + PUBLIC_DEFINES + KARCHIVE_HAS_BZIP2 -set(EXCLUDE_DEPRECATED_BEFORE_AND_AT 0 CACHE STRING "Control the range of deprecated API excluded from the build [default=0].") + SOURCES + src/kbzip2filter.cpp -option(BUILD_QCH "Build API documentation in QCH format (for e.g. Qt Assistant, Qt Creator & KDevelop)" OFF) -add_feature_info(QCH ${BUILD_QCH} "API documentation in QCH format (for e.g. Qt Assistant, Qt Creator & KDevelop)") - -set(karchive_version_header "${CMAKE_CURRENT_BINARY_DIR}/src/karchive_version.h") -ecm_setup_version(PROJECT - VARIABLE_PREFIX KARCHIVE - VERSION_HEADER "${karchive_version_header}" - PACKAGE_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/KF6ArchiveConfigVersion.cmake" - SOVERSION 6) - -ecm_set_disabled_deprecation_versions( - QT 6.8 + # Embed bzip2 sources + ./3rdparty/bzip2/blocksort.c + ./3rdparty/bzip2/bzlib.c + ./3rdparty/bzip2/bzlib.h + ./3rdparty/bzip2/compress.c + ./3rdparty/bzip2/crctable.c + ./3rdparty/bzip2/decompress.c + ./3rdparty/bzip2/huffman.c + ./3rdparty/bzip2/randtable.c ) - -add_subdirectory(src) -if (BUILD_TESTING) - add_subdirectory(autotests) - add_subdirectory(tests) +# libLZMA support +if (NOT QTC_USE_SYSTEM_LZMA) + include (CheckTypeSize) + include (CheckIncludeFile) + CHECK_TYPE_SIZE("size_t" SIZEOF_SIZE_T) + CHECK_INCLUDE_FILE("stdbool.h" HAVE_STDBOOL_H) endif() -ecm_install_po_files_as_qm(poqm) - -# create a Config.cmake and a ConfigVersion.cmake file and install them -set(CMAKECONFIG_INSTALL_DIR "${KDE_INSTALL_CMAKEPACKAGEDIR}/KF6Archive") - -if (BUILD_QCH) - ecm_install_qch_export( - TARGETS KF6Archive_QCH - FILE KF6ArchiveQchTargets.cmake - DESTINATION "${CMAKECONFIG_INSTALL_DIR}" - COMPONENT Devel - ) - set(PACKAGE_INCLUDE_QCHTARGETS "include(\"\${CMAKE_CURRENT_LIST_DIR}/KF6ArchiveQchTargets.cmake\")") -endif() - -include(CMakePackageConfigHelpers) - -configure_package_config_file( - "${CMAKE_CURRENT_SOURCE_DIR}/KF6ArchiveConfig.cmake.in" - "${CMAKE_CURRENT_BINARY_DIR}/KF6ArchiveConfig.cmake" - INSTALL_DESTINATION ${CMAKECONFIG_INSTALL_DIR} +extend_qtc_library( + karchive + CONDITION QTC_USE_SYSTEM_LZMA AND TARGET LibLZMA::LibLZMA + FEATURE_INFO "KArchive (System) libLZMA support" + DEPENDS LibLZMA::LibLZMA + DEFINES + HAVE_XZ_SUPPORT=1 + SOURCES + src/kxzfilter.cpp + src/kxzfilter.h + src/k7zip.cpp + src/k7zip.h ) -install(FILES ${karchive_version_header} - DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF}/KArchive - COMPONENT Devel) +extend_qtc_library( + karchive + CONDITION NOT QTC_USE_SYSTEM_LZMA OR NOT TARGET LibLZMA::LibLZMA + FEATURE_INFO "KArchive 7zip & xz support${LZMA_FALLBACK}" + DEFINES + HAVE_XZ_SUPPORT=1 + SIZEOF_SIZE_T=${SIZEOF_SIZE_T} + HAVE_STDBOOL_H=${HAVE_STDBOOL_H} + HAVE_CHECK_CRC32 + HAVE_CHECK_CRC64 + HAVE_CHECK_SHA256 -install(FILES - "${CMAKE_CURRENT_BINARY_DIR}/KF6ArchiveConfig.cmake" - "${CMAKE_CURRENT_BINARY_DIR}/KF6ArchiveConfigVersion.cmake" - DESTINATION "${CMAKECONFIG_INSTALL_DIR}" - COMPONENT Devel) + HAVE_ENCODER_LZMA1 HAVE_DECODER_LZMA1 + HAVE_ENCODER_LZMA2 HAVE_DECODER_LZMA2 + HAVE_ENCODER_X86 HAVE_DECODER_X86 + HAVE_ENCODER_POWERPC HAVE_DECODER_POWERPC + HAVE_ENCODER_IA64 HAVE_DECODER_IA64 + HAVE_ENCODER_ARM HAVE_DECODER_ARM + HAVE_ENCODER_ARMTHUMB HAVE_DECODER_ARMTHUMB + HAVE_ENCODER_ARM64 HAVE_DECODER_ARM64 + HAVE_ENCODER_SPARC HAVE_DECODER_SPARC + HAVE_ENCODER_RISCV HAVE_DECODER_RISCV + HAVE_ENCODER_DELTA HAVE_DECODER_DELTA -install(EXPORT KF6ArchiveTargets - DESTINATION "${CMAKECONFIG_INSTALL_DIR}" - FILE KF6ArchiveTargets.cmake - NAMESPACE KF6::) + HAVE_MF_HC3 HAVE_MF_HC4 HAVE_MF_BT2 HAVE_MF_BT3 HAVE_MF_BT4 + PUBLIC_DEFINES + KARCHIVE_HAS_XZ + INCLUDES + ./3rdparty/xz/src/common + ./3rdparty/xz/src/liblzma/api + ./3rdparty/xz/src/liblzma/check + ./3rdparty/xz/src/liblzma/common + ./3rdparty/xz/src/liblzma/delta + ./3rdparty/xz/src/liblzma/lz + ./3rdparty/xz/src/liblzma/lzma + ./3rdparty/xz/src/liblzma/range_decoder + ./3rdparty/xz/src/liblzma/rangecoder + ./3rdparty/xz/src/liblzma/simple + SOURCES + src/kxzfilter.cpp + src/kxzfilter.h + src/k7zip.cpp + src/k7zip.h -include(ECMFeatureSummary) -ecm_feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES) + # Embed liblzma sources + ./3rdparty/xz/src/liblzma/check/check.c + ./3rdparty/xz/src/liblzma/check/crc32_fast.c + ./3rdparty/xz/src/liblzma/check/crc32_table.c + ./3rdparty/xz/src/liblzma/check/crc64_fast.c + ./3rdparty/xz/src/liblzma/check/crc64_table.c + ./3rdparty/xz/src/liblzma/check/sha256.c + ./3rdparty/xz/src/liblzma/common/alone_decoder.c + ./3rdparty/xz/src/liblzma/common/auto_decoder.c + ./3rdparty/xz/src/liblzma/common/block_decoder.c + ./3rdparty/xz/src/liblzma/common/block_encoder.c + ./3rdparty/xz/src/liblzma/common/block_header_decoder.c + ./3rdparty/xz/src/liblzma/common/block_header_encoder.c + ./3rdparty/xz/src/liblzma/common/block_util.c + ./3rdparty/xz/src/liblzma/common/common.c + ./3rdparty/xz/src/liblzma/common/easy_encoder.c + ./3rdparty/xz/src/liblzma/common/easy_preset.c + ./3rdparty/xz/src/liblzma/common/filter_common.c + ./3rdparty/xz/src/liblzma/common/filter_decoder.c + ./3rdparty/xz/src/liblzma/common/filter_encoder.c + ./3rdparty/xz/src/liblzma/common/filter_flags_decoder.c + ./3rdparty/xz/src/liblzma/common/filter_flags_encoder.c + ./3rdparty/xz/src/liblzma/common/index_decoder.c + ./3rdparty/xz/src/liblzma/common/index_encoder.c + ./3rdparty/xz/src/liblzma/common/index_hash.c + ./3rdparty/xz/src/liblzma/common/index.c + ./3rdparty/xz/src/liblzma/common/stream_decoder.c + ./3rdparty/xz/src/liblzma/common/stream_encoder.c + ./3rdparty/xz/src/liblzma/common/stream_flags_common.c + ./3rdparty/xz/src/liblzma/common/stream_flags_decoder.c + ./3rdparty/xz/src/liblzma/common/stream_flags_encoder.c + ./3rdparty/xz/src/liblzma/common/vli_decoder.c + ./3rdparty/xz/src/liblzma/common/vli_encoder.c + ./3rdparty/xz/src/liblzma/common/vli_size.c + ./3rdparty/xz/src/liblzma/delta/delta_common.c + ./3rdparty/xz/src/liblzma/delta/delta_decoder.c + ./3rdparty/xz/src/liblzma/delta/delta_encoder.c + ./3rdparty/xz/src/liblzma/lz/lz_decoder.c + ./3rdparty/xz/src/liblzma/lz/lz_encoder_mf.c + ./3rdparty/xz/src/liblzma/lz/lz_encoder.c + ./3rdparty/xz/src/liblzma/lzma/fastpos_table.c + ./3rdparty/xz/src/liblzma/lzma/lzma_decoder.c + ./3rdparty/xz/src/liblzma/lzma/lzma_encoder_optimum_fast.c + ./3rdparty/xz/src/liblzma/lzma/lzma_encoder_optimum_normal.c + ./3rdparty/xz/src/liblzma/lzma/lzma_encoder_presets.c + ./3rdparty/xz/src/liblzma/lzma/lzma_encoder.c + ./3rdparty/xz/src/liblzma/lzma/lzma2_decoder.c + ./3rdparty/xz/src/liblzma/lzma/lzma2_encoder.c + ./3rdparty/xz/src/liblzma/rangecoder/price_table.c + ./3rdparty/xz/src/liblzma/simple/arm.c + ./3rdparty/xz/src/liblzma/simple/arm64.c + ./3rdparty/xz/src/liblzma/simple/armthumb.c + ./3rdparty/xz/src/liblzma/simple/ia64.c + ./3rdparty/xz/src/liblzma/simple/powerpc.c + ./3rdparty/xz/src/liblzma/simple/riscv.c + ./3rdparty/xz/src/liblzma/simple/simple_coder.c + ./3rdparty/xz/src/liblzma/simple/simple_decoder.c + ./3rdparty/xz/src/liblzma/simple/simple_encoder.c + ./3rdparty/xz/src/liblzma/simple/sparc.c + ./3rdparty/xz/src/liblzma/simple/x86.c +) -kde_configure_git_pre_commit_hook(CHECKS CLANG_FORMAT) +# Zstd support +# BSD License: https://github.com/facebook/zstd/blob/dev/LICENSE +# Disabled for now as we don't need it and the packages are suboptimal +#extend_qtc_library( +# karchive +# CONDITION TARGET PkgConfig::LibZstd +# DEPENDS PkgConfig::LibZstd +# FEATURE_INFO "KArchive Zstd support" +# DEFINES +# HAVE_ZSTD_SUPPORT=1 +# PUBLIC_DEFINES +# KARCHIVE_HAS_ZSTD +# SOURCES +# src/kzstdfilter.cpp +# src/kzstdfilter.h +#) diff --git a/src/libs/3rdparty/karchive/CMakeLists.txt.kde b/src/libs/3rdparty/karchive/CMakeLists.txt.kde new file mode 100644 index 00000000000..43b61a998f1 --- /dev/null +++ b/src/libs/3rdparty/karchive/CMakeLists.txt.kde @@ -0,0 +1,152 @@ +cmake_minimum_required(VERSION 3.16) + +set(KF_VERSION "6.10.0") # handled by release scripts +project(KArchive VERSION ${KF_VERSION}) + +include(FeatureSummary) +find_package(ECM 6.9.0 NO_MODULE) +set_package_properties(ECM PROPERTIES TYPE REQUIRED DESCRIPTION "Extra CMake Modules." URL "https://commits.kde.org/extra-cmake-modules") +feature_summary(WHAT REQUIRED_PACKAGES_NOT_FOUND FATAL_ON_MISSING_REQUIRED_PACKAGES) + +option(WITH_BZIP2 "Make bzip2 required" ON) +option(WITH_LIBLZMA "Make liblzma required" ON) +option(WITH_LIBZSTD "Make libzstd required" ON) + +set(PKGCONFIG_REQUIRED_TYPE "") + +if(WITH_BZIP2) + set(BZIP2_PACKAGE_TYPE "REQUIRED") +else() + set(BZIP2_PACKAGE_TYPE "RECOMMENDED") +endif() + +if(WITH_LIBLZMA) + set(LIBLZMA_PACKAGE_TYPE "REQUIRED") +else() + set(LIBLZMA_PACKAGE_TYPE "RECOMMENDED") +endif() + +if(WITH_LIBZSTD) + set(PKGCONFIG_REQUIRED_TYPE "REQUIRED") + set(LIBZSTD_REQUIRED_TYPE "REQUIRED") +else() + set(LIBZSTD_REQUIRED_TYPE "") +endif() + +set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH}) + +include(KDEInstallDirs) +include(KDEFrameworkCompilerSettings NO_POLICY_SCOPE) +include(KDECMakeSettings) +include(KDEGitCommitHooks) + +include(ECMGenerateExportHeader) + +set(REQUIRED_QT_VERSION 6.6.0) +find_package(Qt6Core ${REQUIRED_QT_VERSION} REQUIRED NO_MODULE) + +find_package(ZLIB) +set_package_properties(ZLIB PROPERTIES + URL "https://www.zlib.net" + DESCRIPTION "Support for gzip compressed files and data streams" + TYPE REQUIRED + PURPOSE "Support for gzip compressed files and data streams" +) + +find_package(BZip2) +set_package_properties(BZip2 PROPERTIES + URL "https://sourceware.org/bzip2/" + DESCRIPTION "Support for BZip2 compressed files and data streams" + TYPE ${BZIP2_PACKAGE_TYPE} + PURPOSE "Support for BZip2 compressed files and data streams" +) + +find_package(LibLZMA) +set_package_properties(LibLZMA PROPERTIES + URL "https://tukaani.org/xz/" + DESCRIPTION "Support for xz compressed files and data streams" + TYPE ${LIBLZMA_PACKAGE_TYPE} + PURPOSE "Support for xz compressed files and data streams" +) + + +find_package(PkgConfig ${PKGCONFIG_REQUIRED_TYPE}) +if (PkgConfig_FOUND) + pkg_check_modules(LibZstd ${LIBZSTD_REQUIRED_TYPE} IMPORTED_TARGET "libzstd") +endif() +add_feature_info(LibZstd LibZstd_FOUND + "Support for zstd compressed files and data streams" +) + +include(ECMSetupVersion) +include(ECMGenerateHeaders) +include(ECMQtDeclareLoggingCategory) +include(ECMAddQch) +include(ECMDeprecationSettings) +include(ECMPoQmTools) + +set(EXCLUDE_DEPRECATED_BEFORE_AND_AT 0 CACHE STRING "Control the range of deprecated API excluded from the build [default=0].") + +option(BUILD_QCH "Build API documentation in QCH format (for e.g. Qt Assistant, Qt Creator & KDevelop)" OFF) +add_feature_info(QCH ${BUILD_QCH} "API documentation in QCH format (for e.g. Qt Assistant, Qt Creator & KDevelop)") + +set(karchive_version_header "${CMAKE_CURRENT_BINARY_DIR}/src/karchive_version.h") +ecm_setup_version(PROJECT + VARIABLE_PREFIX KARCHIVE + VERSION_HEADER "${karchive_version_header}" + PACKAGE_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/KF6ArchiveConfigVersion.cmake" + SOVERSION 6) + +ecm_set_disabled_deprecation_versions( + QT 6.8 +) + + +add_subdirectory(src) +if (BUILD_TESTING) + add_subdirectory(autotests) + add_subdirectory(tests) +endif() + +ecm_install_po_files_as_qm(poqm) + +# create a Config.cmake and a ConfigVersion.cmake file and install them +set(CMAKECONFIG_INSTALL_DIR "${KDE_INSTALL_CMAKEPACKAGEDIR}/KF6Archive") + +if (BUILD_QCH) + ecm_install_qch_export( + TARGETS KF6Archive_QCH + FILE KF6ArchiveQchTargets.cmake + DESTINATION "${CMAKECONFIG_INSTALL_DIR}" + COMPONENT Devel + ) + set(PACKAGE_INCLUDE_QCHTARGETS "include(\"\${CMAKE_CURRENT_LIST_DIR}/KF6ArchiveQchTargets.cmake\")") +endif() + +include(CMakePackageConfigHelpers) + +configure_package_config_file( + "${CMAKE_CURRENT_SOURCE_DIR}/KF6ArchiveConfig.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/KF6ArchiveConfig.cmake" + INSTALL_DESTINATION ${CMAKECONFIG_INSTALL_DIR} +) + +install(FILES ${karchive_version_header} + DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF}/KArchive + COMPONENT Devel) + +install(FILES + "${CMAKE_CURRENT_BINARY_DIR}/KF6ArchiveConfig.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/KF6ArchiveConfigVersion.cmake" + DESTINATION "${CMAKECONFIG_INSTALL_DIR}" + COMPONENT Devel) + +install(EXPORT KF6ArchiveTargets + DESTINATION "${CMAKECONFIG_INSTALL_DIR}" + FILE KF6ArchiveTargets.cmake + NAMESPACE KF6::) + +include(ECMFeatureSummary) +ecm_feature_summary(WHAT ALL FATAL_ON_MISSING_REQUIRED_PACKAGES) + +kde_configure_git_pre_commit_hook(CHECKS CLANG_FORMAT) diff --git a/src/libs/3rdparty/karchive/src/k7zip.cpp b/src/libs/3rdparty/karchive/src/k7zip.cpp index 03ee383aa11..5d029ee53a0 100644 --- a/src/libs/3rdparty/karchive/src/k7zip.cpp +++ b/src/libs/3rdparty/karchive/src/k7zip.cpp @@ -16,13 +16,15 @@ #include #include "kcompressiondevice.h" +#include "kfilterbase.h" #include "klimitediodevice_p.h" -#include -#include +#include "kxzfilter.h" -#include "zlib.h" #include #include // time() +#include + +#undef uncompress #ifndef QT_STAT_LNK #define QT_STAT_LNK 0120000 @@ -2789,7 +2791,8 @@ bool K7Zip::closeArchive() QBuffer inBuffer(&enc); KCompressionDevice flt(&inBuffer, false, KCompressionDevice::Xz); - flt.open(QIODevice::WriteOnly); + if(!flt.open(QIODevice::WriteOnly)) + return false; KFilterBase *filter = flt.filterBase(); diff --git a/src/libs/3rdparty/karchive/src/karchive.cpp b/src/libs/3rdparty/karchive/src/karchive.cpp index 2a3e7b38348..5431dbcfcd2 100644 --- a/src/libs/3rdparty/karchive/src/karchive.cpp +++ b/src/libs/3rdparty/karchive/src/karchive.cpp @@ -964,7 +964,10 @@ static bool sortByPosition(const KArchiveFile *file1, const KArchiveFile *file2) return file1->position() < file2->position(); } -bool KArchiveDirectory::copyTo(const QString &dest, bool recursiveCopy) const +bool KArchiveDirectory::copyTo( + const QString &dest, + bool recursiveCopy, + std::function progress) const { QDir root; const QString destDir(QDir(dest).absolutePath()); // get directory path without any "." or ".." @@ -1029,11 +1032,16 @@ bool KArchiveDirectory::copyTo(const QString &dest, bool recursiveCopy) const } } while (!dirStack.isEmpty()); - std::sort(fileList.begin(), fileList.end(), sortByPosition); // sort on d->pos, so we have a linear access + std::sort( + fileList.begin(), + fileList.end(), + sortByPosition); // sort on d->pos, so we have a linear access - for (QList::const_iterator it = fileList.constBegin(), end = fileList.constEnd(); it != end; ++it) { - const KArchiveFile *f = *it; + for (const KArchiveFile *f : fileList) { qint64 pos = f->position(); + if (progress) + if (!progress(f, fileToDir[pos])) + return false; if (!f->copyTo(fileToDir[pos])) { return false; } diff --git a/src/libs/3rdparty/karchive/src/kcompressiondevice.cpp b/src/libs/3rdparty/karchive/src/kcompressiondevice.cpp index 56f2f47bef3..8094813d1aa 100644 --- a/src/libs/3rdparty/karchive/src/kcompressiondevice.cpp +++ b/src/libs/3rdparty/karchive/src/kcompressiondevice.cpp @@ -12,8 +12,6 @@ #include "kgzipfilter.h" #include "knonefilter.h" -#include "config-compression.h" - #if HAVE_BZIP2_SUPPORT #include "kbzip2filter.h" #endif diff --git a/src/libs/3rdparty/karchive/src/kgzipfilter.cpp b/src/libs/3rdparty/karchive/src/kgzipfilter.cpp index c7623f7ba57..1d69497df3d 100644 --- a/src/libs/3rdparty/karchive/src/kgzipfilter.cpp +++ b/src/libs/3rdparty/karchive/src/kgzipfilter.cpp @@ -13,6 +13,9 @@ #include #include +#undef uncompress +#undef compress + /* gzip flag byte */ #define ORIG_NAME 0x08 /* bit 3 set: original file name present */ diff --git a/src/libs/3rdparty/karchive/src/ktar.cpp b/src/libs/3rdparty/karchive/src/ktar.cpp index 0ea6313b931..c8535f0fddc 100644 --- a/src/libs/3rdparty/karchive/src/ktar.cpp +++ b/src/libs/3rdparty/karchive/src/ktar.cpp @@ -102,7 +102,7 @@ bool KTar::createDevice(QIODevice::OpenMode mode) if (f.open(QIODevice::ReadOnly)) { mime = db.mimeTypeForData(&f); } - if (!mime.isValid()) { + if (!mime.isValid() || mime.name() == QStringLiteral("application/octet-stream")) { // Unable to determine mimetype from contents, get it from file name mime = db.mimeTypeForFile(fileName(), QMimeDatabase::MatchExtension); } diff --git a/src/libs/3rdparty/karchive/src/kzip.cpp b/src/libs/3rdparty/karchive/src/kzip.cpp index 23bf9aa4a3b..c583990351f 100644 --- a/src/libs/3rdparty/karchive/src/kzip.cpp +++ b/src/libs/3rdparty/karchive/src/kzip.cpp @@ -25,6 +25,16 @@ #include #include +// "Our" zip zconf.h defines "Z_PREFIX", so we need to undef it here, as this class has another +// function called crc32. Instead of a define, we create a forwarder function. +#ifdef Z_PREFIX +#undef crc32 +uLong crc32(uLong crc, const Bytef *buf, uInt len) +{ + return z_crc32(crc, buf, len); +} +#endif + #ifndef QT_STAT_LNK #define QT_STAT_LNK 0120000 #endif // QT_STAT_LNK @@ -835,32 +845,31 @@ bool KZip::closeArchive() qint64 centraldiroffset = device()->pos(); // qCDebug(KArchiveLog) << "closearchive: centraldiroffset: " << centraldiroffset; qint64 atbackup = centraldiroffset; - QMutableListIterator it(d->m_fileList); - while (it.hasNext()) { + for (KZipFileEntry *entry : d->m_fileList) { // set crc and compressed size in each local file header - it.next(); - if (!device()->seek(it.value()->headerStart() + 14)) { - setErrorString(tr("Could not seek to next file header: %1").arg(device()->errorString())); + if (!device()->seek(entry->headerStart() + 14)) { + setErrorString( + tr("Could not seek to next file header: %1").arg(device()->errorString())); return false; } // qCDebug(KArchiveLog) << "closearchive setcrcandcsize: fileName:" - // << it.value()->path() - // << "encoding:" << it.value()->encoding(); + // << entry->path() + // << "encoding:" << entry->encoding(); - uLong mycrc = it.value()->crc32(); + uLong mycrc = entry->crc32(); buffer[0] = char(mycrc); // crc checksum, at headerStart+14 buffer[1] = char(mycrc >> 8); buffer[2] = char(mycrc >> 16); buffer[3] = char(mycrc >> 24); - int mysize1 = it.value()->compressedSize(); + int mysize1 = entry->compressedSize(); buffer[4] = char(mysize1); // compressed file size, at headerStart+18 buffer[5] = char(mysize1 >> 8); buffer[6] = char(mysize1 >> 16); buffer[7] = char(mysize1 >> 24); - int myusize = it.value()->size(); + int myusize = entry->size(); buffer[8] = char(myusize); // uncompressed file size, at headerStart+22 buffer[9] = char(myusize >> 8); buffer[10] = char(myusize >> 16); @@ -873,13 +882,11 @@ bool KZip::closeArchive() } device()->seek(atbackup); - it.toFront(); - while (it.hasNext()) { - it.next(); - // qCDebug(KArchiveLog) << "fileName:" << it.value()->path() - // << "encoding:" << it.value()->encoding(); + for (KZipFileEntry *entry : d->m_fileList) { + // qCDebug(KArchiveLog) << "fileName:" << entry->path() + // << "encoding:" << entry->encoding(); - QByteArray path = QFile::encodeName(it.value()->path()); + QByteArray path = QFile::encodeName(entry->path()); const int extra_field_len = (d->m_extraField == ModificationTime) ? 9 : 0; const int bufferSize = extra_field_len + path.length() + 46; @@ -899,24 +906,24 @@ bool KZip::closeArchive() // memcpy(buffer, head, sizeof(head)); memmove(buffer, head, sizeof(head)); - buffer[10] = char(it.value()->encoding()); // compression method - buffer[11] = char(it.value()->encoding() >> 8); + buffer[10] = char(entry->encoding()); // compression method + buffer[11] = char(entry->encoding() >> 8); - transformToMsDos(it.value()->date(), &buffer[12]); + transformToMsDos(entry->date(), &buffer[12]); - uLong mycrc = it.value()->crc32(); + uLong mycrc = entry->crc32(); buffer[16] = char(mycrc); // crc checksum buffer[17] = char(mycrc >> 8); buffer[18] = char(mycrc >> 16); buffer[19] = char(mycrc >> 24); - int mysize1 = it.value()->compressedSize(); + int mysize1 = entry->compressedSize(); buffer[20] = char(mysize1); // compressed file size buffer[21] = char(mysize1 >> 8); buffer[22] = char(mysize1 >> 16); buffer[23] = char(mysize1 >> 24); - int mysize = it.value()->size(); + int mysize = entry->size(); buffer[24] = char(mysize); // uncompressed file size buffer[25] = char(mysize >> 8); buffer[26] = char(mysize >> 16); @@ -928,10 +935,10 @@ bool KZip::closeArchive() buffer[30] = char(extra_field_len); buffer[31] = char(extra_field_len >> 8); - buffer[40] = char(it.value()->permissions()); - buffer[41] = char(it.value()->permissions() >> 8); + buffer[40] = char(entry->permissions()); + buffer[41] = char(entry->permissions() >> 8); - int myhst = it.value()->headerStart(); + int myhst = entry->headerStart(); buffer[42] = char(myhst); // relative offset of local header buffer[43] = char(myhst >> 8); buffer[44] = char(myhst >> 16); @@ -952,14 +959,14 @@ bool KZip::closeArchive() extfield[4] = 1 | 2 | 4; // specify flags from local field // (unless I misread the spec) // provide only modification time - unsigned long time = (unsigned long)it.value()->date().toSecsSinceEpoch(); + unsigned long time = (unsigned long) entry->date().toSecsSinceEpoch(); extfield[5] = char(time); extfield[6] = char(time >> 8); extfield[7] = char(time >> 16); extfield[8] = char(time >> 24); } - crc = crc32(crc, (Bytef *)buffer, bufferSize); + crc = crc32(crc, (Bytef *) buffer, bufferSize); bool ok = (device()->write(buffer, bufferSize) == bufferSize); delete[] buffer; if (!ok) { @@ -1087,18 +1094,17 @@ bool KZip::doPrepareWriting(const QString &name, // to save, so that we don't have duplicate file entries when viewing the zip // with konqi... // CAUTION: the old file itself is still in the zip and won't be removed !!! - QMutableListIterator it(d->m_fileList); // qCDebug(KArchiveLog) << "fileName to write: " << name; - while (it.hasNext()) { - it.next(); - // qCDebug(KArchiveLog) << "prepfileName: " << it.value()->path(); - if (name == it.value()->path()) { + for (auto it = d->m_fileList.begin(); it != d->m_fileList.end();) { + // qCDebug(KArchiveLog) << "prepfileName: " << entry->path(); + if (name == (*it)->path()) { // also remove from the parentDir - parentDir->removeEntry(it.value()); - // qCDebug(KArchiveLog) << "removing following entry: " << it.value()->path(); - delete it.value(); - it.remove(); - } + parentDir->removeEntry(*it); + // qCDebug(KArchiveLog) << "removing following entry: " << entry->path(); + delete *it; + it = d->m_fileList.erase(it); + } else + it++; } // construct a KZipFileEntry and add it to list