在CMakeLists文件中指定未缓存的编译时常量

dba5bblo  于 2022-11-11  发布在  其他
关注(0)|答案(1)|浏览(134)

在我的一个CMakeList文件中,我指定了一个选项,该选项在生成的头文件中有条件地定义了一个编译时常量。
这导致了一个无意的行为,每次我改变选项并发出cmake .时,我都需要删除cmake缓存。目前这是唯一使用的选项。以后我想使用更多的选项。
由于缓存机制的原因,CMakeLists.txt并不代表实际的构建设置,这真的让我很困惑。例如,在CMakeLists.txt中设置了一个 * 构建标志 *,但该高速缓存中仍然没有设置。
我不想禁用缓存,我只是希望我的构建总是与CMakeLists.txt中设置的 build flag 同步。我知道cmake的缓存机制在大型构建过程中节省了大量时间。这实际上很好。

  • 是否存在某些方法可以强制cmake .上的选项保持最新?*

我尝试将option转换为set指令。cmake仍然使用缓存的值而不是实际的值。
我做错了什么?
下面是我的CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(Test VERSION 1.0)
option(MY_BUILD_FLAG "bla" OFF)
configure_file(TestConfig.h.in TestConfig.h)

以下是我尝试但未成功的更改:

cmake_minimum_required(VERSION 3.10)
project(Test VERSION 1.0)

# Here you can set several build flags ON or OFF

set(MY_BUILD_FLAG "bla" OFF)
configure_file(TestConfig.h.in TestConfig.h)
e3bfsja2

e3bfsja21#

我知道cmake的缓存机制在大型构建过程中节省了大量时间。
这是不正确的。cmake缓存变量的用途是在信息之间持久保存变量,以便随后重新配置相同的生成目录。
事实上,例如.o文件保留在构建目录中,除非显式清除,否则不会重建,如果编译它的源代码是一个完全不同的机制。
请注意,实际上您可能会看到CMake配置时间的改进,因为try_compile的结果被缓存。如果您经常重写cmake文件,并因此在实际构建开始之前触发项目的自动cmake重新配置,这实际上可能会导致构建时间的明显改进。但是,如果您不更改cmake逻辑,使用CMake缓存变量根本不会缩短构建时间(或者有条件地应用其他逻辑会导致编译器或链接器工作量不同)。
注:缓存变量的另一个值得注意的用途是向用户提供项目配置选项。我不详细说明这一点,因为这不会影响构建时间,而没有额外的CMake逻辑依赖于影响要构建的代码量的值。

相关问题