[CMake] building tests

Marcel Loose loose at astron.nl
Wed Jul 7 11:38:09 EDT 2010


On Wed, 2010-07-07 at 17:05 +0200, Michael Wild wrote:
> On 7. Jul, 2010, at 16:01 , Paul Harris wrote:
> 
> > Hi all,
> > 
> > I have looked and can't find the answer, so I turn to the list.
> > 
> > I have a CMakeLists.txt and a subdirectory called utils, which also
has its
> > own CMakeLists.txt
> > 
> > In the parent CML.txt, I have something like:
> > 
> > ENABLE_TESTING()
> > add_subdirectory(utils)
> > 
> > In my utils CML.txt, I have
> > 
> > ADD_EXECUTABLE(unit_1 units/unit_1.cpp)
> > ADD_TEST( unit_1 ${EXECUTABLE_OUTPUT_PATH}/unit_1 )
> > 
> 
> Simplify this to
> 
> ADD_TEST(unit_1 unit_1)
> 
> CMake will figure out by itself that unit_1 is a target and invoke the
executable correctly (your code would break for multi-configuration IDE
generators).
> 
> As for the dependencies, I agree that it would be nice if the "test"
target depended on the executables. But what is wrong with "make all
test" (apart from the fact that it possibly compiles more than you
actually need to run the test)? You could also wrap the add_executable
call in a custom function which creates a custom target (say test_exes)
and makes it depend on all the executables:
> 
> function(add_test_executable name)
>   if(NOT TARGET ${name})
>     add_custom_target(test_exes)
>    endif()
>    add_executable(${name} ${ARGN})
>    add_dependencies(test_exes ${name})
> endfunction()
> 
> Then you can do "make test_exes test".
> 
> HTH
> 
> Michael

You can further reduce the number of targets that get (re)build by going
into the directory '${CMAKE_BINARY_DIR}/utils' and invoke 'make' there.

You could also define a 'check' target that will build and run all your
test programs. See http://www.cmake.org/Wiki/CMakeEmulateMakeCheck

Best regards,
Marcel Loose.



More information about the CMake mailing list