如何通过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
相关产品推荐
相关产品推荐

