如何告诉 cmake/ctest 下的测试在哪里可以找到它的输入数据...而不更改硬编码文件名

How to tell a test under cmake/ctest where to find its input data ... without changing hard-coded file names

目录prj/test包含一些测试脚本t01.exet02.exe等,其中一些需要输入数据d01.dat等,也在prj/test中提供。这些数据文件的名称在测试中是硬编码的,我无法轻易更改。控制文件 CMakeLists.txt 包含

enable_testing()
file(GLOB test_sources "t*")
foreach(test_src ${test_sources})
    string(REGEX REPLACE ".*/" "" test_name "${test_src}")
    string(REGEX REPLACE ".exe$" "" test_name "${test_name}")
    add_test(${test_name} "${test_src}")
endforeach(test_src)

我正在子目录 prj/build 中构建项目。 ctest 工作正常......直到测试需要输入数据。显然,找不到它们是因为它们位于 prj/test 而测试运行在 prj/build/test.

因此我的问题是:

变量 ${CMAKE_CURRENT_SOURCE_DIR}${CMAKE_SOURCE_DIR} 很有用。第一个是当前二进制位置的源目录。后者是源代码树的根到顶层。

假设您在 prj/test/inputfile 有一个输入文件,您可以使用 ${CMAKE_CURRENT_SOURCE_DIR}/inputfile 获取它的路径。您可以将路径作为参数传递给您的测试。

add_test 命令接受 WORKING_DIRECTORY 选项。您可以将此选项设置为测试所在的目录。所以,测试会找到它的数据文件:

add_test(NAME ${test_name} COMMAND "${test_src}"
         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)