在cmake中传递空字符串?
我试图在cmake中重新定义一个函数。但是,此函数只有一些签名。如果我不认识签名,我只想用所有原始参数调用原始签名。除非函数os调用时使用空字符串(在cmake中传递空字符串?,cmake,Cmake,我试图在cmake中重新定义一个函数。但是,此函数只有一些签名。如果我不认识签名,我只想用所有原始参数调用原始签名。除非函数os调用时使用空字符串(“”)作为参数,否则此操作正常。问题可以这样说明: function(y) list(LENGTH ARGN len) message("y got ${len} elements: ${ARGN}") endfunction() function(x) list(LENGTH ARGN len) message("x got ${
“”
)作为参数,否则此操作正常。问题可以这样说明:
function(y)
list(LENGTH ARGN len)
message("y got ${len} elements: ${ARGN}")
endfunction()
function(x)
list(LENGTH ARGN len)
message("x got ${len} elements: ${ARGN}")
y(${ARGN})
endfunction()
x(a b "")
x(a "" c)
将上述内容保存到x.cmake
并运行cmake-p x.cmake
,打印
> cmake -P x.cmake
x got 3 elements: a;b;
y got 2 elements: a;b
x got 3 elements: a;;c
y got 2 elements: a;c
也就是说,y
没有得到空字符串,我重新定义的函数停止工作。有没有关于如何传递所有参数(包括空字符串)的线索
真正的用例是尝试重新定义文件
以更改安装。你的选择似乎不适用于此:
function(file)
message("Calling file(${ARGN})")
_file("${ARGN}")
endfunction()
include("cmake_install.cmake")
这导致
> cmake -P cmake_ln_install.cmake
-- Install configuration: "RelWithDebInfo"
Calling file(RPATH_CHECK;FILE;/home/janw/cmake/linux/lib/swipl/bin/x86_64-linux/swipl;RPATH;/home/janw/cmake/linux/lib/swipl/lib/x86_64-linux)
CMake Error at cmake_ln_install.cmake:3 (_file):
_file must be called with at least two arguments.
Call Stack (most recent call first):
src/cmake_install.cmake:43 (file)
cmake_install.cmake:42 (include)
cmake_ln_install.cmake:6 (include)
改变
y(${ARGN})
到
使其按预期运行。Hm,在我知道的CMake函数中,空字符串(
“”
)仅作为位置参数接受,因此您可以将函数定义为函数(x param1 param2 param3)
,并直接访问这些参数。异常是一个类似于set
的函数,您不太可能想要截取它。它看起来很有说服力,但不起作用。我试图重新定义的真正函数是file
。我编辑了上面的问题,以反映什么不起作用是的,这不应该起作用。被调用方将在引号内传递的内容视为单个参数。但是,如果被调用方本身将迭代${ARGN}
,它将查找所有参数,就好像它们是单独传递的一样@JanWielemaker:您可以尝试定义函数(文件arg1 arg2)
并使用\u文件(${arg1}${arg2}“${ARGN}”)
调用原始函数。这应该通过对参数编号的检查。我考虑过了,但是我们得到了这个(很抱歉格式不好)--安装配置:“RelWithDebInfo”调用文件(RPATH\u check file/ufs/wielemak/lib/swipl/bin/x86\u 64-linux/swipl;RPATH;/ufs/wielemak/lib/swipl/lib/x86\u 64-linux)CMake\u安装时出错。CMake:3(\u文件):_filerpath_CHECK未提供RPATH选项。调用堆栈(最新调用优先):src/cmake_install.cmake:43(文件)cmake_install.cmake:42(包括)cmake_ln_install.cmake:6(包括)'(有人知道在哪里找到S/OSCOD>文件的SULRE吗?这可能暗示了发生了什么。下载了源代码。<代码>文件<代码>命令是用C++编写的,而且似乎处理附加的参数在那里是不同的。这可能解释了为什么<代码>文件(${ARG1}${ARG2} ${ARGN})。
不起作用。回到原点:如果列表中可能包含空字符串,如何从函数名和参数调用函数?
y("${ARGN}")