在CMake构建中等待目标

在CMake构建中等待目标,cmake,build,ninja,Cmake,Build,Ninja,我想我确实有一个CMake顺序/并行性问题 在我的构建过程中,我需要构建一个工具,然后由其他目标使用。此工具是一个单独的项目,其CMakeLists.txt文件如下: project (package-tool LANGUAGES CXX) set (SOURCES package_tool.cpp) ... 在构建的后期,此顶级目标被其他目标引用: ... add_custom_command (OUTPUT "${DST_FILE}"

我想我确实有一个CMake顺序/并行性问题

在我的构建过程中,我需要构建一个工具,然后由其他目标使用。此工具是一个单独的项目,其CMakeLists.txt文件如下:

project (package-tool LANGUAGES CXX)
set (SOURCES package_tool.cpp)
...
在构建的后期,此顶级目标被其他目标引用:

...
add_custom_command (OUTPUT "${DST_FILE}"
                            COMMAND ${PACKAGE_COMMAND} "${DST_FILE}"
                            COMMAND package-tool.exe -e "${DST_FILE}"
                            DEPENDS ${PACKAGE_DEPENDENCIES} package-tool)
...
我使用ninja进行构建,并且依赖项(ninja-t依赖项)看起来是正确的。此外,构建命令(忍者-t命令)也很有意义。但是:构建有时会失败。这条消息毫无意义,它写道:

此版本的package-tool.exe与此版本不兼容 您正在运行的Windows的数目


由于构建以并行方式运行(32个进程),我怀疑在第二个目标中使用生成的exe时,包工具目标未完成,这可能会导致此令人困惑的错误消息。同样,大多数时候构建成功,但每运行10次或20次,它就会失败,并显示该消息

现在我的问题是:

  • 有没有办法等待在CMake/Ninja中并行构建的工具/目标完成构建
  • 或者,如何正确处理在同一构建过程中构建构建工具的任务

提前谢谢你

实际上依赖于可执行文件并运行可执行文件,而不是目标。不要担心任何
.exe
后缀。另外,最好不要假设
add_custom_命令
将在
CMAKE_RUNTIME_OUTPUT_目录
中运行-如果您依赖于特定目录,请使用
WORKING_目录显式设置它

add_custom_command (
    OUTPUT "${DST_FILE}"
    COMMAND ${PACKAGE_COMMAND} "${DST_FILE}"
    COMMAND $<TARGET_FILE:package-tool> -e "${DST_FILE}"
    DEPENDS ${PACKAGE_DEPENDENCIES} $<TARGET_FILE:package-tool>
)
add_custom_命令(
输出“${DST_文件}”
命令${PACKAGE_COMMAND}“${DST_FILE}”
命令$-e“${DST_FILE}”
依赖${PACKAGE_DEPENDENCIES}$
)

“当生成的exe正在第二个目标中使用时,我怀疑包工具目标没有完成”-正如您所说,
ninja
会按预期输出依赖项。那么,你怀疑忍者不会遵循这些依赖关系吗?那么问题不应该是关于CMake和编写
CMakeLists.txt
,而是关于忍者及其错误行为。可能是你犯错误的原因在其他地方。但我们只能猜测,猜测不是堆栈溢出的工作原理。嗯。。。我认为你是对的。CMake处理并发是没有意义的,忍者应该这样做。重新考虑一下,我会假设忍者步骤只是等待它所依赖的文件全部出现,因此在CMake/ninja域之外,可能存在导致该问题的另一个原因。谢谢你的洞察力!CMake允许只指定一个目标名称,而不是
$
命令包工具-e“${DST_FILE}”
。另外,通过两种方式--
TARGET\u FILE
或简单的TARGET name-CMake会自动从
包工具
添加目标级别的依赖项。是否需要
包工具
中的文件级依赖项取决于项目。这种文件级依赖关系只会在可执行文件更改时强制重新运行自定义命令(更准确地说,是依赖于该命令的自定义目标)。