【发布时间】:2021-09-17 06:30:27
【问题描述】:
如果我在add_custom_command 的DEPENDS 部分中包含不存在的文件,则会失败。有没有办法指定依赖项可能不存在,但如果它创建了命令应该重新运行?
具体来说,我使用的是 Coco/R,它要求 Parser.frame 和 Scanner.frame 文件存在于与语法文件相同的目录中或由命令行参数指定的目录中,并且 Copyright.frame 可以存在或不是。所以我这样做:
foreach(FRAME_DIR IN ITEMS ${GRAMMAR_DIR} ${ARG_FRAME_DIR})
foreach(FRAME_FILE_NAME IN ITEMS Copyright Scanner Parser)
set(FULL_FRAME_FILE ${FRAME_DIR}/${FRAME_FILE_NAME}.frame)
if(EXISTS ${FULL_FRAME_FILE})
list(APPEND FRAME_FILES ${FULL_FRAME_FILE})
endif()
endforeach()
endforeach()
...
set(GEN_SOURCES ${ARG_OUTPUT_DIR}/Scanner.h ${ARG_OUTPUT_DIR}/Parser.h ${ARG_OUTPUT_DIR}/Scanner.cpp ${ARG_OUTPUT_DIR}/Parser.cpp)
add_custom_command(OUTPUT ${GEN_SOURCES}
COMMAND ${COCOCPP} ${COCOCPP_ARGS}
MAIN_DEPENDENCY ${ARG_GRAMMAR}
DEPENDS ${FRAME_FILES}
VERBATIM)
add_library(${ARG_TARGET} ${GEN_SOURCES})
如果我在foreach 中注释掉if,我会得到
ninja: error: '../verification/debug/config/Copyright.frame', needed by 'verification/gen/config/Parser.h', missing and no known rule to make it
在构建时。有了这个if,文件就生成了,但是如果我稍后创建Copyright.frame,当然构建程序不会知道它。
【问题讨论】:
-
你能提供一个具体的例子来说明你正在尝试做什么吗?我要么设计一个生成器表达式来计算正确的依赖集,要么将相同的命令附加到通过
POST_BUILD构建可选文件的目标。 -
看看你得到的确切失败/生产它的 MRE 也很好。
-
我已经添加了我实际在做的事情。当然,这不是 MRE,但如果仍然需要,我明天会这样做。使用检查文件是否存在并将结果写入另一个文件的命令就足够了。太糟糕了,没有 CMake 操场(我能找到)。
-
Copyright.frame可以是空文件吗?你不能在配置阶段检查文件是否存在吗?if I create Copyright.frame later,然后重新配置您的项目,这在您添加文件时通常是正常的,您通常需要重新配置 cmake。 -
"你不能在配置阶段检查文件是否存在吗?"这就是我目前所做的,并询问是否有更好的方法。
标签: cmake cmake-language