在 CMake 中缓存 execute_process 的结果
Cache result of execute_process in CMake
作为项目配置过程的一部分,我需要使用 execute_process
查询命令行工具,以检索其余流程所需的变量。此查询的输入取决于配置选项。
execute_process
调用的特定命令恰好相当昂贵,因此我想避免重新运行 除非输入已更改。
如何“缓存”execute_process
的结果,以便仅在某个 CMake 选项更改时才重新运行(即,而不是每当 anything 会触发 CMake 再次 运行 的更改)?
示例代码:
set(MY_INPUT_VARIABLE "my_default" CACHE STRING "Used by command line tool.")
# This should only be re-run if MY_INPUT_VARIABLE changed since last time it was run
execute_process(COMMAND slow_executable ${MY_INPUT_VARIABLE} OUTPUT_VARIABLE RESULT)
将值复制到 INTERNAL
缓存变量并将其与缓存变量的当前版本进行比较。
set(MY_INPUT_VARIABLE "my_default" CACHE STRING "Used by command line tool.")
set(MY_INPUT_VARIABLE_INTERNAL "" CACHE INTERNAL "for internal use only; do not modify")
if (NOT MY_INPUT_VARIABLE STREQUAL MY_INPUT_VARIABLE_INTERNAL)
execute_process(COMMAND slow_executable ${MY_INPUT_VARIABLE} OUTPUT_VARIABLE RESULT)
set(MY_INPUT_VARIABLE_INTERNAL ${MY_INPUT_VARIABLE} CACHE INTERNAL "for internal use only; do not modify")
endif()
请注意,您也可以使用不同类型的缓存变量,但需要使用 FORCE
来覆盖该值。除此之外,cmake-gui 还会显示这样的缓存变量。
作为项目配置过程的一部分,我需要使用 execute_process
查询命令行工具,以检索其余流程所需的变量。此查询的输入取决于配置选项。
execute_process
调用的特定命令恰好相当昂贵,因此我想避免重新运行 除非输入已更改。
如何“缓存”execute_process
的结果,以便仅在某个 CMake 选项更改时才重新运行(即,而不是每当 anything 会触发 CMake 再次 运行 的更改)?
示例代码:
set(MY_INPUT_VARIABLE "my_default" CACHE STRING "Used by command line tool.")
# This should only be re-run if MY_INPUT_VARIABLE changed since last time it was run
execute_process(COMMAND slow_executable ${MY_INPUT_VARIABLE} OUTPUT_VARIABLE RESULT)
将值复制到 INTERNAL
缓存变量并将其与缓存变量的当前版本进行比较。
set(MY_INPUT_VARIABLE "my_default" CACHE STRING "Used by command line tool.")
set(MY_INPUT_VARIABLE_INTERNAL "" CACHE INTERNAL "for internal use only; do not modify")
if (NOT MY_INPUT_VARIABLE STREQUAL MY_INPUT_VARIABLE_INTERNAL)
execute_process(COMMAND slow_executable ${MY_INPUT_VARIABLE} OUTPUT_VARIABLE RESULT)
set(MY_INPUT_VARIABLE_INTERNAL ${MY_INPUT_VARIABLE} CACHE INTERNAL "for internal use only; do not modify")
endif()
请注意,您也可以使用不同类型的缓存变量,但需要使用 FORCE
来覆盖该值。除此之外,cmake-gui 还会显示这样的缓存变量。