在cmake中传递空字符串?

Jan*_*ker 3 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 ${len} elements: ${ARGN}")
  y(${ARGN})
endfunction()

x(a b "")
x(a "" c)
Run Code Online (Sandbox Code Playgroud)

将以上内容保存到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
Run Code Online (Sandbox Code Playgroud)

即,y没有得到空字符串,并且我重新定义的函数停止工作。任何关于如何传递所有参数(包括空字符串)的线索?

真实的用例是尝试重新定义file以更改安装。您的替代方案似乎不适用于此:

function(file)
  message("Calling file(${ARGN})")
  _file("${ARGN}")
endfunction()

include("cmake_install.cmake")
Run Code Online (Sandbox Code Playgroud)

这导致

> 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)
Run Code Online (Sandbox Code Playgroud)

Kan*_*ane 5

改变

y(${ARGN})
Run Code Online (Sandbox Code Playgroud)

y("${ARGN}")
Run Code Online (Sandbox Code Playgroud)

使它的行为符合您的预期。