如何在cmake add_test中使用重定向

Kağ*_*yal 4 integration-testing makefile cmake

我有一个名为“ foo”的控制台应用程序,该应用程序将参考文本文件作为输入(in.txt),并在标准输出处生成文本(我想保持这种行为)。

在make(不是cmake)中,我使用一个测试目标,该目标调用foo并将输出重定向到文件(out.txt),如下所示。然后,我使用diff将文件out.txt与预期的参考(ref.txt)进行比较

test:
    ./foo -a test/in.txt > test/out.txt
    diff test/out.txt test/ref.txt
Run Code Online (Sandbox Code Playgroud)

使用make可以正常工作。现在我的问题是;我如何使用cmake创建类似的Makefile?

我在一个称为build的子目录中尝试

project(foo)
...
add_test(NAME test1 COMMAND ./foo ../test/in.txt > ../test/out.txt)
enable_testing()
Run Code Online (Sandbox Code Playgroud)

使用cmake版本3.5,我得到的Makefile没有错误,但调用时make test,测试本身失败。似乎cmake命令add_test支持命令行参数,但不支持重定向。我尝试使用引号并逃脱成功。由于我无法通过这部分,因此我没有尝试使用diff。我只是想象我可以像使用bash一样使用&将foo和diff打包在一起。那将是第二步。

Flo*_*ian 6

把我的评论变成答案

正如@Tsyvarev所说,CTest命令不在外壳的上下文中运行。但是您可以自己添加所需的shell并使用例如sh作为与一起调用的命令add_test()

我已经用您的示例代码运行了一些测试,以下代码成功运行:

add_test(NAME test1 COMMAND sh -c "$<TARGET_FILE:foo> ../test/in.txt > ../test/out.txt")
Run Code Online (Sandbox Code Playgroud)

该解决方案不是独立于平台的(取决于在sh搜索路径中是否可用)。


因此,如果您想更加灵活,可以执行以下操作:

include(FindUnixCommands)

file(TO_NATIVE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/test/in.txt" _in)
file(TO_NATIVE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/test/out.txt" _out)
if (BASH)
    add_test(
        NAME test1 
        COMMAND ${BASH} -c "$<TARGET_FILE:foo> ${_in} > ${_out}"
    )
else()
    if (WIN32)
        add_test(
            NAME test1 
            COMMAND ${CMAKE_COMMAND} -E chdir $<TARGET_FILE_DIR:foo> $ENV{ComSpec} /c "$<TARGET_FILE_NAME:foo> ${_in} > ${_out}"
        )
    else()
        message(FATAL_ERROR "Unknown shell command for ${CMAKE_HOST_SYSTEM_NAME}")
    endif()
endif()
Run Code Online (Sandbox Code Playgroud)

此外,还有执行更加独立于平台的可能性diff${CMAKE_COMMAND} -E compare_files <file1> <file2>。因此,您可以使用以下命令在CMake中简化完整的基于makefile的示例:

add_custom_command(
    TARGET foo
    POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E echo "Running $<TARGET_FILE_NAME:foo> ..."
    COMMAND foo in.txt > out.txt
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test
)

add_test(
    NAME test1 
    COMMAND ${CMAKE_COMMAND} -E compare_files in.txt out.txt
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test
)
Run Code Online (Sandbox Code Playgroud)

参考文献