You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过pyproject.toml+scikit-build-core向CMake传递绝对路径?

解决方案

1. 在CMakeLists.txt中直接生成绝对路径

绕过pyproject.toml的路径限制,在CMake层面处理路径转换是最可靠的方式:

  • 利用CMake内置变量CMAKE_CURRENT_SOURCE_DIR获取项目根目录的绝对路径
  • 用该路径拼接依赖库的相对路径,生成链接器需要的绝对路径

示例代码:

# 获取项目根目录的绝对路径
set(PROJECT_ROOT ${CMAKE_CURRENT_SOURCE_DIR})

# 拼接MUMPS及其依赖库的绝对路径
set(MUMPS_DEP_DIR "${PROJECT_ROOT}/deps/mumps")
set(BLAS_LIB "${MUMPS_DEP_DIR}/lib/libblas.a")
set(LAPACK_LIB "${MUMPS_DEP_DIR}/lib/liblapack.a")
set(MUMPS_LIB "${MUMPS_DEP_DIR}/lib/libmumps.a")

# 链接时使用绝对路径
target_link_libraries(unopy PRIVATE ${BLAS_LIB} ${LAPACK_LIB} ${MUMPS_LIB})

2. 基于CMake find_package管理依赖

如果MUMPS预编译包支持标准CMake配置,或你愿意自定义查找模块,可以简化流程:

  • 将MUMPS及其依赖放在固定子目录(如deps/mumps)
  • 在CMakeLists.txt中设置CMAKE_PREFIX_PATH指向该目录,让find_package能定位到预编译库
  • 若无现成配置文件,编写FindMUMPS.cmake模块,在模块内部完成路径转换

示例配置:

set(CMAKE_PREFIX_PATH "${CMAKE_CURRENT_SOURCE_DIR}/deps/mumps" ${CMAKE_PREFIX_PATH})
find_package(MUMPS REQUIRED)
target_link_libraries(unopy PRIVATE MUMPS::MUMPS)

3. 配合pyproject.toml传递基础路径标识

虽然scikit-build-core无法展开环境变量,但可以通过cmake.define传递基础路径参数,再在CMake中拼接:

  • 在pyproject.toml中添加:
    [tool.scikit-build.cmake.define]
    DEPS_BASE_DIR = "deps"
    
  • 然后在CMakeLists.txt中生成绝对路径:
    set(MUMPS_LIB_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${DEPS_BASE_DIR}/mumps/lib")
    set(BLAS_LIB "${MUMPS_LIB_PATH}/libblas.a")
    # 后续链接逻辑同上
    

4. 确保SDist包含依赖库

要让方案兼容SDists,需在MANIFEST.in中声明依赖库路径,确保打包时将预编译静态库纳入:

include deps/mumps/lib/*.a
include deps/mumps/include/*.h

这样用户安装SDist时,依赖库会被正确复制到安装目录,CMake能通过项目根目录定位到绝对路径。

内容的提问来源于stack exchange,提问作者Charlie Vanaret - the Uno guy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 21:42:38