[CMake] building tests

Paul Harris harris.pc at gmail.com
Sat Jul 10 12:54:47 EDT 2010


On 9 July 2010 22:39, Michael Wild <themiwi at gmail.com> wrote:

>
> On 9. Jul, 2010, at 15:48 , Michael Hertling wrote:
>
> > On 07/08/2010 09:47 AM, Paul Harris wrote:
> >> On 8 July 2010 15:31, Michael Wild <themiwi at gmail.com> wrote:
> >>
> >>>
> >>> On 8. Jul, 2010, at 7:25 , Paul Harris wrote:
> >>>
> >>>> On 8 July 2010 12:56, Michael Wild <themiwi at gmail.com> wrote:
> >>>>
> >>>>>
> >>>>> On 8. Jul, 2010, at 4:40 , Paul Harris wrote:
> >>>>>
> >>>>>> On 7 July 2010 23:05, Michael Wild <themiwi at gmail.com> 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).
> >>>>>>>
> >>>>>>>
> >>>>>> This does not work for me.  If I do not have the
> EXECUTABLE_OUTPUT_PATH
> >>>>> in
> >>>>>> add_test, I get a message like this when i run "make test"
> (shortened
> >>> for
> >>>>>> brevity):
> >>>>>>
> >>>>>> 1/  1 Testing unit_string_numeric_utils     Could not find
> executable
> >>>>>> unit_string_numeric_utils
> >>>>>> Looked in the following places:
> >>>>>> unit_string_numeric_utils
> >>>>>> unit_string_numeric_utils
> >>>>>> Release/unit_string_numeric_utils
> >>>>>> Release/unit_string_numeric_utils
> >>>>>
> >>>>> Mmmh, works fine for me:
> >>>>>
> >>>>> --------->8---------
> >>>>> cmake_minimum_required(VERSION 2.8)
> >>>>> project(tmp)
> >>>>>
> >>>>> enable_testing()
> >>>>>
> >>>>> add_executable(unit1 unit1.cpp)
> >>>>> add_test(unit1 unit1)
> >>>>> ---------<8---------
> >>>>>
> >>>>> Where unit1.cpp is just a simple hello-world program. Running it:
> >>>>>
> >>>>>
> >>>> snip
> >>>>
> >>>> My project is a lot bigger than a hello-world program.  It has
> >>>> subdirectories for a start, and I do things like
> >>>> SET(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin CACHE INTERNAL
> >>> "Single
> >>>> output directory for building all executables.")
> >>>>
> >>>> I'm not sure at which point things stop working, do you want me to try
> >>> and
> >>>> build a test-case?
> >>>
> >>> You are right, it seems that the documentation is misleading (or IMHO
> >>> outright wrong). This, however, works for me and is safe:
> >>>
> >>> add_test(NAME unit1 COMMAND $<TARGET_FILE:unit1>)
> >>>
> >>> Note that NAME and COMMAND are required for this to work.
> >>>
> >>> BTW: EXECUTABLE_OUTPUT_PATH is deprecated, you should use
> >>> CMAKE_RUNTIME_OUTPUT_DIRECTORY instead.
> >>>
> >>>
> >> I changed EXE to that CMAKE RUNTIME thing, thanks.
> >>
> >> That NAME/COMMAND thing doesn't work for me at all.  Can't find the
> binary
> >> without the runtime output path explicitly added.
> >>
> >> This is what I tried:
> >>
> >> In parent CMakeLists.txt
> >>
> >> ENABLE_TESTING()
> >>
> >> set (CMAKE_TEST_COMMAND ctest -V)
> >>
> >> function (add_unit_test name)
> >>   if(NOT TARGET ${name})
> >>      add_custom_target (check COMMAND ${CMAKE_TEST_COMMAND})
> >>   endif()
> >>   add_executable(${name} ${ARGN})
> >>   add_test(NAME ${name} COMMAND $<TARGET_FILE:${name}>)
> >>   add_dependencies(check ${name})
> >> endfunction()
> >>
> >>
> >> in subdirectory CMakeLists.txt
> >> add_unit_test(unit_string_numeric_utils
> units/unit_string_numeric_utils.cpp
> >> string_numeric_utils.cpp)
> >
> > Could you detect manually where the binary in question gets written
> > to, and post ctest's output with the complaint about not finding it,
> > and perhaps you could also post a minimal CMakeLists.txt file which
> > demonstrates this issue along with the output of "make VERBOSE=1"?
> >
> > Regards,
> >
> > Michael
>
> I suspect he's using a pre-2.8 version of CMake. I confirmed that add_test
> only resolves executable target names if used with NAME and COMMAND, and
> this signature was introduced in 2.8.
>
>
I'm using 2.8.1
Michael Hertling - do you still want me to follow up as you asked?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cmake.org/pipermail/cmake/attachments/20100711/b05e21c7/attachment.htm>


More information about the CMake mailing list