CMake截断传递给函数的值

时间:2019-04-26 10:24:24

标签: cmake

我在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

我很困惑。帮助吗?

1 个答案:

答案 0 :(得分:2)

编写CMake脚本时要记住的重要一点是,在文本CMake输入中,空格和;都是有效的参数分隔符(1)。换句话说,您不是使用2个参数来调用函数,而是使用5个参数(列表TO_FORMAT的每个元素成为format_source的单独参数)。

有多种解决方法。最小的一个是引用TO_FORMAT的扩展以将其变成单个参数,如下所示:

format_source(src "${TO_FORMAT}")

但是,这很容易出错,并且与大多数本机CMake命令使用的样式并不完全匹配。因此,我建议使用一种不同的方法,使format_source接受任意数量的参数(类似于add_executabletarget_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的一个参数。