我有一个主要的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提供了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_executable
和add_library
调用),target_link_libraries
调用也被跟踪),安装二进制文件时,CMake能够自动调整RPATH。
在Python脚本的情况下,CMake没有这样的信息,因此应该手动执行调整链接路径。