在Python脚本中运行cmake命令

3

在Python脚本中运行cmake命令是否可行?我想通过Python代码设置手动安装和编译的boost库。我希望有像set(BOOST_INCLUDEDIR "/path/to/boost/include")这样的内容在Python脚本中实现。因此,在运行cmake之前,我希望通过Python代码设置cmake变量。


你的意图有点不太清楚。你想在CMake处理CMakeLists.txt时启动Python,并让Python以某种方式设置当前正在运行的CMake中的变量吗? - Angew is no longer proud of SO
不,运行cmake之前,我想通过Python脚本设置cmake变量。 - abhay gurrala
1
你能否编辑你的问题,以使它更明显? - Angew is no longer proud of SO
3个回答

2
有两种在 CMake 处理开始之前进行预初始化 CMake 变量的方式,都使用 命令行参数 cmake
其中简单的方法是使用 -D 命令行选项将一个或多个变量传递给 CMake。例如:
cmake -DBOOST_INCLUDEDIR:PATH="/path/to/boost/include" ...

另一个选项是创建一个“初始缓存文件”(基本上是一个只包含set(...) CMake命令的文件),并使用-C将该初始缓存文件传递给CMake:
echo 'set(BOOST_INCLUDEDIR "/path/to/boost/include" CACHE PATH "")' > initial_cache.cmake
cmake -C initial_cache.cmake ...

该选项旨在用于第一次使用给定二进制目录运行CMake,即在其创建自己的CMakeCache.txt文件之前。
如何从您的Python脚本中利用其中一个或两个取决于您的特定设置。

1

是的

选项1(如果您通过Python调用cmake)

通过从命令行设置cmake缓存变量。从命令行定义此变量的语法如下:这里

-D <var>:<type>=<value>

在您的情况下,在cmake列表文件中。
set(BOOST_INCLUDEDIR MY_BOOST_INCLUDE)

当调用cmake时,只需覆盖该选项即可。

cmake -DMY_BOOST_INCLUDE:STRING="/path/to/wherever"

选项2(如果您想在其他时间调用cmake)

您可以使用Python创建一个cmake模块,以设置所需的定义。例如,可以创建一个Python脚本,将任何缓存变量填充到my_module.cmake中,即:

set(MY_BOOST_INCLUDE "script/generated/path")
#... other stuff you want to define

然后在你的静态CMake列表文件中。
include(my_module)

1
选项2a)使用“-C my_cache.cmake”运行CMake,以预加载生成的文件以填充缓存。 - zaufi

0

CMake的查找模块中的一些支持从环境变量中读取路径提示:

  • "用户可以将这些提示或结果设置为缓存条目。[...] 如果它们没有被指定为CMake变量或缓存条目,则可以将其指定为环境变量。"

  • 我更喜欢使用这种设置查找模块目录的方法,因为我也可以在系统级别上设置它,而不必再为每个CMake项目提供自定义构建库的路径。

  • FindBoost.cmake是一个很好的例子,因为它提供了各种环境变量:

    Boost_DIR
    BOOSTROOT 
    BOOST_ROOT 
    BOOST_INCLUDEDIR 
    BOOST_LIBRARYDIR
    
  • 注意:这些被认为是“提示”,因为一旦被找到,它们不会覆盖任何CMake缓存值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接