首页 > 解决方案 > cmake函数的并行执行?

问题描述

在大型项目上运行 cmake 时,它​​可以并行调用给定的 cmake 函数吗?

我担心的是,当这个(用户定义的)函数在缓存中存储一​​些东西时,它会与并行执行发生冲突;当函数确实是并行执行时,cmake 如何处理这个问题,或者我是否必须确保即使对同一函数的调用也永远不会使用具有不同值的相同(缓存)变量名?

编辑(见评论):

我写了以下函数,

function(CW_SYS_CACHELINE_SIZE)
  if (NOT DEFINED CACHE{cw_cv_sys_cacheline_size})
    set(CMAKE_TRY_COMPILE_CONFIGURATION "Release")
    try_run(RUN_WORKS
            COMPILE_WORKS
            ${CMAKE_CURRENT_BINARY_DIR}/cw_utils_sys_cacheline_size
            ${CW_SYS_CACHELINE_SIZE_MODULE_PATH}/CW_SYS_CACHELINE_SIZE.c
            COMPILE_OUTPUT_VARIABLE COMPILE_OUTPUT
            RUN_OUTPUT_VARIABLE RUN_OUTPUT)
    if (NOT COMPILE_WORKS)
      message(FATAL_ERROR "Failed to compile test program 
CW_SYS_CACHELINE_SIZE.c: ${COMPILE_OUTPUT}")
    elseif (NOT RUN_WORKS EQUAL 0)
      message(FATAL_ERROR "Failed to run test program CW_SYS_CACHELINE_SIZE.c: ${RUN_OUTPUT}")
    else ()
      set(cw_cv_sys_cacheline_size ${RUN_OUTPUT} CACHE INTERNAL "")
    endif ()
  endif()
endfunction()

由于此函数不带参数,因此每次使用的变量的内部值都应相同;但我还有其他非常相似的函数,它们做的事情几乎完全相同,只是它们编译和测试不同的.c文件。

因此,这些函数中的每一个都可以具有不同的 值RUN_WORKS,它(事实证明)作为 写入缓存INTERNAL。假设我没有终止程序,而是用RUN_WORKS这里的值做其他事情。然后可能是我首先运行这个函数,RUN_WORKS它是真的,然后运行另一个设置RUN_WORKS为假的函数。

如果然后我再次运行 cmake(或无意中再次调用第一个函数),那么它无法知道RUN_WORKS缓存中的当前值是否与之前运行的 THIS 函数(和/或相同的参数)有关,如果有的话)。因此,它不能使用缓存变量的值。但是 - cmake正在缓存它。这让我很担心;如果它不打算以后重用它的值,它为什么要缓存任何东西?如果不考虑这些变量,我会感觉好多了。

所以,我的理由是:如果有任何东西被缓存(INTERNAL或没有),我必须确保它是 100% 唯一的(也就是说,cmake 总是将相同的值写入同一个变量,否则缓存就没有意义它首先)。但是如何使用这个RUN_WORKS变量来做到这一点?我只是对如何编写这样的安全代码感到非常困惑:/

标签: cmake

解决方案


...它可以并行调用给定的 CMake 函数吗?

不, CMake 的配置阶段,当它处理CMakeLists.txt和执行其功能时,是严格按顺序执行的。

只有编译阶段,当编译库和可执行文件并执行命令(in add_custom_command/ add_custom_target)时,可以并行执行。

此外,在构建阶段,CMake 根本没有运行:这个阶段由构建工具控制,被选为CMake的生成器。


推荐阅读