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

时间:2014-01-28 00:42:12

标签: 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)

文件测试/ CMakeLists.txt:

cmake_minimum_required(VERSION 2.6)

add_executable(ttest main.cpp)
add_test(ttest ttest)

file test / main.cpp:

int main() {
    return 0;
}

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

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

4 个答案:

答案 0 :(得分:20)

编辑:

实际上我在add_test的文档中遗漏了一些内容:

  

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

因此,使用ttest代替$<TARGET_FILE:ttest>应该有效。


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

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

in test / CMakeLists.txt:

add_test(ttest test/ttest)

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

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

add_test(NAME ttest COMMAND $<TARGET_FILE:ttest>)

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

如果您要进行大量测试,可能会有点冗长,所以我使用的宏如下:

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

#[some code]

#test definition
create_test(ttest)

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

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

我是cmake的新手,所以可能还有其他解决方案。

答案 1 :(得分:6)

使用命令:

add_test(NAME ttest COMMAND $<TARGET_FILE:ttest>)

使用NAME时必须写COMMANDTARGET_FILE(或者至少它不适合我。请使用cmake --help-command add_test获取更多信息。

答案 2 :(得分:1)

如果您的测试命令包含参数并且您将它们与可执行文件名称一起引用,那么您也会遇到此问题。

所以,如果你有这样的事情:


    -h, --help                output usage information
    --simulator [string]      Explicitly set simulator to use
    --configuration [string]  Explicitly set the scheme configuration to use
    --scheme [string]         Explicitly set Xcode scheme to use
    --project-path [string]   Path relative to project root where the Xcode project (.xcodeproj) lives. The default is 'ios'.
    --device [string]         Explicitly set device to use by name.  The value is not required if you have a single device connected.
    --udid [string]           Explicitly set device to use by udid
    --no-packager             Do not launch packager while building
    --config [string]         Path to the CLI configuration file

而是这样做:

    add_test(NAME "name" COMMAND "testExe arg1 arg2 arg3")

否则CMake将尝试查找包含空格的测试可执行文件名称。

答案 3 :(得分:0)

清楚地使用 NAME 和 COMMAND 为我解决了问题

add_test(NAME ttest COMMAND ttest)