mirror of
https://github.com/apache/arrow.git
synced 2026-10-29 09:05:47 +08:00
### Rationale for this change Trying to reduce the size of libarrow.so and remove google-cloud-cpp SDK on some builds. Allow for users to plug and play based on requirements and divide our functionality into cleaner modules. ### What changes are included in this PR? Unconditionally build GCS and the google-cloud-cpp SDK into a different module libarrow_gcs.so outside of libarrow.so. Update bindings to link against the new libarrow_gcs.so library. Update the Linux Package jobs to have the new module into a different package. ### Are these changes tested? Yes via CI ### Are there any user-facing changes? Yes, users will need to either link against libarrow_s3.so or register using LoadFileSystemFactories ### Was AI used for this PR? In accordance to the [AI generation guidelines](https://arrow.apache.org/docs/dev/developers/overview.html#ai-generated-code), please disclose below whether and how AI was used in this PR. **PR code and description written by:** - [x] Human - [x] AI **Reviewed before submission by:** - [x] Human - [ ] AI - [ ] Not reviewed * GitHub Issue: #54902 Authored-by: Raúl Cumplido <raulcd@apache.org> Signed-off-by: Raúl Cumplido <raulcd@apache.org>
266 lines
9.2 KiB
ReStructuredText
266 lines
9.2 KiB
ReStructuredText
.. 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.
|
|
|
|
.. default-domain:: cpp
|
|
.. highlight:: cpp
|
|
|
|
===================================
|
|
Using Arrow C++ in your own project
|
|
===================================
|
|
|
|
This section assumes you already have the Arrow C++ libraries on your
|
|
system, either after `installing them using a package manager
|
|
<https://arrow.apache.org/install/>`_ or after
|
|
:ref:`building them yourself <building-arrow-cpp>`.
|
|
|
|
The recommended way to integrate the Arrow C++ libraries in your own
|
|
C++ project is to use CMake's `find_package
|
|
<https://cmake.org/cmake/help/latest/command/find_package.html>`_
|
|
function for locating and integrating dependencies. If you don't use
|
|
CMake as a build system, you can use `pkg-config
|
|
<https://www.freedesktop.org/wiki/Software/pkg-config/>`_ to find
|
|
installed the Arrow C++ libraries.
|
|
|
|
CMake
|
|
=====
|
|
|
|
Basic usage
|
|
-----------
|
|
|
|
This minimal ``CMakeLists.txt`` file compiles a ``my_example.cc`` source
|
|
file into an executable linked with the Arrow C++ shared library:
|
|
|
|
.. code-block:: cmake
|
|
|
|
cmake_minimum_required(VERSION 3.25)
|
|
|
|
project(MyExample)
|
|
|
|
find_package(Arrow REQUIRED)
|
|
|
|
add_executable(my_example my_example.cc)
|
|
target_link_libraries(my_example PRIVATE Arrow::arrow_shared)
|
|
|
|
Available variables and targets
|
|
-------------------------------
|
|
|
|
The directive ``find_package(Arrow REQUIRED)`` asks CMake to find an Arrow
|
|
C++ installation on your system. When it returns, it will have set a few
|
|
CMake variables:
|
|
|
|
* ``${Arrow_FOUND}`` is true if the Arrow C++ libraries have been found
|
|
* ``${ARROW_VERSION}`` contains the Arrow version string
|
|
* ``${ARROW_FULL_SO_VERSION}`` contains the Arrow DLL version string
|
|
|
|
In addition, it will have created some targets that you can link against
|
|
(note these are plain strings, not variables):
|
|
|
|
* ``Arrow::arrow_shared`` links to the Arrow shared libraries
|
|
* ``Arrow::arrow_static`` links to the Arrow static libraries
|
|
|
|
For backwards compatibility purposes the ``arrow_shared`` and ``arrow_static``
|
|
targets are also available but we recommend using ``Arrow::arrow_shared`` and
|
|
``Arrow::arrow_static`` respectively.
|
|
|
|
In most cases, it is recommended to use the Arrow shared libraries.
|
|
|
|
If Arrow is installed on a custom path instead of a common system one you
|
|
will have to add the path where Arrow is installed to ``CMAKE_PREFIX_PATH``.
|
|
|
|
``CMAKE_PREFIX_PATH`` can be defined as a `CMake variable
|
|
<https://cmake.org/cmake/help/latest/variable/CMAKE_PREFIX_PATH.html>`_ or an
|
|
`environment variable <https://cmake.org/cmake/help/latest/envvar/CMAKE_PREFIX_PATH.html>`_.
|
|
|
|
Your system might already have a ``CMAKE_PREFIX_PATH`` environment variable
|
|
defined, use the following to expand it with the path to your Arrow
|
|
installation. In this case ``ARROW_ROOT`` is expected to contain the
|
|
path to your Arrow installation:
|
|
|
|
.. code-block:: shell
|
|
|
|
export CMAKE_PREFIX_PATH=${ARROW_ROOT}${CMAKE_PREFIX_PATH:+:${CMAKE_PREFIX_PATH}}
|
|
|
|
In the case of using a CMake variable you can add it when configuring the
|
|
project like the following to contain the possible existing
|
|
``CMAKE_PREFIX_PATH`` environment variable:
|
|
|
|
.. code-block:: shell
|
|
|
|
cmake ... -DCMAKE_PREFIX_PATH=${ARROW_ROOT}${CMAKE_PREFIX_PATH:+:${CMAKE_PREFIX_PATH}}
|
|
|
|
.. note::
|
|
The usage of ``COMPONENTS`` on our ``find_package`` implementation is
|
|
currently not supported.
|
|
|
|
Other available packages
|
|
------------------------
|
|
|
|
There are other available packages, they can also be used with the `find_package
|
|
<https://cmake.org/cmake/help/latest/command/find_package.html>`_ directive.
|
|
This is the list of available packages:
|
|
|
|
* ArrowCUDA
|
|
* ArrowAcero
|
|
* ArrowCompute
|
|
* ArrowDataset
|
|
* ArrowFlight
|
|
* ArrowFlightSql
|
|
* ArrowFlightTesting
|
|
* ArrowGcs
|
|
* ArrowS3
|
|
* ArrowSubstrait
|
|
* ArrowTesting
|
|
* Gandiva
|
|
* Parquet
|
|
|
|
Usage with find_package and target names follows a consistent naming pattern:
|
|
|
|
* find_package usage: ``find_package(PackageName REQUIRED)``
|
|
* Shared Target: ``PackageName::package_name_shared``
|
|
* Static Target: ``PackageName::package_name_static``
|
|
|
|
For example, to use the ``ArrowCompute`` package:
|
|
|
|
* find_package Usage: ``find_package(ArrowCompute REQUIRED)``
|
|
* Shared Target: ``ArrowCompute::arrow_compute_shared``
|
|
* Static Target: ``ArrowCompute::arrow_compute_static``
|
|
|
|
.. note::
|
|
CMake is case-sensitive. The names and variables listed above have to be
|
|
spelt exactly that way!
|
|
|
|
.. seealso::
|
|
A Docker-based :doc:`minimal build example <examples/cmake_minimal_build>`.
|
|
|
|
pkg-config
|
|
==========
|
|
|
|
Basic usage
|
|
-----------
|
|
|
|
You can get suitable build flags by the following command line:
|
|
|
|
.. code-block:: shell
|
|
|
|
pkg-config --cflags --libs arrow
|
|
|
|
If you want to link the Arrow C++ static library, you need to add
|
|
``--static`` option:
|
|
|
|
.. code-block:: shell
|
|
|
|
pkg-config --cflags --libs --static arrow
|
|
|
|
This minimal ``Makefile`` file compiles a ``my_example.cc`` source
|
|
file into an executable linked with the Arrow C++ shared library:
|
|
|
|
.. code-block:: makefile
|
|
|
|
my_example: my_example.cc
|
|
$(CXX) -o $@ $(CXXFLAGS) $< $$(pkg-config --cflags --libs arrow)
|
|
|
|
Many build systems support pkg-config. For example:
|
|
|
|
* `GNU Autotools <https://people.freedesktop.org/~dbn/pkg-config-guide.html#using>`_
|
|
* `CMake <https://cmake.org/cmake/help/latest/module/FindPkgConfig.html>`_
|
|
(But you should use ``find_package(Arrow)`` instead.)
|
|
* `Meson <https://mesonbuild.com/Reference-manual.html#dependency>`_
|
|
|
|
Available packages
|
|
------------------
|
|
|
|
The Arrow C++ provides a pkg-config package for each module. Here are
|
|
all available packages:
|
|
|
|
* ``arrow-csv``
|
|
* ``arrow-cuda``
|
|
* ``arrow-dataset``
|
|
* ``arrow-filesystem``
|
|
* ``arrow-flight-testing``
|
|
* ``arrow-flight``
|
|
* ``arrow-gcs``
|
|
* ``arrow-json``
|
|
* ``arrow-orc``
|
|
* ``arrow-python-flight``
|
|
* ``arrow-python``
|
|
* ``arrow-s3``
|
|
* ``arrow-tensorflow``
|
|
* ``arrow-testing``
|
|
* ``arrow``
|
|
* ``gandiva``
|
|
* ``parquet``
|
|
|
|
A Note on Linking
|
|
=================
|
|
|
|
Some Arrow components have dependencies that you may want to use in your own
|
|
project. Care must be taken to ensure that your project links the same version
|
|
of these dependencies in the same way (statically or dynamically) as Arrow,
|
|
else `ODR <https://en.wikipedia.org/wiki/One_Definition_Rule>`_ violations may
|
|
result and your program may crash or silently corrupt data.
|
|
|
|
In particular, Arrow Flight and its dependencies `Protocol Buffers (Protobuf)
|
|
<https://developers.google.com/protocol-buffers/>`_ and `gRPC
|
|
<https://grpc.io/>`_ are likely to cause issues. When using Arrow Flight, note
|
|
the following guidelines:
|
|
|
|
* If statically linking Arrow Flight, Protobuf and gRPC must also be statically
|
|
linked, and the same goes for dynamic linking.
|
|
* Some platforms (e.g. Ubuntu 20.04 at the time of this writing) may ship a
|
|
version of Protobuf and/or gRPC that is not recent enough for Arrow
|
|
Flight. In that case, Arrow Flight bundles these dependencies, so care must
|
|
be taken not to mix the Arrow Flight library with the platform Protobuf/gRPC
|
|
libraries (as then you will have two versions of Protobuf and/or gRPC linked
|
|
into your application).
|
|
|
|
It may be easiest to depend on a version of Arrow built from source, where you
|
|
can control the source of each dependency and whether it is statically or
|
|
dynamically linked. See :doc:`/developers/cpp/building` for instructions. Or
|
|
alternatively, use Arrow from a package manager such as Conda or vcpkg which
|
|
will manage consistent versions of Arrow and its dependencies.
|
|
|
|
|
|
.. _download-timezone-database:
|
|
|
|
Runtime Dependencies
|
|
====================
|
|
|
|
On most platforms, Arrow uses the OS-provided timezone database. However,
|
|
when built with Clang/libc++ on Windows, Arrow requires a user-provided IANA
|
|
timezone database.
|
|
|
|
To download the timezone database for libc++ builds, you must download and
|
|
extract the text version of the IANA timezone database and add the Windows
|
|
timezone mapping XML. To download, you can use the following batch script:
|
|
|
|
.. code-block:: batch
|
|
|
|
curl https://data.iana.org/time-zones/tzdata-latest.tar.gz --output tzdata.tar.gz
|
|
mkdir tzdata
|
|
tar --extract --file tzdata.tar.gz --directory tzdata
|
|
move tzdata %USERPROFILE%\Downloads\tzdata
|
|
@rem Also need Windows timezone mapping
|
|
curl https://raw.githubusercontent.com/unicode-org/cldr/master/common/supplemental/windowsZones.xml ^
|
|
--output %USERPROFILE%\Downloads\tzdata\windowsZones.xml
|
|
|
|
By default, the timezone database will be detected at ``%USERPROFILE%\Downloads\tzdata``,
|
|
but you can set a custom path at runtime in :struct:`arrow::GlobalOptions`::
|
|
|
|
arrow::GlobalOptions options;
|
|
options.timezone_db_path = "path/to/tzdata";
|
|
ARROW_RETURN_NOT_OK(arrow::Initialize(options));
|