如何告诉cmake/ctest下的测试在何处查找其输入数据。。。不更改硬编码文件名

如何告诉cmake/ctest下的测试在何处查找其输入数据。。。不更改硬编码文件名,cmake,ctest,Cmake,Ctest,目录prj/test包含一些测试脚本t01.exe,t02.exe等。其中一些脚本需要输入数据d01.dat等,也在prj/test中提供。这些数据文件的名称在测试中是硬编码的,我不能轻易地改变这一点。控制文件CMakeLists.txt包含 enable_testing() file(GLOB test_sources "t*") foreach(test_src ${test_sources}) string(REGEX REPLACE ".*/" "" test_name "${t

目录
prj/test
包含一些测试脚本
t01.exe
t02.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

因此,我的问题是:

  • 让测试找到输入数据的标准方法是什么
  • 有没有一种方法不需要复制数据(如果数据很大)
  • 确实,符号链接在Windows下不工作,因此不是可接受的解决方案

变量
${CMAKE\u CURRENT\u SOURCE\u DIR}
${CMAKE\u SOURCE\u DIR}
非常有用。第一个是当前二进制位置的源目录。后者是源树顶层的根


假设您在
prj/test/inputfile
处有一个输入文件,您可以使用
${CMAKE\u CURRENT\u SOURCE\u DIR}/inputfile
获得它的路径。您可以将路径作为参数传递给测试。

add\u test
命令接受
WORKING\u目录
选项。您可以将此选项设置为测试所在的目录。因此,测试将找到其数据文件:

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

inputfile
在我的
CMakeLists.txt
中没有出现,我会犹豫是否让它出现,因为这可能需要为以后添加的任何测试做额外的工作。
inputfile
是您拥有的任何输入文件的一个示例。您可以将其作为参数传递给测试。我扩展了我的答案。我的测试使用的是一种特定于领域的语言,不容易接受这种解决方案。我应该说得更明确一些,现在编辑了这个问题:输入文件名在测试中是硬编码的,我不想改变这个。我真的需要一个cmake或包装外壳脚本级别的解决方案。好的,你不想复制数据,也不想符号链接到它们。此外,到正确位置的路径不适合您。那就没有别的办法了。不使用源代码外版本?拙劣的建议。问题1允许复制。关于符号链接,请参见问题3。
add_test
command接受
WORKING_目录
选项。您可以将此选项设置为
prj/test
${CMAKE\u SOURCE\u DIR}/test
)目录,这样测试将从它所在的目录运行。正如我从你的问题中了解到的,这样的测试方法会找到数据文件。太好了,非常感谢<代码>添加测试(名称${test\u NAME}命令“${test\u src}”工作目录${CMAKE\u CURRENT\u SOURCE\u DIR})工作正常。你能把你的评论作为答复转发给我吗?这样我就可以接受了?