只运行cmake函数或add_custom_command一次



我有一个丑陋的解决方案,可以将.dlls复制到使用add_custom_command的bin文件夹中。它有效,但在并行构建中,我有时会得到

从复制目录时出错

我的猜测(我不知道,因为CMake不会告诉我什么失败了(是因为对复制的调用是同时完成的,所以会发生文件系统错误。

cmake中是否有一种方法可以指定只运行函数或add_custom_command的第一次调用?

如果重要的话,这是我的复制dll逻辑(每个需要这些dll的目标都以自身为参数调用函数(:

function(copyBla projectName)
add_custom_command(TARGET ${projectName} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory ${SDK_PATH}/Bla/${BLA_VERSION}/x64/bin ${CMAKE_BINARY_DIR}/bin/$<CONFIGURATION>)
endfunction()

p.S。我不想把自己限制在一个调用copyBla的目标上,因为这是脆弱的(其他目标依赖于这个目标,只是因为它们想使用相同的dll(。

我认为他们在3.21 中很好地解决了这个问题

$<TARGET_RUNTIME_DLLS:tgt>3.21版本中的新增功能。

目标在运行时依赖的DLL列表。这是由目标的传递依赖关系中所有SHARED和MODULE目标的位置决定的。在可执行文件、SHARED库和MODULE库以外的目标上使用此生成器表达式是错误的。在非DLL平台上,它的计算结果为空字符串。

此生成器表达式可用于在POST_BUILD自定义命令中将目标所依赖的所有DLL复制到其输出目录中。例如:

find_package(foo CONFIG REQUIRED) # package generated by install(EXPORT)
add_executable(exe main.c)
target_link_libraries(exe PRIVATE foo::foo foo::bar)
add_custom_command(TARGET exe POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_RUNTIME_DLLS:exe> $<TARGET_FILE_DIR:exe>
COMMAND_EXPAND_LISTS
)

注意:只有当导入的目标知道其.dll文件的位置时,才支持导入的目标。导入的SHARED或MODULE库必须将imported_LOCATION设置为其.dll文件。有关详细信息,请参阅add_library imported libraries部分。许多"查找模块"会生成UNKNOWN类型的导入目标,因此将被忽略。

按要求链接到文档

最新更新