使用 rattler-build 进行高级构建
Advanced Building Using rattler-build
本教程将向您展示如何使用 rattler-build 构建与构建 C++ 包教程中相同的 C++ 包。
本教程假设您已经阅读了构建 C++ 包教程。
如果您还没有阅读,建议您先阅读后再继续。
您可能还想查看 pixi-build-rattler-build 后端的文档。
项目结构和源代码与上一个教程相同,因此我们可以跳过对某些部分的详细解释。
当您的语言或构建系统不存在构建后端时,这可能很有用。 另一个原因是当您想对构建过程有更多控制时。
为了说明这一点,我们将使用与上一个教程相同的 C++ 包,但这次我们将使用 rattler-build 来构建它。
这将揭示构建过程中隐藏的复杂性,并帮助您更好地理解后端的工作原理。
Warning
pixi-build 是一个预览功能,在稳定之前可能会发生变化。
请在为您的工作区(workspace)使用它时牢记这一点。
Hint
如果存在后端,请优先使用它。这将为您提供更精简和统一的构建体验。
工作区(workspace)结构#
首先,请重现上一个教程构建 C++ 包中的工作区(workspace)结构。
pixi.toml 文件#
我们现在使用 pixi-build-rattler-build 后端而不是 pixi-build-cmake 后端。
[workspace]
channels = ["https://prefix.dev/conda-forge"]
platforms = ["osx-arm64", "osx-64", "linux-64", "win-64"]
preview = ["pixi-build"]
[dependencies]
cpp_math = { path = "." }
python = "3.12.*"
[tasks]
start = "python -c 'import cpp_math as b; print(b.add(1, 2))'"
[package]
name = "cpp_math"
version = "0.1.0"
[package.build]
backend = { name = "pixi-build-rattler-build", version = "0.*" }
recipe.yaml 文件#
接下来让我们添加描述 rattler-build 如何构建包的 recipe.yaml 文件。
您可以在 rattler-build 文档网页上找到参考。
package:
name: cpp_math
version: 0.1.0
source:
path: .
use_gitignore: true # (1)!
build:
number: 0
script: | # (2)!
cmake $CMAKE_ARGS \
-GNinja \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=$PREFIX \
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
-DBUILD_SHARED_LIBS=ON \
-B $SRC_DIR/../build \
-S .
cmake --build $SRC_DIR/../build --target install
requirements:
build: # (3)!
- ${{ compiler('cxx') }}
- cmake
- ninja
host: # (4)!
- python 3.12.*
- nanobind
- 因为我们指定当前目录作为源目录,
rattler-build可能会跳过未被 git 跟踪的文件。如果您的文件已经被 git 跟踪,您可以删除此配置。 - 此构建脚本使用
Ninja构建系统配置和构建CMake项目。它设置各种选项,如构建类型为Release、安装前缀为$PREFIX、启用共享库和导出编译命令。然后在指定构建目录($SRC_DIR/../build)中构建项目,并将构建的文件安装到安装目录。 - 对于构建依赖项,我们需要编译器以及构建系统
cmake和ninja。确保cmake版本与CMakeLists.txt文件中的版本匹配。 - 对于
python绑定,我们需要nanobind和python本身。它们被设置在host依赖部分,因为我们链接到安装绑定的python,而不是构建它。
测试一切是否正常#
现在我们已经定义了一个 pixi 任务,允许我们检查我们的包是否可以正确地加 1 和 2:
执行任务按预期工作
此命令构建绑定,安装它们,然后运行 test 任务。
结论#
在本教程中,我们使用 rattler-build 和 recipe.yaml 文件创建了一个 Pixi 包。
使用这种方法,我们对构建过程有更多控制。
例如,我们可以使用 CMAKE_BUILD_TYPE 将构建类型更改为 Debug,通过移除 -GNinja 配置使用 Make 而不是 Ninja。
或者我们可以使用 make -j$(nproc) 来指定构建包时并行运行的作业数。
同时,我们失去了语言构建后端所做的大量繁重工作的好处。
感谢阅读!快乐编程 🚀
有任何问题?请随时在 X 上联系或分享本教程,加入我们的 Discord,发送电子邮件给我们或关注我们的 GitHub。