我在CMake中创建了一个函数,该函数应该接收两个参数,一个是字符串,另一个是源文件列表。问题在于CMake会截断传递给函数的变量列表,而我只会得到第一个文件:
set(
INCLUDES
${PROJECT_SOURCE_DIR}/include/smthcore/Interface.hpp
)
set(
SRC
${PROJECT_SOURCE_DIR}/src/Interface.cpp
${PROJECT_SOURCE_DIR}/src/detail/Class.hpp
${PROJECT_SOURCE_DIR}/src/detail/Class.cpp
)
set(
TO_FORMAT
${INCLUDES}
${SRC}
)
message("111 " ${TO_FORMAT})
include(ClangFormat)
format_source(src ${TO_FORMAT})
打印message
的地方
/mnt/c/Users/Desktop/smth.Core/include/smthcore/Interface.hpp/mnt/c/Users/Desktop/smth.Core/src/Interface.cpp/mnt/c/Users/Desktop/smth.Core/src/detail/Class.hpp/mnt/c/Users/Desktop/smth.Core/src/detail/Class.cpp
但是在format_source
我有
function(FORMAT_SOURCE trgt to_format)
message("222 " ${trgt})
message("333 " ${to_format})
endfunction(FORMAT_SOURCE trgt to_format)
和333张照片
333 /mnt/c/Users/Desktop/smth.Core/include/smthcore/Interface.hpp
我很困惑。帮助吗?
答案 0 :(得分:2)
编写CMake脚本时要记住的重要一点是,在文本CMake输入中,空格和;
都是有效的参数分隔符(1)。换句话说,您不是使用2个参数来调用函数,而是使用5个参数(列表TO_FORMAT
的每个元素成为format_source
的单独参数)。
有多种解决方法。最小的一个是引用TO_FORMAT
的扩展以将其变成单个参数,如下所示:
format_source(src "${TO_FORMAT}")
但是,这很容易出错,并且与大多数本机CMake命令使用的样式并不完全匹配。因此,我建议使用一种不同的方法,使format_source
接受任意数量的参数(类似于add_executable
或target_link_libraries
这样的CMake命令如何执行):
function(FORMAT_SOURCE trgt)
message("222 " ${trgt})
message("333 " ${ARGN})
endfunction()
(1)请注意,您实际上可以在message()
的行为中注意到这一点,该行为默认情况下会直接打印其参数的串联。当您这样称呼它时:
message("111 " ${TO_FORMAT})
TO_FORMAT
的元素之间没有分隔符:它们每个都构成message
的单独参数。但是,如果要这样称呼它:
message("111 " "${TO_FORMAT}")
会有分号分隔元素,因为整个列表(与分号分隔的字符串完全相同)成为message
的一个参数。