构建 Arrow 库 🏋🏿♀️#
Arrow 项目包含许多库,支持在多种语言中工作。大多数库(C++、C#、Go、Java、JavaScript、Julia 和 Rust)已经包含了 Arrow 的独立实现。
这与 C (Glib)、MATLAB、Python、R 和 Ruby 不同,因为它们是建立在 C++ 库之上的。在本指南的这一部分,我们将尝试友好地介绍构建过程,讲解其中一些库以及它们如何与 C++ 库协同工作。
如果你决定为 Arrow 做贡献,你可能需要编译 C++ 源代码。这是通过一个名为 CMake 的工具完成的,你可能有用过,也可能没有。如果没有,本指南的这一部分将帮助你更好地理解 CMake 以及构建 Arrow C++ 代码的过程。
本内容旨在帮助解释与从源码构建 Arrow C++ 库相关的概念和所需工具。如果你正在寻找具体的操作步骤,或者已经对编译 Arrow C++ 库感到熟悉,那么请随时前往 C++、PyArrow 或 R 包构建部分。
构建 Arrow C++#
为什么要从源码构建 Arrow C++?#
对于那些基于 C++ 实现的 Arrow 实现(例如 Python 和 R),它们为底层的 C++ 函数编写了包装器和接口。如果你想在 PyArrow 或 R 包上工作,你可能也需要编辑 C++ 库的源代码。
关于从源码构建 C++ 库的详细说明可以在这里找到。
关于 CMake#
CMake 是一个跨平台的构建系统生成器,它将实际的构建工作委托给另一个程序,例如 make 或 ninja。如果你在构建过程中遇到错误,首先要做的是仔细查看错误信息,并检查构建文档中是否有任何类似的错误建议。此外,更改用于编译 Arrow 的 CMake 标志也可能会有帮助。
CMake 预设#
你也可以尝试使用 CMake 预设(presets)进行构建,它们是 Arrow CMake 的一组构建和测试方案。它们是非常有用的起点。
有关 CMake 预设的更详细信息,可以在 CMake 预设部分找到。
可选标志和环境变量#
在 CMake 构建中使用的标志用于包含额外的组件和处理第三方依赖。C++ 库的构建可以是最小化的,不使用任何标志,也可以通过添加 列表 中的可选组件来进行更改。
另请参阅
可选标志的完整列表:可选组件
R 和 Python 在各自的构建中有需要包含的特定标志列表。你可以在本节末尾找到相关链接。
总的来说,在 Python 方面,选项是通过 CMake 标志设置的,而路径是通过环境变量设置的。在 R 中,环境变量用于所有与构建相关的事情,也包括设置 CMake 标志。
构建其他 Arrow 库#
构建 Arrow C++ 库之后,你还需要在此基础上构建 PyArrow。原因相同:这样你就可以编辑代码,并在本地对编辑过的代码运行测试。
为什么我们必须分开构建?
如本页开头所述,Arrow 项目的 Python 部分是建立在 C++ 库之上的。为了能够在 Arrow 的 Python 部分和 C++ 部分都进行更改,你需要分别构建它们。
我们希望这个介绍足以帮助你开始构建过程。
当你对代码进行更改时,你可能需要重新编译 PyArrow 或 Arrow C++
重新编译 Cython
如果你只更改了 .py 文件,你不需要重新编译 PyArrow。但是,如果你更改了 .pyx 或 .pxd 文件,则应该重新编译它。
为此,请再次运行此命令
$ python setup.py build_ext --inplace
重新编译 C++
同样,如果你对任何 C++ 文件进行了更改,你也需要重新编译 C++ 代码。在这种情况下,请再次重新运行构建命令。
在处理 R 包中的代码时,根据你的操作系统和计划的更改,你可能需要也可能不需要从源码构建 Arrow C++ 库(在 R 文档中通常称为“libarrow”)。
关于此问题的更多信息以及设置 Arrow C++ 库和 Arrow R 包的完整说明,可以在 R 开发者文档中找到。
重新安装 R 包并运行‘make clean’
如果你对 Arrow C++ 部分的代码(也称为 libarrow)进行了更改,你需要
重新安装 libarrow,
运行
make clean,重新安装 R 包。
make clean 函数定义在 r/Makefile 中,它将删除 r/src/ 目录中的任何缓存对象代码,以确保你进行的是全新安装。Makefile 还包括 make test、make doc 等函数,它的添加是为了帮助在命令行中执行常见任务。
更多信息请参见 R 开发者环境设置文章中的故障排除部分。
从源码构建 vs. 使用二进制文件
使用二进制文件是使用最新发布版 Arrow 的一种快速简单的方法。然而,如果你使用这种方式,你将无法对 Arrow C++ 库进行更改。
注意
每种语言都有自己处理二进制文件的方式。要获取更多信息,请导航到你感兴趣的语言部分以查找更多信息。