[CMake] building tests

Michael Hertling mhertling at online.de
Fri Jul 9 09:48:44 EDT 2010


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


More information about the CMake mailing list