cmake函数的并行执行?

Car*_*ood 1 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()
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Tsy*_*rev 5

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

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

只有构建阶段,即编译库和可执行文件并执行命令(在add_custom_command/中add_custom_target)时可以并行执行。

此外,在构建阶段,CMake 根本不运行:此阶段由构建工具控制,选择作为CMake 的生成器