#
# Copyright (c) Marcus Holland-Moritz
#
# This file is part of dwarfs.
#
# dwarfs is free software: you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software
# Foundation, either version 3 of the License, or (at your option) any later
# version.
#
# dwarfs is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with
# dwarfs. If not, see .
#
cmake_minimum_required(VERSION 3.28.0)
add_library(
dwarfs_common
src/block_compressor.cpp
src/block_compressor_parser.cpp
src/checksum.cpp
src/conv.cpp
src/error.cpp
src/file_access_generic.cpp
src/file_stat.cpp
src/file_util.cpp
src/fstypes.cpp
src/history.cpp
src/library_dependencies.cpp
src/logger.cpp
src/mmap.cpp
src/option_map.cpp
src/os_access_generic.cpp
src/pcm_sample_transformer.cpp
src/performance_monitor.cpp
src/terminal_ansi.cpp
src/thread_pool.cpp
src/util.cpp
src/xattr.cpp
src/internal/features.cpp
src/internal/file_status_conv.cpp
src/internal/fs_section.cpp
src/internal/string_table.cpp
src/internal/wcwidth.c
src/internal/worker_group.cpp
src/xattr_$,win,posix>.cpp
$/src/version.cpp
src/compression/null.cpp
src/compression/zstd.cpp
$<$:src/compression/lzma.cpp>
$<$:src/compression/lz4.cpp>
$<$,$>:src/compression/brotli.cpp>
$<$:src/compression/flac.cpp>
$<$:src/compression/ricepp.cpp>
)
add_library(
dwarfs_reader
src/reader/block_cache_options.cpp
src/reader/block_range.cpp
src/reader/filesystem_options.cpp
src/reader/filesystem_v2.cpp
src/reader/fsinfo_features.cpp
src/reader/metadata_types.cpp
src/reader/mlock_mode.cpp
src/reader/internal/block_cache.cpp
src/reader/internal/cached_block.cpp
src/reader/internal/filesystem_parser.cpp
src/reader/internal/inode_reader_v2.cpp
src/reader/internal/metadata_types.cpp
src/reader/internal/metadata_v2.cpp
)
add_library(
dwarfs_writer
src/writer/categorizer.cpp
src/writer/category_parser.cpp
src/writer/chmod_entry_transformer.cpp
src/writer/compression_metadata_requirements.cpp
src/writer/console_writer.cpp
src/writer/entry_factory.cpp
src/writer/fragment_order_options.cpp
src/writer/filesystem_block_category_resolver.cpp
src/writer/filesystem_writer.cpp
src/writer/filter_debug.cpp
src/writer/fragment_category.cpp
src/writer/fragment_order_parser.cpp
src/writer/inode_fragments.cpp
src/writer/rule_based_entry_filter.cpp
src/writer/scanner.cpp
src/writer/segmenter.cpp
src/writer/segmenter_factory.cpp
src/writer/writer_progress.cpp
src/writer/internal/block_manager.cpp
src/writer/internal/chmod_transformer.cpp
src/writer/internal/entry.cpp
src/writer/internal/file_scanner.cpp
src/writer/internal/fragment_chunkable.cpp
src/writer/internal/global_entry_data.cpp
src/writer/internal/inode_element_view.cpp
src/writer/internal/inode_manager.cpp
src/writer/internal/inode_ordering.cpp
src/writer/internal/metadata_freezer.cpp
src/writer/internal/nilsimsa.cpp
src/writer/internal/progress.cpp
src/writer/internal/scanner_progress.cpp
src/writer/internal/similarity.cpp
src/writer/internal/similarity_ordering.cpp
# src/writer/categorizer/binary_categorizer.cpp
src/writer/categorizer/fits_categorizer.cpp
src/writer/categorizer/incompressible_categorizer.cpp
src/writer/categorizer/pcmaudio_categorizer.cpp
# $<$:src/writer/categorizer/libmagic_categorizer.cpp>
)
add_library(
dwarfs_rewrite
src/utility/rewrite_filesystem.cpp
)
add_library(
dwarfs_extractor
src/utility/filesystem_extractor.cpp
)
add_library(
dwarfs_fsst OBJECT
fsst/libfsst.cpp
fsst/fsst_avx512.cpp
fsst/fsst_avx512_unroll1.inc
fsst/fsst_avx512_unroll2.inc
fsst/fsst_avx512_unroll3.inc
fsst/fsst_avx512_unroll4.inc
)
add_cpp2_thrift_library(thrift/metadata.thrift FROZEN
TARGET dwarfs_metadata_thrift OUTPUT_PATH dwarfs)
add_cpp2_thrift_library(thrift/compression.thrift
TARGET dwarfs_compression_thrift OUTPUT_PATH dwarfs)
add_cpp2_thrift_library(thrift/history.thrift
TARGET dwarfs_history_thrift OUTPUT_PATH dwarfs)
add_cpp2_thrift_library(thrift/features.thrift
TARGET dwarfs_features_thrift OUTPUT_PATH dwarfs)
target_link_libraries(dwarfs_common PRIVATE dwarfs_folly_lite PkgConfig::LIBCRYPTO PkgConfig::XXHASH PkgConfig::ZSTD)
target_link_libraries(dwarfs_reader PUBLIC dwarfs_common)
target_link_libraries(dwarfs_writer PUBLIC dwarfs_common PkgConfig::ZSTD)
target_link_libraries(dwarfs_extractor PUBLIC dwarfs_reader)
target_link_libraries(dwarfs_rewrite PUBLIC dwarfs_reader dwarfs_writer)
target_include_directories(dwarfs_common PUBLIC
$
)
target_compile_definitions(
dwarfs_common PRIVATE
DWARFS_SYSTEM_ID="${CMAKE_SYSTEM} [${CMAKE_SYSTEM_PROCESSOR}]"
DWARFS_COMPILER_ID="${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}"
)
if(ENABLE_RICEPP)
target_link_libraries(dwarfs_common PRIVATE ${RICEPP_OBJECT_TARGETS})
endif()
target_link_libraries(dwarfs_common PRIVATE dwarfs_thrift_lite)
if(WIN32)
target_link_libraries(dwarfs_common PRIVATE bcrypt.lib)
endif()
if(LIBLZ4_FOUND)
target_link_libraries(dwarfs_common PRIVATE PkgConfig::LIBLZ4)
endif()
if(LIBLZMA_FOUND)
target_link_libraries(dwarfs_common PRIVATE PkgConfig::LIBLZMA)
endif()
if(FLAC_FOUND)
target_link_libraries(dwarfs_common PRIVATE PkgConfig::FLAC)
endif()
if(LIBBROTLIDEC_FOUND AND LIBBROTLIENC_FOUND)
target_link_libraries(dwarfs_common PRIVATE PkgConfig::LIBBROTLIDEC PkgConfig::LIBBROTLIENC)
endif()
target_link_libraries(dwarfs_extractor PRIVATE PkgConfig::LIBARCHIVE)
target_include_directories(dwarfs_common SYSTEM PRIVATE $)
set_property(TARGET dwarfs_fsst PROPERTY CXX_STANDARD 20)
set_property(TARGET dwarfs_fsst PROPERTY CXX_STANDARD_REQUIRED ON)
set_property(TARGET dwarfs_fsst PROPERTY CXX_EXTENSIONS OFF)
target_link_libraries(
dwarfs_common
PUBLIC
Boost::boost
Boost::chrono
Boost::iostreams
dwarfs_compression_thrift
dwarfs_metadata_thrift
dwarfs_history_thrift
dwarfs_features_thrift
dwarfs_fsst
)
list(APPEND LIBDWARFS_TARGETS
dwarfs_common
dwarfs_reader
dwarfs_writer
dwarfs_extractor
dwarfs_rewrite
)
list(APPEND LIBDWARFS_OBJECT_TARGETS
dwarfs_folly_lite
dwarfs_thrift_lite
dwarfs_compression_thrift
dwarfs_metadata_thrift
dwarfs_history_thrift
dwarfs_features_thrift
dwarfs_fsst
)
if(NOT STATIC_BUILD_DO_NOT_USE)
foreach(tgt ${LIBDWARFS_TARGETS})
set_target_properties(${tgt} PROPERTIES VERSION ${PRJ_VERSION_MAJOR}.${PRJ_VERSION_MINOR}.${PRJ_VERSION_PATCH})
endforeach()
include(GNUInstallDirs)
include(CMakePackageConfigHelpers)
set(DWARFS_CMAKE_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/dwarfs CACHE STRING
"CMake package config files install location")
configure_package_config_file(
${CMAKE_CURRENT_SOURCE_DIR}/cmake/dwarfs-config.cmake.in
${CMAKE_CURRENT_BINARY_DIR}/dwarfs-config.cmake
INSTALL_DESTINATION ${DWARFS_CMAKE_INSTALL_DIR}
PATH_VARS
CMAKE_INSTALL_INCLUDEDIR
DWARFS_CMAKE_INSTALL_DIR
)
write_basic_package_version_file(
${CMAKE_CURRENT_BINARY_DIR}/dwarfs-config-version.cmake
VERSION ${PRJ_VERSION_MAJOR}.${PRJ_VERSION_MINOR}.${PRJ_VERSION_PATCH}
COMPATIBILITY AnyNewerVersion
)
install(
TARGETS ${LIBDWARFS_TARGETS}
# object libs
${LIBDWARFS_OBJECT_TARGETS}
# other
${RICEPP_OBJECT_TARGETS}
folly_deps
EXPORT dwarfs-targets
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib)
install(
DIRECTORY include/dwarfs
DESTINATION include
PATTERN include/dwarfs/internal EXCLUDE
PATTERN include/dwarfs/tool EXCLUDE
PATTERN include/dwarfs/*/internal EXCLUDE
)
if(DWARFS_GIT_BUILD)
install(
FILES ${CMAKE_CURRENT_BINARY_DIR}/include/dwarfs/version.h
DESTINATION include/dwarfs
)
endif()
install(
FILES ${CMAKE_CURRENT_BINARY_DIR}/include/dwarfs/config.h
DESTINATION include/dwarfs
)
install(
FILES ${CMAKE_CURRENT_BINARY_DIR}/dwarfs-config.cmake
${CMAKE_CURRENT_BINARY_DIR}/dwarfs-config-version.cmake
DESTINATION ${DWARFS_CMAKE_INSTALL_DIR}
)
install(
EXPORT dwarfs-targets
FILE dwarfs-targets.cmake
NAMESPACE dwarfs::
DESTINATION ${DWARFS_CMAKE_INSTALL_DIR}
)
endif()