在大型项目上运行 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
变量来做到这一点呢?我只是对如何编写这样的安全代码感到非常困惑:/
归档时间: |
|
查看次数: |
1225 次 |
最近记录: |