对CMake缓存变量设置优先级感到困惑

时间:2014-10-01 16:16:22

标签: caching cmake

我对CMake的缓存变量感到困惑:

  • 案例1:CACHE + FORCE

    set(CMAKE_CXX_FLAGS "myflags" CACHE STRING "" FORCE)
    
    • 第一次CMake运行: "myflags"按预期显示在CMakeCache.txt文件中。
    • 命令行选项:命令行选项不会覆盖"myflags" - 似乎FORCE的优先级高于命令行-D...="..."参数。这不是我们想要的 - 我希望命令行参数覆盖"myflags"

  • 案例2:仅CACHE

    set(CMAKE_CXX_FLAGS "myflags" CACHE STRING "")
    
    • 第一次CMake运行 CMakeCache.txt文件中没有任何内容。我希望第一次出现"myflags"
    • 命令行选项:命令行的优先级高于"myflags"

我的结论是否正确?或者做"默认变量"例如CMAKE_CXX_FLAGS表现不同?

有没有办法在第一次CMake运行期间({CM}以前没有在此文件夹中运行)在"myflags"文件中写入CMakeCache.txt

我希望在缓存中的第一次CMake运行期间设置"myflags",然后允许用户使用命令行覆盖它。

如果我使用FORCE,则用户无法通过命令行覆盖它。

如果我不使用FORCE,则在首次运行期间,"myflags"不会写入缓存文件。

1 个答案:

答案 0 :(得分:12)

这与documentation

中解释的行为一致
  

通常,set(... CACHE ...)会创建缓存变量,但不会修改它们。如果指定了FORCE,则设置缓存变量的值,即使该变量已在缓存中。通常应该避免这种情况,因为它将删除用户对缓存变量值的任何更改。

即使在CMakeLists.txt中没有CMAKE_CXX_FLAGS

set(CMAKE_CXX_FLAGS ... CACHE ...)也存在于缓存中,因为在编译器标志初始化期间已经设置了CMAKE_CXX_FLAGS变量。