[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