[CMake] Unit tests, but not CTest

Michael Hertling mhertling at online.de
Wed May 12 21:31:50 EDT 2010


On 05/11/2010 10:51 AM, Magnus Therning wrote:
> On Mon, May 10, 2010 at 17:28, Tyler Roscoe <tyler at cryptio.net> wrote:
>> Let's keep this on the list in case it helps someone else.
>>
>> On Fri, May 07, 2010 at 10:27:16PM +0100, Magnus Therning wrote:
>>> On 07/05/10 17:24, Tyler Roscoe wrote:
>>>> On Fri, May 07, 2010 at 04:41:23PM +0100, Magnus Therning wrote:
>>>>>>        add_custom_command (TARGET ${PROJECT_NAME}
>>>>>>            POST_BUILD
>>>>>>            # Call the runner script directly. By doing it this way, all the
>>>>>>            # unit tests in the executable run at once. If we call CTest
>>>>>>            # here (like we do for the _runtest target), the script (and
>>>>>>            # thus the python interpreter) is invoked once for each test in
>>>>>>            # the executable, which is slower than calling the script once.
>>>>>>            COMMAND ${PYTHON_EXECUTABLE} ${${PROJECT_NAME}_TESTRUNNER} ${CMAKE_CFG_INTDIR} --gtest_print_time
>>>>>>        )
>>>>>
>>>>> One thing though, it seems the command is run *always* irrespective of
>>>>> whether the target is built or not.  That doesn't seem to square up
>>>>> with the text in the man page:
>>>>
>>>> Works For Me. I only see unit test runs if the library in question is
>>>> recompiled or relinked. What version of CMake are you using?
>>>
>>> 2.8
>>>
>>> What kind of target is ${PROJECT_NAME}?
>>>
>>> I used a target created with add_custom_target, so maybe that's the cause of it.
>>
>> I think all the targets in our project which use this post-build step
>> are libraries or executables.
>>
>> If your target is a custom_target that always runs (which, as noted in
>> the docs, custom_targets sometimes do) then of course the post-build
>> step will also always run.
> 
> I'm still having problems with this.
> 
> I put together this:
> 
>     project( test-post-build NONE )
>     cmake_minimum_required( VERSION 2.8 )
> 
>     set( output ${CMAKE_CURRENT_BINARY_DIR}/foo )
>     add_custom_command( OUTPUT ${output}
>         COMMAND touch ${output}
>         COMMENT "Touching foo"
>         )
>     add_custom_target( foo.build ALL DEPENDS ${output} )
> 
>     add_custom_command( TARGET ${output}
>         POST_BUILD
>         COMMAND echo "POST_BUILD ${output}"
>         )
> 
>     add_custom_command( TARGET foo.build
>         POST_BUILD
>         COMMAND echo "POST_BUILD foo.build"
>         )
> 
> Based on your description above I expected this behaviour:
> 
>     % cmake ..
>     -- Configuring done
>     -- Generating done
>     -- Build files have been written to:
> /home/magnus/Play/test/cmake/post_build/_build
>     % make
>     Scanning dependencies of target foo.build
>     [  0%] Touching foo
>     POST_BUILD /home/magnus/Play/test/cmake/post_build/_build/foo
>     POST_BUILD foo.build
>     [100%] Built target foo.build
>     % make
>     POST_BUILD foo.build
>     [100%] Built target foo.build
> 
> However, that's not the case.  I only ever see the 'POST_BUILD foo.build'
> printed. [...]

AFAIK, this is because your "add_custom_command(TARGET ${output} ...)"
is not associated with an actual target but with just a file whereas
"add_custom_command(TARGET foo.build ...)" actually refers to a target
"foo.build" defined by ADD_CUSTOM_TARGET(). Indeed, you may issue any
ADD_CUSTOM_COMMAND(TARGET ...) for undefined targets without causing
an error, but their commands will never be executed, of course.

> [...] So, what target can I use to get the desired behaviour of the
> POST_BUILD only being run after an actual build?

Just use a target - but really a target - after whose rebuild you like
to have your post-build custom commands being run.

Hope this helps.

Regards,

Michael


More information about the CMake mailing list