cmake更新缓存变量

时间:2018-10-30 23:25:54

标签: c++ cmake

我使用cmake变量CMAKE_BUILD_CONFIG指定要编译的仓库中的哪些模块,就像在命令行上一样。

cmake -DCMAKE_BUILD_CONFIG=A ..

然后像这样... CMAKE_BUILD_CONFIGCMakeLists.txt文件中使用...

if(CMAKE_BUILD_CONFIG STREQUAL A)
message(STATUS "Compiling only config A modules")
set(MODULES
    foo1        
    foo2
)
elseif(CMAKE_BUILD_CONFIG STREQUAL B)
message(STATUS "Compiling only config B modules")
set(MODULES
    foo3
)
endif()

因此,现在我第一次运行cmake -DCMAKE_BUILD_CONFIG=A ..(或B),效果很好。但是在那之后,似乎CMAKE_BUILD_CONFIG已保存在CMakeCache.txt中,并且如果我呼叫cmake -DCMAKE_BUILD_CONFIG=B ..也不会更新。

在寻找解决方案时,我发现了一个unset(CMAKE_BUILD_CONFIG CACHE)调用,并将其添加到CMakeLists.txt的末尾,但这并不能解决问题。

谢谢

2 个答案:

答案 0 :(得分:1)

  

但是,此后似乎已将CMAKE_BUILD_CONFIG保存在   CMakeCache.txt,如果我调用cmake则不会更新   -DCMAKE_BUILD_CONFIG = B ...

这应该可以正常工作(已在CMake 2.8.12及更高版本中测试)。

引用CMake documentation(强调我的意思):

  

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

     

创建或更新 cmake缓存条目。

您可以轻松地用一个小的测试脚本来验证它是否可以工作:

cmake_minimum_required(VERSION 3.0)
project(cmake_tester CXX)

message("Module Config is " ${CMAKE_BUILD_CONFIG})

然后使用-D的不同参数运行cmake更改缓存值:

$ cmake -DCMAKE_BUILD_CONFIG=Foo ..
Module Config is Foo
-- Configuring done
$ cmake ..
Module Config is Foo
-- Configuring done
$ cmake -DCMAKE_BUILD_CONFIG=Bar ..
Module Config is Bar
-- Configuring done

如果这对您不起作用,则意味着您的构建脚本正在执行您没有告诉我们的事情,从而积极地阻止了该工作。

答案 1 :(得分:0)

这不是最好的解决方案,但是虽然没有更好的解决方案:

您可以删除CMakeCache.txt以防止出现此问题。我建议从当前文件夹中移出CMakeCache.txt,运行“ cmake”和“ make”,然后检查其是否有效。