英文:
CMake - Pass a list as a string to add_custom_target for CMake script
问题
add_custom_target 似乎在我不希望的情况下'解包'了列表。看看我正在使用的 add_custom_target 以调用一个 CMake 脚本:
message(STATUS "Sources: ${ARGS_SOURCES}")
add_custom_target(${ARGS_TARGET}
COMMAND ${CMAKE_COMMAND}
-DSOURCES="${ARGS_SOURCES}"
-DOUTPUT_DIR="${ARGS_OUTPUT_DIR}"
-P "${CMAKE_SOURCE_DIR}/cmake/translation_generator/translation_generator_script.cmake"
SOURCES ${ARGS_SOURCES}
"${CMAKE_SOURCE_DIR}/cmake/translation_generator/translation_generator_script.cmake")
消息输出是我期望的,一个由分号分隔的路径列表。
-- Sources: /home/cmannett85/workspace/arg_router/examples/resources/simple_ml_gen/en_GB.toml;/home/cmannett85/workspace/arg_router/examples/resources/simple_ml_gen/fr.toml;/home/cmannett85/workspace/arg_router/examples/resources/simple_ml_gen/ja.toml
然而,当脚本被调用时,我得到了这个:
/usr/bin/cmake -DSOURCES="/home/cmannett85/workspace/arg_router/examples/resources/simple_ml_gen/en_GB.toml /home/cmannett85/workspace/arg_router/examples/resources/simple_ml_gen/fr.toml /home/cmannett85/workspace/arg_router/examples/resources/simple_ml_gen/ja.toml" ...
它将列表解包成了以空格分隔的字符串 - 这不是我想要的。
我尝试使用 VERBATIM 标志,但它完全搞乱了调用:
/usr/bin/cmake -DSOURCES=\""/home/cmannett85/workspace/arg_router/examples/resources/simple_ml_gen/en_GB.toml /home/cmannett85/workspace/arg_router/examples/resources/simple_ml_gen/fr.toml /home/cmannett85/workspace/arg_router/examples/resources/simple_ml_gen/ja.toml\" ...
它转义了双引号。如果我将它们删除:
/usr/bin/cmake -DSOURCES=/home/cmannett85/workspace/arg_router/examples/resources/simple_ml_gen/en_GB.toml /home/cmannett85/workspace/arg_router/examples/resources/simple_ml_gen/fr.toml /home/cmannett85/workspace/arg_router/examples/resources/simple_ml_gen/ja.toml ...
它保留了空格,破坏了调用脚本。我还尝试过:
list(JOIN ARGS_SOURCES ";" ARGS_SOURCES)
但是似乎解包发生在 add_custom_target 处理中,所以这没有任何区别。
所以我的问题是:如何将一个列表作为分号分隔的字符串传递给 add_custom_target 命令?
英文:
add_custom_target seems to be 'unpacking' lists when I don't want it to. Take this add_custom_target that I'm using to invoke a CMake script:
message(STATUS "Sources: ${ARGS_SOURCES}")
add_custom_target(${ARGS_TARGET}
COMMAND ${CMAKE_COMMAND}
-DSOURCES="${ARGS_SOURCES}"
-DOUTPUT_DIR="${ARGS_OUTPUT_DIR}"
-P "${CMAKE_SOURCE_DIR}/cmake/translation_generator/translation_generator_script.cmake"
SOURCES ${ARGS_SOURCES}
"${CMAKE_SOURCE_DIR}/cmake/translation_generator/translation_generator_script.cmake")
The message output is what I'm expecting, a list of paths separated by semi-colons.
-- Sources: /home/cmannett85/workspace/arg_router/examples/resources/simple_ml_gen/en_GB.toml;/home/cmannett85/workspace/arg_router/examples/resources/simple_ml_gen/fr.toml;/home/cmannett85/workspace/arg_router/examples/resources/simple_ml_gen/ja.toml
However when the script is invoked, I get this:
/usr/bin/cmake -DSOURCES="/home/cmannett85/workspace/arg_router/examples/resources/simple_ml_gen/en_GB.toml /home/cmannett85/workspace/arg_router/examples/resources/simple_ml_gen/fr.toml /home/cmannett85/workspace/arg_router/examples/resources/simple_ml_gen/ja.toml" ...
It's unpacked the list into a space separated string - this is not what I want.
I attempted to use the VERBATIM flag but it completely mangled the invocation:
/usr/bin/cmake -DSOURCES=\"/home/cmannett85/workspace/arg_router/examples/resources/simple_ml_gen/en_GB.toml /home/cmannett85/workspace/arg_router/examples/resources/simple_ml_gen/fr.toml /home/cmannett85/workspace/arg_router/examples/resources/simple_ml_gen/ja.toml\" ...
It's escaping the double quotes. If I remove them:
/usr/bin/cmake -DSOURCES=/home/cmannett85/workspace/arg_router/examples/resources/simple_ml_gen/en_GB.toml /home/cmannett85/workspace/arg_router/examples/resources/simple_ml_gen/fr.toml /home/cmannett85/workspace/arg_router/examples/resources/simple_ml_gen/ja.toml ...
It keeps the spaces, breaking the called script. I also tried:
list(JOIN ARGS_SOURCES ";" ARGS_SOURCES)
But the unpacking appears to happen in the add_custom_target processing, so this made no difference.
So my question is: How do I pass a list to a add_custom_target command, as a semi-colon separated string?
答案1
得分: 1
CMake引号的使用有些令人困惑。例如:"this" 被引用。例如:th"is" 没有 被引用,而 " 被照字面解释。
在你的示例中,-DSOURCES="${ARGS_SOURCES}" 中的 " 是字面的。因此,ARGS_SOURCES 被拆分,因为它是一个数组,你的程序会接收多个参数,如 '-DSOURCES="elem1' 'elem2' 'elem3' 'elem4"' 带有 " 引号。
如果你想在CMake中引用,第一个字符必须是 ",而最后一个字符必须是 "。就像你在 "Sources: ${ARGS_SOURCES}" 中所做的一样。
"-DSOURCES=${ARGS_SOURCES}"
英文:
CMake quoting is confusing. For example: "this" is quoted. For example: th"is" is not quoted, and " are taken literally.
In your example, -DSOURCES="${ARGS_SOURCES}" " are literal. So ARGS_SOURCES is split, as it is an array, and your program receives multiple arguments like '-DSOURCES="elem1' 'elem2' 'elem3' 'elem4"' with the " quotes.
If you want to quote in CMake, the first character has to be " and the last character has to be ". Just like you did with "Sources: ${ARGS_SOURCES}".
"-DSOURCES=${ARGS_SOURCES}"
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论