【问题标题】:running cmake commands in python script在 python 脚本中运行 cmake 命令
【发布时间】:2017-03-08 13:04:45
【问题描述】:

是否可以在 python 脚本中运行 cmake 命令?我想设置我通过python代码手动安装和编译的boost库。我希望通过python脚本发生set(BOOST_INCLUDEDIR "/path/to/boost/include")之类的事情。因此,在运行 cmake 之前,我希望通过 python 代码设置 cmake 变量。

【问题讨论】:

  • 有点不清楚您要达到的目标。你想启动 Python 作为 CMake 处理 CMakeLists.txt 的一部分,并让 Python 以某种方式在当前运行的 CMake 中设置 CMake 变量吗?
  • 不,在运行cmake之前我想通过python脚本设置cmake变量。
  • 你能edit你的问题更明显吗?

标签: python python-2.7 boost cmake


【解决方案1】:

在 CMake 处理开始之前有两种方法可以预初始化 CMake 变量,都使用command-line arguments of 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 脚本中使用其中一种或两种方法取决于您的特定设置。

【讨论】:

    【解决方案2】:

    是的

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

    通过从命令行设置 cmake 缓存变量。从命令行定义它的语法如下here

    -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)
    

    【讨论】:

    • 选项 2a) 使用 -C my_cache.cmake 运行 CMake 以预加载生成的文件以填充缓存。
    【解决方案3】:

    一些 CMake 的 find modules 确实支持从环境变量中读取路径提示:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-10
      相关资源
      最近更新 更多