Added
- Six additive symbols in the modern C API, all dispatching to the owning mount of the fd/dir handle:
tebako_fs_dir_is_embedded(dir-table membership test, the dir-handle counterpart oftebako_fd_is_embedded),tebako_fs_rewinddir/tebako_fs_telldir/tebako_fs_seekdir(index-based cookies — position is the ordinal of the next entry; backward seeks reset and advance),tebako_fs_pread(POSIX pread semantics via a newFileHandle::preadthreaded through the dwarfs/zip/squashfs backends' offset-read primitives; the fd position is not modified), andtebako_fs_dlmap2file(modern entry point of the legacytebako_dlmap2filemechanism with the same extraction/cache/lifetime semantics — extracts via the owning mount into a per-process temp dir, caches by memfs path; the returned string is caller-owned (free()), the extracted host file is owned by libtfs and removed at teardown). - Multi-mount support in the modern C API:
FsContextnow keeps a mount table (tebako_mount_thandle → mount) instead of a single mount, with longest-mount-point-prefix path dispatch across mounts and per-mount fd/dir ownership. New additive symbols:tebako_fs_mount_from_file,tebako_fs_mount_from_file_at,tebako_fs_mount_from_memory(all returning a mount handle via out-param) andtebako_fs_unmount_handle(force-closes only that mount's fds/dirs). Compat shims are unchanged:tebako_fs_init*stays single-mount (EEXISTwhen any mount exists),tebako_fs_unmount()unmounts all, andtebako_get_mount_point/tebako_get_archive_path/tebako_get_backend_namekeep reporting theinit*mount.tebako_fs_extract_allextracts a single mount at the destination root as before; with multiple mounts each mount's tree goes into its own<dest>/<mount-point-basename>subtree.
Removed
- The legacy tebako C/C++ API (libdwarfs-wr lineage) is dropped in full, leaving the modern C API (
<tebako/fs/c_api.h>:tebako_fs_*,tebako_get_*,tebako_is_initialized,tebako_path_is_embedded,tebako_fd_is_embedded,tebako_get_errno,tebako_strerror) as the only public surface. Removed: thefile-ctl/file-io/dir-ctl/dir-ioPOSIX-shim quartet and its entiretebako_*libc-shim export surface (tebako_open/tebako_read/tebako_close/tebako_lseek/tebako_stat/tebako_opendir/…, 40 unmangled exports in total);tebako-io*/tebako-memfs*/tebako-fd/tebako-kfd/tebako-direntand the mount/fd/kfd/memfs tables with their headers (both the top-levelinclude/tebako-*.hlayer and the legacy-only headers underinclude/tebako/fs/—common.h,dirent.h,io.h,memfs.h,package_descriptor.h,internal/{fd_table,kfd,memfs_table,mount_table}.h);tebako-cmdline;tebako-package-descriptor; the legacydl-ctldlmap (tebako_dlopen/tebako_dlmap2file, superseded bytebako_fs_dlmap2filewith the same extraction/cache/lifetime semantics); the memfs mount entry points (mount_root_memfs/mount_memfs_at_root/mount_memfs/unmount_root_memfs); thetebako-defines.hmacro-redirection header; the RB_W32 ruby-win32 shim surface (tebako-io-rb-w32*.h,include/tebako/fs/ruby/) — i.e. the entire MinGW port surface; the pure-Ctebako_dirent_helper_chelper library (its only consumer was the legacytebako-dirent.cpp); and theWITH_LEGACY_TEBAKO_APICMake option with all of its guards. Legacy-only test suites and their fixture data (tests/tests-*.cpp,tests/test_filesystem*,tests/test_files,tests/empty,tests/resources,tests/package_descriptor) were removed as well; the modern suite is unchanged at 493 tests.
Release artifacts
Per-platform packages (platform ids: linux-gnu-x86_64, linux-gnu-arm64,
linux-musl-x86_64, linux-musl-arm64, macos-arm64, macos-x86_64,
windows-ucrt64):
libtfs-<version>-<platform>.tar.gz(.zipon Windows):lib/libtfs.a— the libtfs static librarylib/libtebako_dirent_helper_c.a— C helper archive (link dependency
of libtfs where the legacy tebako API is built; not shipped on Windows)include/tebako/**— public headerslib/cmake/libtfs/— CMake package config (find_package(libtfs))
libtfs-deps-<version>-<platform>.tar.gz(all platforms): the
transitive static libraries consumers link against —
libdwarfs_reader,libdwarfs_common,libdwarfs_metadata_legacy,
libdwarfs_decompressor,libflatbuffers,libzip,libfmt,
libxxhash,libzstd,liblz4,liblzma, brotli (dec/enc/common),
libz,libbz2,libboost_filesystem,libboost_chrono, plus
libcrypto/libsslon Linux and Windows (macOS consumers link
brew/system OpenSSL at link time) — with the CMake package configs
of those ports undershare/(orlib/cmake/where a port installs
there), sofind_dependencycan still resolve, and a curated
header set underinclude/(brotli/,zstd.h/zstd_errors.h/
zdict.h,lz4*.h,lzma.h+lzma/,zlib.h/zconf.h,
bzlib.h,fmt/,flatbuffers/,zip.h/zipconf.h,
xxhash.h/xxh3.h, plus theboost_filesystem/boost_chrono
subset ofboost/), so consumers can also compile against the
shipped archives (e.g. native gem extensions that include
<brotli/encode.h>).mkdwarfs-<platform>andtebakofs-<platform>— command-line tools
(.exesuffix onwindows-ucrt64)
Self-contained consumption: a libtfs-<version>-<platform>
package plus the matching libtfs-deps-<version>-<platform> package
are fully self-contained — compiling and linking against libtfs.a
needs no vcpkg (and no C++20 dependency build) on the consumer
machine, only a compiler, a linker and the platform system libraries
(plus brew/system OpenSSL on macOS).
Consumers that prefer to resolve dependencies themselves (e.g. their
own vcpkg) can keep using the libtfs package alone.
Linkage notes (from the shipped binaries' ldd/objdump output):
- All C/C++ third-party dependencies (dwarfs-t, libzip, fmt, Boost, …)
are statically linked into the binaries on every platform. linux-gnu-*: dynamic glibc only (built inside the tebako
ubuntu-20.04 ci container; libstdc++/libgcc linked statically —
runs on any glibc ≥ 2.31 system such as Ubuntu 20.04+).linux-musl-*: dynamic musl libc only (built on Alpine 3.21;
libstdc++/libgcc linked statically — runs on any musl system,
including tebako's older alpine-3.17 containers). The musl deps
packages additionally carry the build'slibstdc++.a/libgcc.a/
libgcc_eh.aso consumers on older toolchains can still close
the static link.macos-*: dynamic macOS system libraries only (libSystem, libc++;
built onmacos-14/macos-15-intel).windows-ucrt64: dynamic UCRT + MSYS2 runtime DLLs
(libgcc_s_seh-1.dll, pluslibwinpthread-1.dll/libstdc++-6.dll
for mkdwarfs); run inside MSYS2 UCRT64 or ship those DLLs alongside.
The Windows package ships the modern C/C++ API only (the legacy tebako
API needs the ruby build context).
SquashFS: shipped artifacts are built WITH_SQUASHFS=OFF — the
backends are dwarfs + zip only, so consumers are not forced to link
LGPL squashfs-tools-ng. POSIX source builds may opt into the SquashFS
backend (LGPL) with -DWITH_SQUASHFS=ON.
SHA-256 checksums for all artifacts: see the SHA256SUMS asset.