Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CMake cannot find test if CMAKE_RUNTIME_OUTPUT_DIRECTORY is changed

Tags:

I'm building my project with CMake, and I'm trying to create a bunch of test suites for each module. Apparently if I modify the variable CMAKE_RUNTIME_OUTPUT_DIRECTORY then ctest cannot find the test to run and fails.

I've made a minimal example to showcase what I am talking about, and I'm running it with CMake 2.8.11.2 on Lubuntu 13.10. I'd appreciate if somebody could tell me whether this is a bug and/or how to work around it. Thanks.

file 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) 

file 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; } 

After building in a new folder build, the executable is correctly created in the folder test. Running make test from build results in the following output:

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 
like image 386
Svalorzen Avatar asked Jan 28 '14 00:01

Svalorzen


1 Answers

edit :

actually I missed something in the documentation for add_test:

If COMMAND specifies an executable target (created by add_executable) it will automatically be replaced by the location of the executable created at build time

So using ttest instead of $<TARGET_FILE:ttest> should work.


I got the same problem but I do not really know if it is a bug or not.

The solution I found for this is providing the path of the test executable in the command (with the target ttest):

in test/CMakeLists.txt :

add_test(ttest test/ttest) 

Eventually, you would like to store the path in a variable in order to write something like ${test_dir}/ttest.

If you want something more robust, the best is to use the long add_test command and generator expressions :

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

The generation expression $<TARGET_FILE:ttest> will expand to the output file of the executable target (ttest here), so you are sure there is no problem with the directory. There is other expression referenced in cmake documentation.

It can get a little verbose if you have lot of tests to declare so I use a macro like :

macro (create_test target)   add_test (NAME ${target} COMMAND $<TARGET_FILE:${target}>) endmacro (create_test)  #[some code]  #test definition create_test(ttest) 

Assuming the test name is the same as the executable name.

I could not find any other working solution. It is possible to set the working directory with add_test, which apparently make ctest find the executable but the test then crashes with a "BAD_COMMAND" error.

I'm new with cmake, so may be there is another solution.

like image 144
archz Avatar answered Sep 23 '22 02:09

archz