pixi-build-cmake#
pixi-build-cmake 后端专为使用 CMake 构建系统构建 C 和 C++ 项目而设计。它提供与 Pixi 包管理工作流程的无缝集成,同时保持跨平台兼容性。
Warning
pixi-build 是一个预览功能,在稳定之前可能会发生变化。
这就是为什么我们要求用户通过将 "pixi-build" 添加到 workspace.preview 来选择加入该功能。
概述#
此后端通过以下方式自动从基于 CMake 的项目生成 conda 包:
- 检测和配置编译器:自动为目标平台包含适当的 C/C++ 编译器
- 使用 Ninja 构建:使用快速的 Ninja 构建系统以获得最佳构建性能
- 跨平台支持:在 Linux、macOS 和 Windows 上一致地工作
- 标准 CMake 工作流程:遵循 CMake 最佳实践和合理的默认值
基本用法#
要在您的 pixi.toml 中使用 CMake 后端,请将其添加到包的构建配置中:
[package]
name = "cmake_package"
version = "0.1.0"
[package.build]
backend = { name = "pixi-build-cmake", version = "*" }
channels = [
"https://prefix.dev/conda-forge",
]
必需依赖项#
后端自动包含以下构建工具:
cmake- CMake 构建系统ninja- CMake 使用的快速构建系统- 平台特定的 C++ 编译器(例如
gcc_linux-64、clang_osx-64)
如果您需要特定版本,可以将它们添加到您的build-dependencies中:
配置选项#
您可以使用 pixi.toml 中的 [package.build.config] 部分自定义 CMake 后端行为。后端支持以下配置选项:
extra-args#
- 类型:
Array<String> - 默认值:
[] - 目标合并行为:
Overwrite- 平台特定参数完全替换基础参数
传递给 CMake 配置步骤的额外命令行参数。这些参数被插入到配置项目的 cmake 命令中。
对于特定于目标的配置,平台参数完全替换基础配置:
[package.build.config]
extra-args = ["-DCMAKE_BUILD_TYPE=Release"]
[package.build.target.linux-64.config]
extra-args = ["-DCMAKE_BUILD_TYPE=Debug", "-DLINUX_FLAG=ON"]
# linux-64 的结果: ["-DCMAKE_BUILD_TYPE=Debug", "-DLINUX_FLAG=ON"]
env#
- 类型:
Map<String, String> - 默认值:
{} - 目标合并行为:
Merge- 平台环境变量用相同名称覆盖基础变量,其他变量合并
构建过程中设置的环境变量。这些变量在 CMake 配置和构建步骤中都可用。
对于特定于目标的配置,平台环境变量与基础变量合并:
[package.build.config]
env = { CMAKE_VERBOSE_MAKEFILE = "OFF", COMMON_VAR = "base" }
[package.build.target.linux-64.config]
env = { COMMON_VAR = "linux", LINUX_VAR = "value" }
# linux-64 的结果: { CMAKE_VERBOSE_MAKEFILE = "OFF", COMMON_VAR = "linux", LINUX_VAR = "value" }
debug-dir#
后端始终将 JSON-RPC 请求/响应日志和生成的中间食谱写入每个工作目录内的 debug 子目录(例如 <work_directory>/debug)。已弃用的 debug-dir 配置选项将被忽略;如果它在清单中存在,则会发出警告。
extra-input-globs#
- 类型:
Array<String> - 默认值:
[] - 目标合并行为:
Overwrite- 平台特定 glob 完全替换基础 glob
作为构建过程的输入文件包含的额外 glob 模式。这些模式被添加到默认输入 glob 中,包括源文件(**/*.{c,cc,cxx,cpp,h,hpp,hxx})、CMake 文件(**/*.{cmake,cmake.in}, **/CMakeFiles.txt})和其他构建相关文件。
对于特定于目标的配置,平台特定的 glob 完全替换基础:
[package.build.config]
extra-input-globs = ["*.txt"]
[package.build.target.linux-64.config]
extra-input-globs = ["*.txt", "*.linux", "linux-configs/**/*"]
# linux-64 的结果: ["*.txt", "*.linux", "linux-configs/**/*"]
compilers#
- 类型:
Array<String> - 默认值:
["cxx"] - 目标合并行为:
Overwrite- 平台特定编译器完全替换基础编译器
用于构建的编译器列表。后端使用 conda-forge 的编译器基础设施自动生成适当的编译器依赖项。
对于特定于目标的配置,平台编译器完全替换基础配置:
[package.build.config]
compilers = ["cxx"]
[package.build.target.linux-64.config]
compilers = ["c", "cxx", "cuda"]
# linux-64 的结果: ["c", "cxx", "cuda"]
综合编译器文档
有关可用编译器、平台特定行为以及 conda-forge 编译器工作原理的详细信息,请参阅编译器文档。
构建流程#
CMake 后端遵循以下构建流程:
- 版本检测:显示 CMake 和 Ninja 版本以进行诊断
- 配置:使用以下默认选项运行
cmake:-GNinja:使用 Ninja 生成器-DCMAKE_BUILD_TYPE=Release:默认发布构建-DCMAKE_INSTALL_PREFIX=$PREFIX:安装到 conda 前缀(prefix)-DCMAKE_EXPORT_COMPILE_COMMANDS=ON:导出编译命令以供工具使用-DBUILD_SHARED_LIBS=ON:默认构建共享库-DPython_EXECUTABLE=$PYTHON:如果它是 host 依赖项的一部分,则使用 conda Python 可执行文件
- 构建:执行
cmake --build来编译项目 - 安装:将构建的工件安装到 conda 包中
CMake 标志优先级#
使用 CMake 时,如果提供重复标志,最后一个标志优先。
pixi-build-cmake 后端将 extra-args 放在默认 CMake 标志之后,允许您覆盖默认设置。
例如,要从默认的 Release 构建切换到 Debug 模式:
默认变体#
在 Windows 平台上,后端自动设置以下默认变体:
c_compiler:vs2022- Visual Studio 2022 C 编译器cxx_compiler:vs2022- Visual Studio 2022 C++ 编译器
这些变体在您指定[package.build.config.compilers]配置中的编译器时使用。
默认情况下只会安装 cxx_compiler,设置 c_compiler 是为了在您添加该编译器时提供帮助。
设置此默认值是为了与 conda-forge 切换到 Visual Studio 2022 保持一致,因为主流支持 Visual Studio 2019 已 于 2024 年结束。
vs2022 编译器在现代 GitHub 运行器和构建环境中得到更广泛的支持。
您可以通过在 pixi.toml 中使用[workspace.build-variants]显式设置变体来覆盖这些默认值:
限制#
- 目前,假设是 C++ 项目(硬编码为
cxx语言) - 尚未实现从 CMakeLists.txt 检测语言