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

时间:2015-10-20 08:08:37

标签: cmake ctest

目录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中运行。

因此我的问题是:

  • 让测试找到输入数据的标准方法是什么?
  • 有没有办法不需要复制数据(万一它们很大)?
  • 是的,符号链接在Windows下不起作用,因此是不可接受的解决方案吗?

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:1)

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

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