我试图从CMake
中调用可执行文件的输出作为字符串,以便在构建系统中进行处理。这是我将使用add_test
添加到CTest工具的测试套件列表。
在CMakeLists.txt
...(After adding the mlpack_test target)...
configure_file(generate_test_names.cmake.in generate_test_names.cmake)
add_custom_command(TARGET mlpack_test
POST_BUILD
COMMAND ${CMAKE_COMMAND} -P generate_test_names.cmake
)
在generate_test_names.cmake.in
function(get_names)
message("Adding tests to the test suite")
execute_process(COMMAND ${CMAKE_BINARY_DIR}/bin/mlpack_test --list_content
OUTPUT_VARIABLE FOO)
message(STATUS "FOO='${FOO}'")
endfunction()
get_names()
脚本被执行,我可以在构建的mlpack_test --list_content
中看到stdout
的输出。但是FOO
仍然是一个空字符串。
输出:
Adding tests to the test suite
ActivationFunctionsTest*
TanhFunctionTest*
LogisticFunctionTest*
SoftsignFunctionTest*
IdentityFunctionTest*
RectifierFunctionTest*
LeakyReLUFunctionTest*
HardTanHFunctionTest*
ELUFunctionTest*
SoftplusFunctionTest*
PReLUFunctionTest*
-- FOO=''
为什么OUTPUT_VARIABLE
的参数未在执行过程的stdout
时初始化?
答案 0 :(得分:1)
使用configure_file
生成CMake脚本时,最好为该命令使用 @ONLY 选项:
configure_file(generate_test_names.cmake.in generate_test_names.cmake @ONLY)
在这种情况下,只有@var@
引用将替换为变量的值,但${var}
引用仍然未更改:
function(get_names)
message("Adding tests to the test suite")
# CMAKE_BINARY_DIR will be replaced with the actual value of the variable
execute_process(COMMAND @CMAKE_BINARY_DIR@/bin/mlpack_test --list_content
OUTPUT_VARIABLE FOO)
# But FOO will not be replaced by 'configure_file'.
message(STATUS "FOO='${FOO}'")
endfunction()
get_names()