2017-03-08 198 views
2

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

+0

这是有点不清楚你想达到什么。你是否希望启动Python作为CMake处理你的'CMakeLists.txt'的一部分,并让Python以某种方式在当前运行的CMake中设置CMake变量? – Angew

+0

不,在运行'cmake'之前我想通过python脚本设置cmake变量。 –

+1

你可以[编辑]你的问题,使其更明显? – Angew

回答

0

在CMake处理开始之前,有两种方法可以预先初始化CMake变量,都使用command-line arguments of cmake

简单的方法是使用-D命令行选项将一个或多个变量传递给CMake。是这样的:

cmake -DBOOST_INCLUDEDIR:PATH="/path/to/boost/include" ... 

另一种选择是使用-C创建“初始缓存文件”(基本上只包含set(...) CMake的命令的文件),并通过该初始高速缓存文件的CMake:

echo 'set(BOOST_INCLUDEDIR "/path/to/boost/include" CACHE PATH "")' > initial_cache.cmake 
cmake -C initial_cache.cmake ... 

这个选项是用于第一次使用CMake时运行一个给定的二进制目录,即之前它创建它自己的CMakeCache.txt文件。

如何利用Python脚本中的一个或两个脚本取决于您的特定设置。

0

选项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) 
+1

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

0

一些的CMake的find modules做支持读取路径,从环境的暗示变量:

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

  • 我喜欢设置查找模块目录的这个方法,因为它的东西,我也可以设置系统级和我没有给我的CMake的每一个项目的路径,以我的自定义建库了。

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

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