[CMake] building tests

Michael Wild themiwi at gmail.com
Fri Jul 9 10:39:16 EDT 2010


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.

Michael



More information about the CMake mailing list