Iceberg C++ splits its code into a few libraries so applications can link only what they need.
icebergThe core library contains schemas, table metadata, manifests, snapshots, table updates, catalog interfaces, Puffin files, etc. It also owns the Arrow C Data interface and the nanoarrow-based utilities used by core metadata and data processing code. These utilities do not depend on the Arrow C++ library.
iceberg_dataThis library handles data-plane processing, including delete filtering, data writers, and scan task readers. Concrete Avro and Parquet readers and writers are supplied by the iceberg_bundle library.
iceberg_bundleThis library combines iceberg_data with the Arrow C++, Avro, Parquet, and Arrow filesystem integrations. It gives applications one link-time dependency. Please note that Meson build currently does not have this yet.
iceberg_rest, iceberg_hive, iceberg_sql_catalogThese optional catalog libraries cover REST, Hive Metastore, and SQL databases. Each depends on iceberg and its own client libraries, not on iceberg_data or iceberg_bundle.
Production files are kept in the directory for the library that builds them:
iceberg root or core subdirectories such as deletes/, puffin/, manifest/, and update/.data/ are built into iceberg_data.arrow/, avro/, and parquet/ are built into iceberg_bundle.catalog/rest/, catalog/hive/, and catalog/sql/ and are built into their corresponding catalog libraries.The Arrow C Data files in the iceberg root are core infrastructure and are separate from the Arrow C++ integration under arrow/.
Public headers are installed with their existing iceberg/... include paths. Headers whose names contain internal are not installed.
The core library defines registries for optional file readers, writers, and filesystem implementations. Integrations register their implementations as follows:
FileIO implementations are registered when the Arrow integration is loaded. iceberg::arrow::RegisterAll() additionally registers Arrow-based batch projection.iceberg::avro::RegisterAll().iceberg::parquet::RegisterAll().