如何告诉 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.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_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}
)
目录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_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}
)