| <!-- |
| ~ Licensed to the Apache Software Foundation (ASF) under one |
| ~ or more contributor license agreements. See the NOTICE file |
| ~ distributed with this work for additional information |
| ~ regarding copyright ownership. The ASF licenses this file |
| ~ to you under the Apache License, Version 2.0 (the |
| ~ "License"); you may not use this file except in compliance |
| ~ with the License. You may obtain a copy of the License at |
| ~ |
| ~ http://www.apache.org/licenses/LICENSE-2.0 |
| ~ |
| ~ Unless required by applicable law or agreed to in writing, |
| ~ software distributed under the License is distributed on an |
| ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| ~ KIND, either express or implied. See the License for the |
| ~ specific language governing permissions and limitations |
| ~ under the License. |
| --> |
| |
|  |
| |
| [](https://apache-iceberg.slack.com/) |
| [](https://deepwiki.com/apache/iceberg-cpp) |
| |
| # Apache Iceberg™ C++ |
| |
| C++ implementation of [Apache Iceberg™](https://iceberg.apache.org/). |
| |
| ## Requirements |
| |
| - CMake 3.25 or higher |
| - C++23 compliant compiler (GCC 14+, Clang 16+, MSVC 2022+) |
| |
| ## Customizing Dependency URLs |
| |
| If you experience network issues when downloading dependencies, you can customize the download URLs using environment variables. |
| |
| The following environment variables can be set to customize dependency URLs: |
| |
| - `ICEBERG_ARROW_URL`: Apache Arrow tarball URL |
| - `ICEBERG_AVRO_URL`: Apache Avro tarball URL |
| - `ICEBERG_AVRO_GIT_URL`: Apache Avro git repository URL |
| - `ICEBERG_NANOARROW_URL`: Nanoarrow tarball URL |
| - `ICEBERG_CROARING_URL`: CRoaring tarball URL |
| - `ICEBERG_NLOHMANN_JSON_URL`: nlohmann-json tarball URL |
| - `ICEBERG_CPR_URL`: cpr tarball URL |
| |
| Example usage: |
| |
| ```bash |
| export ICEBERG_ARROW_URL="https://your-mirror.com/apache-arrow-22.0.0.tar.gz" |
| cmake -S . -B build |
| ``` |
| |
| ## Build |
| |
| ### Build, Run Test and Install Core Libraries |
| |
| ```bash |
| cd iceberg-cpp |
| 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 and Install Iceberg Bundle Library |
| |
| #### Vendored Apache Arrow (default) |
| |
| ```bash |
| 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 |
| ``` |
| |
| #### Provided Apache Arrow |
| |
| ```bash |
| cmake -S . -B build -G Ninja -DCMAKE_INSTALL_PREFIX=/path/to/install -DCMAKE_PREFIX_PATH=/path/to/arrow -DICEBERG_BUILD_BUNDLE=ON |
| cmake --build build |
| ctest --test-dir build --output-on-failure |
| cmake --install build |
| ``` |
| |
| ### Build Examples |
| |
| After installing the core libraries, you can build the examples: |
| |
| ```bash |
| cd iceberg-cpp/example |
| cmake -S . -B build -G Ninja -DCMAKE_PREFIX_PATH=/path/to/install |
| cmake --build build |
| ``` |
| |
| If you are using provided Apache Arrow, you need to include `/path/to/arrow` in `CMAKE_PREFIX_PATH` as below. |
| |
| ```bash |
| cmake -S . -B build -G Ninja -DCMAKE_PREFIX_PATH="/path/to/install;/path/to/arrow" |
| ``` |
| |
| ## Contribute |
| |
| Apache Iceberg is an active open-source project, governed under the Apache Software Foundation (ASF). Iceberg-cpp is open to people who want to contribute to it. Here are some ways to get involved: |
| |
| - Submit [Issues](https://github.com/apache/iceberg-cpp/issues/new) for bug report or feature requests. |
| - Discuss at [dev mailing list](mailto:dev@iceberg.apache.org) ([subscribe](<mailto:dev-subscribe@iceberg.apache.org?subject=(send%20this%20email%20to%20subscribe)>) / [unsubscribe](<mailto:dev-unsubscribe@iceberg.apache.org?subject=(send%20this%20email%20to%20unsubscribe)>) / [archives](https://lists.apache.org/list.html?dev@iceberg.apache.org)) |
| - Talk to the community directly at [Slack #cpp channel](https://join.slack.com/t/apache-iceberg/shared_invite/zt-1zbov3k6e-KtJfoaxp97YfX6dPz1Bk7A). |
| |
| The Apache Iceberg community is built on the principles described in the [Apache Way](https://www.apache.org/theapacheway/index.html) 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](https://www.apache.org/foundation/policies/conduct.html). |
| |
| 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](https://iceberg.apache.org/contribute/#guidelines-for-ai-assisted-contributions). |
| |
| ### Linting |
| |
| 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`. |
| |
| ### Dev Containers |
| |
| We provide Dev Container configuration file templates. |
| |
| To use a Dev Container as your development environment, follow the steps below, then select `Dev Containers: Reopen in Container` from VS Code's Command Palette. |
| |
| ``` |
| cd .devcontainer |
| cp Dockerfile.template Dockerfile |
| cp devcontainer.json.template devcontainer.json |
| ``` |
| |
| If you make improvements that could benefit all developers, please update the template files and submit a pull request. |
| |
| ## License |
| |
| Licensed under the [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0) |