CMake:execute_process() 的格式是什么?

CMake: What formatting does execute_process() do?

我需要从我的 CMakeList.txt.
调用 findstr Windows 命令(grep on Linux) 如果我这样做,它就会起作用:

execute_process(
    COMMAND findstr "NABO_VERSION " nabo\nabo.h
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    RESULT_VARIABLE FINDSTR_RESULT
    ERROR_VARIABLE FINDSTR_ERROR
    OUTPUT_VARIABLE FINDSTR_OUT
    OUTPUT_STRIP_TRAILING_WHITESPACE
)

我得到输出:

FINDSTR_ERROR =
FINDSTR_OUT =   
  #define NABO_VERSION "1.0.7"
  #define NABO_VERSION_INT 10007
FINDSTR_RESULT = 0

但是,"NABO_VERSION "末尾的space没有考虑在内。我必须在我的字符串前添加 /c:

所以我得到以下代码:

execute_process(
    COMMAND findstr /c:"NABO_VERSION " nabo\nabo.h
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    RESULT_VARIABLE FINDSTR_RESULT
    ERROR_VARIABLE FINDSTR_ERROR
    OUTPUT_VARIABLE FINDSTR_OUT
    OUTPUT_STRIP_TRAILING_WHITESPACE
)

但现在它不起作用,我明白了:

FINDSTR_ERROR =
FINDSTR_OUT =
FINDSTR_RESULT = 1

该命令在 PowerShell 或 CMD 中运行良好,但在 CMake 中运行不佳。我认为 CMake 修改了命令,但是以什么方式?

所以我创建了一个名为 nabo\nabo.h 的测试文件,其中包含以下内容:

#define NABO_VERSION "1.0.7"
#define NABO_VERSION_INT 10007

然后在cmd,我写了:

> findstr "NABO_VERSION " nabo\nabo.h
#define NABO_VERSION "1.0.7"
#define NABO_VERSION_INT 10007

并恢复了两条线。添加/c:是必要的:

> findstr /c:"NABO_VERSION " nabo\nabo.h
#define NABO_VERSION "1.0.7"

现在用 CMake 编写:

# test.cmake

cmake_minimum_required(VERSION 3.21)
# Script mode, no project() call

execute_process(
    COMMAND findstr "/c:NABO_VERSION " [[nabo\nabo.h]]
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    RESULT_VARIABLE FINDSTR_RESULT
    ERROR_VARIABLE FINDSTR_ERROR
    OUTPUT_VARIABLE FINDSTR_OUT
    OUTPUT_STRIP_TRAILING_WHITESPACE
)

message(STATUS "FINDSTR_ERROR  = ${FINDSTR_ERROR}")
message(STATUS "FINDSTR_OUT    = ${FINDSTR_OUT}")
message(STATUS "FINDSTR_RESULT = ${FINDSTR_RESULT}")

运行这个脚本returns预期结果:

>cmake -P test.cmake
-- FINDSTR_ERROR  =
-- FINDSTR_OUT    = #define NABO_VERSION "1.0.7"
-- FINDSTR_RESULT = 0

这是有效的,因为,正如 findstr /? 输出所说:

Use spaces to separate multiple search strings unless the argument is prefixed with /C.

那么您只需要 CMake 中的引号来确保 space 包含在 whole 参数中。