问题描述
我认为我确实有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)
...
我使用忍者进行构建,并且依赖项(忍者-t依赖)看起来正确。同样,构建命令(ninja -t命令)也很有意义。但是:有时,构建会失败。该消息没有意义,显示为:
此版本的package-tool.exe与该版本不兼容 您正在运行的Windows。
因为构建并行运行(32个进程),所以我怀疑在第二个目标中使用生成的exe时,打包工具目标未完成,这可能会导致此令人困惑的错误消息。同样,在大多数情况下,构建成功,但是每运行10或20次,它都会失败并显示该消息。
所以我的问题是:
- 有没有办法等待在CMake / Ninja中以并行构建方式完成工具/目标的构建?
- 或者我该如何在相同的构建过程中正确处理构建工具的任务?
提前谢谢!
解决方法
实际上取决于可执行文件并运行可执行文件,而不是目标文件。不要担心任何.exe
后缀。另外最好不要假设add_custom_command
将在CMAKE_RUNTIME_OUTPUT_DIRECTORY
中运行-如果您依赖于特定目录,请使用WORKING_DIRECTORY
对其进行显式设置。
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>
)