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

Vit*_*meo 8 caching cmake

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

  • 案例1:CACHE+FORCE

    set(CMAKE_CXX_FLAGS "myflags" CACHE STRING "" FORCE)
    
    Run Code Online (Sandbox Code Playgroud)
    • 第一次CMake运行: 按预期"myflags"显示在CMakeCache.txt文件中.
    • 命令行选项:命令行选项不覆盖"myflags"- 似乎FORCE比命令行-D...="..."参数具有更高的优先级.这是不希望的 - 我希望命令行参数覆盖"myflags".

  • 案例2:仅限 CACHE

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

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

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

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

如果我使用FORCE,用户不能通过命令行覆盖它.

如果我不使用FORCE,"myflags"在第一次运行期间不会写入缓存文件.

Pet*_*ter 12

这与文档中解释的行为一致:

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

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

  • 如何为自定义CXX标志使用不同的变量(例如`MYFLAGS`)并合并它SET(CMAKE_CXX_FLAGS"$ {CMAKE_CXX_FLAGS} $ {MYFLAGS}"`? (4认同)