如果更改了CMAKE_RUNTIME_OUTPUT_DIRECTORY,则CMake无法找到测试

Sva*_*zen 16 testing cmake

我正在用CMake构建我的项目,我正在尝试为每个模块创建一堆测试套件.显然,如果我修改变量,CMAKE_RUNTIME_OUTPUT_DIRECTORY那么ctest无法找到要运行的测试并失败.

我已经做了一个最小的例子来展示我正在谈论的内容,并且我在Lubuntu 13.10上使用CMake 2.8.11.2运行它.如果有人能告诉我这是一个错误和/或如何解决它,我会很感激.谢谢.

文件CMakeLists.txt:

cmake_minimum_required (VERSION 2.6)
project (Test)

# Put all tests in the test directory, where the sources also are
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/test)

enable_testing()

add_subdirectory (${PROJECT_SOURCE_DIR}/test)
Run Code Online (Sandbox Code Playgroud)

文件测试/ CMakeLists.txt:

cmake_minimum_required(VERSION 2.6)

add_executable(ttest main.cpp)
add_test(ttest ttest)
Run Code Online (Sandbox Code Playgroud)

file test/main.cpp:

int main() {
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在新文件夹中构建后build,可在文件夹中正确创建可执行文件test.make test从build 运行会产生以下输出:

Running tests...
Test project /home/svalorzen/Tests/cmake/build
    Start 1: ttest
Could not find executable ttest
Looked in the following places:
ttest
ttest
Release/ttest
Release/ttest
Debug/ttest
Debug/ttest
MinSizeRel/ttest
MinSizeRel/ttest
RelWithDebInfo/ttest
RelWithDebInfo/ttest
Deployment/ttest
Deployment/ttest
Development/ttest
Development/ttest
Unable to find executable: ttest
1/1 Test #1: ttest ............................***Not Run   0.00 sec

0% tests passed, 1 tests failed out of 1

Total Test time (real) =   0.00 sec

The following tests FAILED:
      1 - ttest (Not Run)
Errors while running CTest
make: *** [test] Error 8
Run Code Online (Sandbox Code Playgroud)

arc*_*chz 21

编辑:

实际上我错过了文档中的内容add_test:

如果COMMAND指定可执行目标(由add_executable创建),它将自动替换为在构建时创建的可执行文件的位置

所以使用ttest而不是$<TARGET_FILE:ttest>应该工作.


我遇到了同样的问题,但我真的不知道它是不是一个bug.

我找到的解决方案是在命令中提供测试可执行文件的路径(使用目标ttest):

在test/CMakeLists.txt中:

add_test(ttest test/ttest)
Run Code Online (Sandbox Code Playgroud)

最后,您希望将路径存储在变量中以便编写类似的内容${test_dir}/ttest.

如果你想要更强大的东西,最好是使用long add_test命令和生成器表达式:

add_test(NAME ttest COMMAND $<TARGET_FILE:ttest>)
Run Code Online (Sandbox Code Playgroud)

生成表达式$<TARGET_FILE:ttest>将扩展到可执行目标的输出文件(此处为ttest),因此您可以确定目录没有问题.cmake文档中引用了其他表达式.

如果你有很多测试要声明,它会变得有点冗长,所以我使用像:

macro (create_test target)
  add_test (NAME ${target} COMMAND $<TARGET_FILE:${target}>)
endmacro (create_test)

#[some code]

#test definition
create_test(ttest)
Run Code Online (Sandbox Code Playgroud)

假设测试名称与可执行文件名称相同.

我找不到任何其他有效的解决方案.可以设置工作目录add_test,这显然使ctest找到可执行文件但测试然后崩溃并出现"BAD_COMMAND"错误.

我是cmake的新手,所以可能还有另一个解决方案.

  • 我还遇到了一个问题,即我的测试需要一些文件夹中没有找到的数据,因为工作目录仍然存在错误.如果有人正在读这个,你可以在`COMMAND`子句之前使用`WORKING_DIRECTORY $ {CMAKE_RUNTIME_OUTPUT_DIRECTORY}`解决这个问题. (4认同)

sil*_*gon 7

使用命令:

add_test(NAME ttest COMMAND $<TARGET_FILE:ttest>)
Run Code Online (Sandbox Code Playgroud)

写作NAMECOMMAND在使用时是强制性的TARGET_FILE(或者至少它不适用于我.否则请使用cmake --help-command add_test以获取更多信息.