From e16969f04fce9aad626be3eea1f1f81733c7d42f Mon Sep 17 00:00:00 2001 From: Marcus Holland-Moritz Date: Sat, 18 May 2024 09:50:39 +0200 Subject: [PATCH] build: add dwarfs reader library --- CMakeLists.txt | 167 ++++++++++++++++++++++++++----------------------- 1 file changed, 88 insertions(+), 79 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 935c8c73..71d2ef4b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -529,7 +529,7 @@ target_include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/folly ) apply_folly_compile_options_to_target(dwarfs_folly_lite) -target_link_libraries(dwarfs_folly_lite folly_deps) +target_link_libraries(dwarfs_folly_lite PUBLIC folly_deps) set(ZSTD_LIBRARY_RELEASE "ZSTD_LIBRARY_RELEASE-NOTFOUND" @@ -578,26 +578,19 @@ if(ENABLE_RICEPP) endif() list(APPEND LIBDWARFS_COMMON_SRC - src/dwarfs/block_cache.cpp src/dwarfs/block_compressor.cpp src/dwarfs/block_compressor_parser.cpp - src/dwarfs/block_range.cpp - src/dwarfs/cached_block.cpp src/dwarfs/checksum.cpp src/dwarfs/error.cpp src/dwarfs/features.cpp src/dwarfs/file_access_generic.cpp src/dwarfs/file_stat.cpp src/dwarfs/file_type.cpp - src/dwarfs/filesystem_v2.cpp src/dwarfs/fstypes.cpp - src/dwarfs/fs_section.cpp src/dwarfs/history.cpp - src/dwarfs/inode_reader_v2.cpp src/dwarfs/library_dependencies.cpp src/dwarfs/logger.cpp src/dwarfs/metadata_types.cpp - src/dwarfs/metadata_v2.cpp src/dwarfs/mmap.cpp src/dwarfs/option_map.cpp src/dwarfs/options.cpp @@ -613,6 +606,16 @@ list(APPEND LIBDWARFS_COMMON_SRC src/dwarfs/xattr.cpp ) +list(APPEND LIBDWARFS_READER_SRC + src/dwarfs/block_cache.cpp + src/dwarfs/block_range.cpp + src/dwarfs/cached_block.cpp + src/dwarfs/filesystem_v2.cpp + src/dwarfs/fs_section.cpp + src/dwarfs/inode_reader_v2.cpp + src/dwarfs/metadata_v2.cpp +) + list(APPEND LIBDWARFS_WRITER_SRC src/dwarfs/block_manager.cpp src/dwarfs/builtin_script.cpp @@ -726,6 +729,7 @@ endif() # endif() add_library(dwarfs_common ${LIBDWARFS_COMMON_SRC}) +add_library(dwarfs_reader ${LIBDWARFS_READER_SRC}) add_library(dwarfs_writer ${LIBDWARFS_WRITER_SRC}) add_library(dwarfs_extractor ${LIBDWARFS_EXTRACTOR_SRC}) add_library(dwarfs_compression ${LIBDWARFS_COMPRESSION_SRC}) @@ -733,11 +737,15 @@ add_library(dwarfs_categorizer ${LIBDWARFS_CATEGORIZER_SRC}) add_library(dwarfs_compression_metadata src/dwarfs/compression_metadata_requirements.cpp) add_library(dwarfs_tool src/dwarfs/tool.cpp src/dwarfs/iolayer.cpp) -target_link_libraries(dwarfs_compression_metadata dwarfs_folly_lite) -target_link_libraries(dwarfs_categorizer dwarfs_compression_metadata) -target_link_libraries(dwarfs_common PkgConfig::LIBCRYPTO dwarfs_folly_lite) -target_link_libraries(dwarfs_writer dwarfs_common dwarfs_compression_metadata) -target_link_libraries(dwarfs_extractor dwarfs_common) +target_link_libraries(dwarfs_compression_metadata PUBLIC dwarfs_folly_lite) +target_link_libraries(dwarfs_categorizer PUBLIC dwarfs_compression_metadata) +target_link_libraries(dwarfs_categorizer PRIVATE range-v3::range-v3) +target_link_libraries(dwarfs_common PUBLIC dwarfs_folly_lite) +target_link_libraries(dwarfs_common PRIVATE PkgConfig::LIBCRYPTO xxHash::xxhash phmap) +target_link_libraries(dwarfs_reader PUBLIC dwarfs_common) +target_link_libraries(dwarfs_writer PUBLIC dwarfs_common dwarfs_compression_metadata) +target_link_libraries(dwarfs_writer PRIVATE phmap) +target_link_libraries(dwarfs_extractor PUBLIC dwarfs_reader) if(DWARFS_GIT_BUILD) target_include_directories(dwarfs_common PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/include) @@ -753,12 +761,12 @@ target_compile_definitions( PRJ_COMPILER_ID="${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}" ) -target_link_libraries(dwarfs_categorizer dwarfs_folly_lite range-v3::range-v3) -target_link_libraries(dwarfs_compression dwarfs_common dwarfs_compression_thrift) +target_link_libraries(dwarfs_categorizer PUBLIC dwarfs_folly_lite range-v3::range-v3) +target_link_libraries(dwarfs_compression PUBLIC dwarfs_common dwarfs_compression_thrift) if(ENABLE_RICEPP) - target_link_libraries(dwarfs_compression ricepp) + target_link_libraries(dwarfs_compression PRIVATE ricepp) endif() -target_link_libraries(dwarfs_tool dwarfs_common) +target_link_libraries(dwarfs_tool PUBLIC dwarfs_common) if(STATIC_BUILD_DO_NOT_USE) add_link_options(-static -static-libgcc) @@ -779,8 +787,7 @@ if(WITH_UNIVERSAL_BINARY) add_executable(dwarfsuniversal src/universal.cpp) list(APPEND BINARY_TARGETS dwarfsuniversal) - target_link_libraries(dwarfsuniversal mkdwarfs_main dwarfsck_main - dwarfsextract_main) + target_link_libraries(dwarfsuniversal PRIVATE mkdwarfs_main dwarfsck_main dwarfsextract_main) set_target_properties(dwarfsuniversal PROPERTIES RUNTIME_OUTPUT_DIRECTORY universal OUTPUT_NAME dwarfs-universal) @@ -800,28 +807,28 @@ if(FUSE3_FOUND OR WINFSP OR APPLE) add_library(dwarfs_main src/dwarfs_main.cpp) target_compile_definitions(dwarfs_main PRIVATE _FILE_OFFSET_BITS=64) add_executable(dwarfs-bin src/dwarfs.cpp) - target_link_libraries(dwarfs-bin dwarfs_main) + target_link_libraries(dwarfs-bin PRIVATE dwarfs_main) set_target_properties(dwarfs-bin PROPERTIES OUTPUT_NAME dwarfs) if(WINFSP) target_compile_definitions(dwarfs_main PRIVATE FUSE_USE_VERSION=32 DWARFS_FUSE_LOWLEVEL=0) target_include_directories(dwarfs_main SYSTEM PRIVATE "${WINFSP_PATH}/inc") - target_link_libraries(dwarfs_main ${WINFSP}) - target_link_libraries(dwarfs-bin delayimp.lib) + target_link_libraries(dwarfs_main PRIVATE ${WINFSP}) + target_link_libraries(dwarfs-bin PRIVATE delayimp.lib) target_link_options(dwarfs-bin PRIVATE /DELAYLOAD:winfsp-x64.dll) if(WITH_UNIVERSAL_BINARY) - target_link_libraries(dwarfsuniversal delayimp.lib) + target_link_libraries(dwarfsuniversal PRIVATE delayimp.lib) target_link_options(dwarfsuniversal PRIVATE /DELAYLOAD:winfsp-x64.dll) endif() elseif(APPLE) target_compile_definitions(dwarfs_main PRIVATE FUSE_USE_VERSION=29) - target_link_libraries(dwarfs_main PkgConfig::FUSE) + target_link_libraries(dwarfs_main PRIVATE PkgConfig::FUSE) else() target_compile_definitions(dwarfs_main PRIVATE FUSE_USE_VERSION=35) - target_link_libraries(dwarfs_main PkgConfig::FUSE3) + target_link_libraries(dwarfs_main PRIVATE PkgConfig::FUSE3) endif() if(WITH_UNIVERSAL_BINARY) - target_link_libraries(dwarfsuniversal dwarfs_main) + target_link_libraries(dwarfsuniversal PRIVATE dwarfs_main) endif() if(WINFSP) install(TARGETS dwarfs-bin RUNTIME DESTINATION bin) @@ -841,11 +848,11 @@ if(FUSE_FOUND AND (NOT APPLE) AND (WITH_LEGACY_FUSE OR NOT FUSE3_FOUND)) add_library(dwarfs2_main src/dwarfs_main.cpp) target_compile_definitions(dwarfs2_main PRIVATE _FILE_OFFSET_BITS=64 FUSE_USE_VERSION=29) - target_link_libraries(dwarfs2_main PkgConfig::FUSE) + target_link_libraries(dwarfs2_main PRIVATE PkgConfig::FUSE) add_executable(dwarfs2-bin src/dwarfs.cpp) - target_link_libraries(dwarfs2-bin dwarfs2_main) + target_link_libraries(dwarfs2-bin PRIVATE dwarfs2_main) if(WITH_UNIVERSAL_BINARY AND (NOT FUSE3_FOUND)) - target_link_libraries(dwarfsuniversal dwarfs2_main) + target_link_libraries(dwarfsuniversal PRIVATE dwarfs2_main) endif() set_target_properties(dwarfs2-bin PROPERTIES OUTPUT_NAME dwarfs2) add_custom_command(OUTPUT mount.dwarfs2 @@ -869,7 +876,7 @@ if(WITH_TESTS OR WITH_BENCHMARKS OR WITH_FUZZ) test/test_dirtree.cpp test/filter_test_data.cpp ) - target_link_libraries(dwarfs_test_helpers dwarfs_common) + target_link_libraries(dwarfs_test_helpers PUBLIC dwarfs_common) set_property(TARGET dwarfs_test_helpers PROPERTY CXX_STANDARD 20) endif() @@ -917,7 +924,7 @@ if(WITH_TESTS) foreach (test ${DWARFS_TESTS}) add_executable(${test} test/${test}.cpp) target_link_libraries( - ${test} dwarfs_test_helpers gmock gtest gtest_main + ${test} PRIVATE dwarfs_test_helpers gmock gtest gtest_main ) target_compile_definitions(${test} PRIVATE TEST_DATA_DIR=\"${CMAKE_SOURCE_DIR}/test\" @@ -930,16 +937,18 @@ if(WITH_TESTS) $<$:DWARFS_HAVE_UNIVERSAL_BINARY> ) - target_link_libraries(tool_main_test + target_link_libraries(tool_main_test PRIVATE mkdwarfs_main dwarfsck_main dwarfsbench_main dwarfsextract_main) - target_link_libraries(block_cache_test mkdwarfs_main) + target_link_libraries(block_cache_test PRIVATE mkdwarfs_main) + + target_link_libraries(ricepp_compressor_test PRIVATE range-v3::range-v3) foreach(tgt fits_categorizer_test incompressible_categorizer_test pcmaudio_categorizer_test tool_main_test) - target_link_libraries(${tgt} "$") + target_link_libraries(${tgt} PRIVATE "$") endforeach() foreach(tgt ${TEST_TARGETS}) @@ -951,32 +960,32 @@ if(WITH_BENCHMARKS) find_package(benchmark 1.8) if(benchmark_FOUND) add_executable(dwarfs_benchmark test/dwarfs_benchmark.cpp) - target_link_libraries(dwarfs_benchmark dwarfs_test_helpers benchmark::benchmark) + target_link_libraries(dwarfs_benchmark PRIVATE dwarfs_test_helpers benchmark::benchmark) list(APPEND BINARY_TARGETS dwarfs_benchmark) add_executable(multiversioning_benchmark test/multiversioning_benchmark.cpp) - target_link_libraries(multiversioning_benchmark dwarfs_test_helpers benchmark::benchmark) + target_link_libraries(multiversioning_benchmark PRIVATE dwarfs_test_helpers benchmark::benchmark) list(APPEND BINARY_TARGETS multiversioning_benchmark) endif() add_library(dwarfs_follybenchmark_lite ${FOLLY_BENCHMARK_LITE_SRC}) set_property(TARGET dwarfs_follybenchmark_lite PROPERTY CXX_STANDARD 20) apply_folly_compile_options_to_target(dwarfs_follybenchmark_lite) - target_link_libraries(dwarfs_follybenchmark_lite dwarfs_folly_lite) + target_link_libraries(dwarfs_follybenchmark_lite PUBLIC dwarfs_folly_lite) # TODO: migrate to benchmark? add_executable(segmenter_benchmark test/segmenter_benchmark.cpp) - target_link_libraries(segmenter_benchmark dwarfs_follybenchmark_lite dwarfs_test_helpers) + target_link_libraries(segmenter_benchmark PRIVATE dwarfs_follybenchmark_lite dwarfs_test_helpers) list(APPEND BINARY_TARGETS segmenter_benchmark) endif() if(WITH_FUZZ) add_executable(fuzz_categorizers test/fuzz_categorizers.cpp) - target_link_libraries(fuzz_categorizers "$") + target_link_libraries(fuzz_categorizers PRIVATE "$") list(APPEND BINARY_TARGETS fuzz_categorizers) add_executable(fuzz_mkdwarfs test/fuzz_mkdwarfs.cpp) - target_link_libraries(fuzz_mkdwarfs mkdwarfs_main dwarfs_test_helpers) + target_link_libraries(fuzz_mkdwarfs PRIVATE mkdwarfs_main dwarfs_test_helpers) list(APPEND BINARY_TARGETS fuzz_mkdwarfs) endif() @@ -1017,7 +1026,7 @@ add_library( ${THRIFT_GENERATED_DIR}/thrift/lib/thrift/gen-cpp2/frozen_types.cpp) set_property(TARGET dwarfs_thrift_lite PROPERTY CXX_STANDARD 20) -target_link_libraries(dwarfs_thrift_lite dwarfs_folly_lite) +target_link_libraries(dwarfs_thrift_lite PUBLIC dwarfs_folly_lite) target_include_directories(dwarfs_thrift_lite SYSTEM PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/fbthrift @@ -1035,18 +1044,18 @@ add_cpp2_thrift_library(thrift/history.thrift add_cpp2_thrift_library(thrift/features.thrift TARGET dwarfs_features_thrift OUTPUT_PATH dwarfs) -target_link_libraries(dwarfs_categorizer dwarfs_metadata_thrift) +target_link_libraries(dwarfs_categorizer PRIVATE dwarfs_metadata_thrift) -foreach(tgt dwarfs_common dwarfs_writer dwarfs_extractor +foreach(tgt dwarfs_common dwarfs_reader dwarfs_writer dwarfs_extractor dwarfs_compression dwarfs_categorizer dwarfs_compression_metadata dwarfs_tool ${BINARY_TARGETS} ${TEST_TARGETS} ${MAIN_TARGETS}) set_target_properties(${tgt} PROPERTIES EXPORT_COMPILE_COMMANDS ON) - target_link_libraries(${tgt} Boost::boost dwarfs_folly_lite dwarfs_thrift_lite) + target_link_libraries(${tgt} PUBLIC Boost::boost dwarfs_folly_lite dwarfs_thrift_lite) if(USE_JEMALLOC) - target_link_libraries(${tgt} PkgConfig::JEMALLOC) + target_link_libraries(${tgt} PRIVATE PkgConfig::JEMALLOC) endif(USE_JEMALLOC) target_include_directories(${tgt} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) @@ -1120,10 +1129,10 @@ foreach(tgt dwarfs_common dwarfs_writer dwarfs_extractor target_compile_definitions(${tgt} PRIVATE DWARFS_COVERAGE_ENABLED=1) endif() - target_link_libraries(${tgt} fmt::fmt) + target_link_libraries(${tgt} PRIVATE fmt::fmt) if(WIN32) - target_link_libraries(${tgt} ntdll.lib) + target_link_libraries(${tgt} PRIVATE ntdll.lib) endif() endforeach() @@ -1145,6 +1154,7 @@ set_property(TARGET dwarfs_fsst PROPERTY CXX_EXTENSIONS OFF) target_link_libraries( dwarfs_common + PUBLIC Boost::boost Boost::chrono Boost::iostreams @@ -1158,32 +1168,30 @@ target_link_libraries( # target_link_libraries(dwarfs PkgConfig::LIBMAGIC) # endif() -target_link_libraries(dwarfs_categorizer libzstd_static) -target_link_libraries(dwarfs_compression libzstd_static) +target_link_libraries(dwarfs_categorizer PRIVATE libzstd_static) +target_link_libraries(dwarfs_compression PRIVATE libzstd_static) if(LIBLZ4_FOUND) - target_link_libraries(dwarfs_compression PkgConfig::LIBLZ4) + target_link_libraries(dwarfs_compression PRIVATE PkgConfig::LIBLZ4) endif() if(LIBLZMA_FOUND) - target_link_libraries(dwarfs_compression PkgConfig::LIBLZMA) + target_link_libraries(dwarfs_compression PRIVATE PkgConfig::LIBLZMA) endif() if(FLAC_FOUND) - target_link_libraries(dwarfs_compression PkgConfig::FLAC) + target_link_libraries(dwarfs_compression PRIVATE PkgConfig::FLAC) endif() if(LIBBROTLIDEC_FOUND AND LIBBROTLIENC_FOUND) - target_link_libraries(dwarfs_compression PkgConfig::LIBBROTLIDEC PkgConfig::LIBBROTLIENC) + target_link_libraries(dwarfs_compression PRIVATE PkgConfig::LIBBROTLIDEC PkgConfig::LIBBROTLIENC) endif() if(NOT STATIC_BUILD_DO_NOT_USE) - target_link_libraries(dwarfs_extractor PkgConfig::LIBARCHIVE) + target_link_libraries(dwarfs_extractor PUBLIC PkgConfig::LIBARCHIVE) # target_link_libraries(dwarfs_categorizer PkgConfig::LIBMAGIC) endif(NOT STATIC_BUILD_DO_NOT_USE) -target_link_libraries(dwarfs_common phmap xxHash::xxhash) - if(DWARFS_USE_EXCEPTION_TRACER) add_library( dwarfs_folly_exception_tracer_base_lite @@ -1199,49 +1207,49 @@ if(DWARFS_USE_EXCEPTION_TRACER) endif() foreach(tgt ${MAIN_TARGETS} ${BINARY_TARGETS} ${TEST_TARGETS}) - target_link_libraries(${tgt} dwarfs_tool) + target_link_libraries(${tgt} PRIVATE dwarfs_tool) endforeach() foreach(tgt ${BINARY_TARGETS} ${TEST_TARGETS}) - target_link_libraries(${tgt} dwarfs_common) - target_link_libraries(${tgt} "$") + target_link_libraries(${tgt} PRIVATE dwarfs_common) + target_link_libraries(${tgt} PRIVATE "$") if(DWARFS_USE_EXCEPTION_TRACER) - target_link_libraries(${tgt} + target_link_libraries(${tgt} PRIVATE "$") endif() endforeach() -target_link_libraries(mkdwarfs_main dwarfs_writer "$") -target_link_libraries(dwarfsck_main dwarfs_common) -target_link_libraries(dwarfsextract_main dwarfs_extractor PkgConfig::LIBARCHIVE) -target_link_libraries(dwarfsbench_main dwarfs_extractor) +target_link_libraries(mkdwarfs_main PRIVATE dwarfs_reader dwarfs_writer "$") +target_link_libraries(dwarfsck_main PRIVATE dwarfs_reader) +target_link_libraries(dwarfsextract_main PRIVATE dwarfs_extractor PkgConfig::LIBARCHIVE) +target_link_libraries(dwarfsbench_main PRIVATE dwarfs_extractor) -target_link_libraries(mkdwarfs mkdwarfs_main) -target_link_libraries(dwarfsck dwarfsck_main) -target_link_libraries(dwarfsextract dwarfsextract_main) -target_link_libraries(dwarfsbench dwarfsbench_main) +target_link_libraries(mkdwarfs PRIVATE mkdwarfs_main) +target_link_libraries(dwarfsck PRIVATE dwarfsck_main) +target_link_libraries(dwarfsextract PRIVATE dwarfsextract_main) +target_link_libraries(dwarfsbench PRIVATE dwarfsbench_main) if(TARGET dwarfsuniversal) - target_link_libraries(dwarfsuniversal dwarfs_writer dwarfs_extractor "$") + target_link_libraries(dwarfsuniversal PRIVATE dwarfs_writer dwarfs_extractor "$") endif() if(TARGET dwarfs_main) - target_link_libraries(dwarfs_main dwarfs_common) + target_link_libraries(dwarfs_main PRIVATE dwarfs_reader) endif() if(TARGET dwarfs2_main) - target_link_libraries(dwarfs2_main dwarfs_common) + target_link_libraries(dwarfs2_main PRIVATE dwarfs_reader) endif() if(TARGET dwarfs_benchmark) - target_link_libraries(dwarfs_benchmark dwarfs_writer) + target_link_libraries(dwarfs_benchmark PRIVATE dwarfs_reader dwarfs_writer) endif() if(TARGET multiversioning_benchmark) - target_link_libraries(multiversioning_benchmark dwarfs_writer) + target_link_libraries(multiversioning_benchmark PRIVATE dwarfs_writer) endif() if(TARGET segmenter_benchmark) - target_link_libraries(segmenter_benchmark dwarfs_writer) + target_link_libraries(segmenter_benchmark PRIVATE dwarfs_writer) endif() foreach(tgt ${TEST_TARGETS}) - target_link_libraries(${tgt} dwarfs_writer dwarfs_extractor) + target_link_libraries(${tgt} PRIVATE dwarfs_writer dwarfs_extractor) endforeach() if(STATIC_BUILD_DO_NOT_USE) @@ -1288,13 +1296,13 @@ if(STATIC_BUILD_DO_NOT_USE) set_target_properties(static_libmagic PROPERTIES INTERFACE_LINK_LIBRARIES static_libz) - target_link_libraries(dwarfs_categorizer static_libmagic) - target_link_libraries(dwarfs_compression static_libflac) + target_link_libraries(dwarfs_categorizer PRIVATE static_libmagic) + target_link_libraries(dwarfs_compression PRIVATE static_libflac) foreach(tgt ${BINARY_TARGETS} ${TEST_TARGETS}) if(PREFER_SYSTEM_LIBFMT) target_link_libraries( - ${tgt} + ${tgt} PRIVATE static_libfmt) endif() @@ -1304,6 +1312,7 @@ if(STATIC_BUILD_DO_NOT_USE) # ................................................................... target_link_libraries( ${tgt} + PRIVATE static_libdoubleconv static_libglog static_libgflags @@ -1466,7 +1475,7 @@ if(STATIC_BUILD_DO_NOT_USE OR WIN32) if(USE_RICEPP_PACKAGE) add_executable(ricepp_benchmark_fits ricepp/ricepp_benchmark_fits.cpp) - target_link_libraries(ricepp_benchmark_fits ricepp benchmark::benchmark) + target_link_libraries(ricepp_benchmark_fits PRIVATE ricepp benchmark::benchmark) set(RICEPP_BENCHMARK_FITS "ricepp_benchmark_fits") else() set(RICEPP_BENCHMARK_FITS "ricepp/ricepp_benchmark_fits")