如何从CMake“安装”Python代码?

问题描述 投票:4回答:1

我有一个主要的c ++项目,我使用CMake来管理。设置cmake_install_prefix并进行配置后,它会生成makefile,然后可以使用它来构建和安装非常标准的:

make
make install

在这一点上,我的二进制文件最终在cmake_install_prefix中,并且它们可以在没有额外工作的情况下执行。最近我在源树中的一些地方添加了一些Python脚本,其中一些依赖于其他地方。我可以使用CMake将Python文件+目录结构复制到cmake_install_prefix,但如果我进入该路径并尝试使用其中一个脚本,Python无法找到用作imports的其他脚本,因为PYTHONPATH不包含cmake_install_prefix。我知道你可以用CMake设置一个环境变量,但它不会在shell中持久存在,所以对于用户而言,它并不是真正“设置”超过当前的终端会话。

解决方案似乎是在软件构建说明中添加“设置您的PYTHONPATH”的步骤。有什么方法可以避免这种情况吗?这是“安装”Python脚本作为更大项目的一部分的标准做法吗?它似乎真的使诸如为项目设置持续集成之类的事情复杂化,因为像Jenkins这样的东西必须手动配置以注入环境变量,而它不需要特殊的构建和执行从c ++代码构建的可执行文件。

python jenkins cmake
1个回答
4
投票

Python提供了sys.path列表,该列表用于具有import指令的搜索模块。您可以在包含模块之前调整此列表:

script1.朋友:

# Do some things useful for other scripts

script2.朋友.in:

# Uses script1.py.
...
sys.path.insert(1, "@SCRIPT1_INSTALL_PATH@")
import script1
...

的CMakeLists.txt:

...
# Installation path for script1. Depends from CMAKE_INSTALL_PREFIX.
set(SCRIPT1_INSTALL_PATH ${CMAKE_INSTALL_PREFIX}/<...>)

install(FILES script1.py DESTINATION ${SCRIPT1_INSTALL_PATH}

# Configure 'sys.path' in script2.py, so it may find script1.py.
configure_file("script2.py.in" "script2.py" @ONLY)

set(SCRIPT2_INSTALL_PATH ${CMAKE_INSTALL_PREFIX}/<...>)
install(FILES script2.py DESTINATION ${SCRIPT2_INSTALL_PATH}
...

如果您希望script2.py在构建树和安装树中都能工作,则需要有两个实例,一个在构建树中工作,另一个在安装后工作。两个实例都可以从单个.in文件配置。


在编译的可执行文件和库的情况下,类似的机制用于帮助二进制文件在非标准位置中查找库。它被称为RPATH。

因为CMake

  • 知道创建的每个二进制文件(它跟踪add_executableadd_library调用),
  • 知道二进制文件之间的联系(target_link_libraries调用也被跟踪),
  • 完全控制链接程序,

安装二进制文件时,CMake能够自动调整RPATH。

在Python脚本的情况下,CMake没有这样的信息,因此应该手动执行调整链接路径。

© www.soinside.com 2019 - 2024. All rights reserved.