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 参数中。
我需要从我的 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 参数中。