gpt4 book ai didi

cmake - 如何在 cmake add_test 中使用重定向

转载 作者:行者123 更新时间:2023-12-04 23:17:37 27 4
gpt4 key购买 nike

我有一个名为“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

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

在名为 build 的子目录中,我尝试了
project(foo)
...
add_test(NAME test1 COMMAND ./foo ../test/in.txt > ../test/out.txt)
enable_testing()

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

最佳答案

把我的评论变成答案

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

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

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

此解决方案与平台无关(它取决于 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()

此外,还有可能执行更独立于平台的 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
)

引用文献
  • Integrate bash test scripts in cmake
  • CMake: piping commands to executable
  • cmake: make tests successfully passing part of the build process
  • 关于cmake - 如何在 cmake add_test 中使用重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36304289/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com