[CMake] building tests

Marcel Loose loose at astron.nl
Thu Jul 8 04:27:25 EDT 2010


On Thu, 2010-07-08 at 11:12 +0800, Paul Harris wrote:
> 
> 
> On 7 July 2010 23:38, Marcel Loose <loose at astron.nl> wrote:
>         
>         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.
>         
> 
> Thanks Marcel, I combined the solution in the wiki with what was
> discussed in my last email, and I ended up with
>  
> set (CMAKE_TEST_COMMAND "ctest")
> 
> function (add_unit_test name)
>    if(NOT TARGET ${name})
>       add_custom_target (check COMMAND ${CMAKE_TEST_COMMAND})
>    endif()
>    add_executable(${name} ${ARGN})
>    # or ADD_EXECUTABLE(${name} ${ARGN} EXCLUDE_FROM_ALL)
>    #    if you want it to be skipped when building 'all'
>    add_test(${name} ${EXECUTABLE_OUTPUT_PATH}/${name})
>    add_dependencies(check ${name})
> endfunction()
> 
> 
> 
> however, I have discovered (with message()) that ${CMAKE_TEST_COMMAND}
> is *empty* - its something I had to set(), which is not mentioned in
> the wiki page you mentioned.  It IS kind-of-mentioned in "Cmake
> Scripting of CTest" but not explicitly enough to catch the eye.
> 
> I've edited the wiki page, please check that my edits make sense.
> 
> Thanks
> Paul

Hi Paul,

While re-reading you add_unit_test function above I was wondering
whether this will actually work. The snippet
  if(NOT TARGET ${name})
    add_custom_target (check COMMAND ${CMAKE_TEST_COMMAND})
  endif()
strikes me as odd. This will cause multiple definitions of the 'check'
target, which is not allowed, unless you set a policy (don't know by
heart which one exactly). Anyway, multiple definitions of the same
target are only supported by Unix Makefiles; I don't think you want to
restrict yourself unnecessarily.

Best regards,
Marcel Loose.




More information about the CMake mailing list