无法在生成的CMake脚本中设置变量

时间:2017-06-04 07:58:48

标签: cmake ctest

我试图从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时初始化?

1 个答案:

答案 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()