We welcome contributions to Apache Iceberg! To learn more about contributing to Apache Iceberg, please refer to the official Iceberg contribution guidelines. These guidelines are intended as helpful suggestions to make the contribution process as seamless as possible, and are not strict rules.
If you would like to discuss your proposed change before contributing, we encourage you to visit our Community page. There, you will find various ways to connect with the community, including Slack and our mailing lists. Alternatively, you can open a new issue directly in the GitHub repository.
For first-time contributors, feel free to check out our good first issues for an easy way to get started.
In addition, contributors using AI-assisted tools must follow the documented guidelines for AI-assisted contributions available on the Iceberg website: https://iceberg.apache.org/contribute/#guidelines-for-ai-assisted-contributions.
The Iceberg C++ Project is hosted on GitHub at https://github.com/apache/iceberg-cpp.
Clone the repository for local development:
git clone https://github.com/apache/iceberg-cpp.git cd iceberg-cpp
Build the core libraries:
cmake -S . -B build -G Ninja -DCMAKE_INSTALL_PREFIX=/path/to/install -DICEBERG_BUILD_STATIC=ON -DICEBERG_BUILD_SHARED=ON cmake --build build ctest --test-dir build --output-on-failure cmake --install build
Build with bundled dependencies:
cmake -S . -B build -G Ninja -DCMAKE_INSTALL_PREFIX=/path/to/install -DICEBERG_BUILD_BUNDLE=ON cmake --build build ctest --test-dir build --output-on-failure cmake --install build
We follow modern C++ best practices:
PascalCase (e.g., TableScanBuilder)PascalCase (e.g., CreateNamespace, ExtractYear)snake_case (e.g., name(), type_id(), is_primitive())snake_case (e.g., file_io)k prefix with PascalCase (e.g., kHeaderContentType, kMaxPrecision)std::unique_ptr, std::shared_ptr)Result<T> types for error propagationIt is important to keep the C++ public API compatible across versions. Public methods should have no leading underscores and should not be removed without deprecation notice.
If you want to remove a method, please add a deprecation notice:
[[deprecated("This method will be removed in version 2.0.0. Use new_method() instead.")]] void old_method();
We use clang-format for code formatting. The configuration is defined in .clang-format file.
Format your code before submitting:
clang-format -i src/**/*.{h,cc}
Run all tests:
ctest --test-dir build --output-on-failure
Run specific test:
ctest --test-dir build -R test_name
Install the python package pre-commit and run once pre-commit install:
pip install pre-commit pre-commit install
This will setup a git pre-commit-hook that is executed on each commit and will report the linting problems. To run all hooks on all files use pre-commit run -a.
main:git checkout -b feature/your-feature-name
Use clear, descriptive commit messages:
feat: add support for S3 file system fix: resolve memory leak in table reader docs: update API documentation test: add unit tests for schema validation
The Apache Iceberg community is built on the principles described in the Apache Way and all who engage with the community are expected to be respectful, open, come with the best interests of the community in mind, and abide by the Apache Foundation Code of Conduct.
New to the project? Check out our good first issues for an easy way to get started.
Releases are managed by the Apache Iceberg project maintainers. For information about the release process, please refer to the main Iceberg project documentation.
Licensed under the Apache License, Version 2.0