[CMake] download file, modify, add test from it

Nico Schlömer nico.schloemer at gmail.com
Mon Nov 23 06:48:53 EST 2015


>  Is that a leftover, or is the other reference to -2 just omitted from
your example...?

That's a leftover indeed. :)

--Nico

On Mon, Nov 23, 2015 at 12:45 PM David Cole <DLRdave at aol.com> wrote:

> You're welcome.
>
> I see you have ${file}-2.h5m in only one place, though... Is that a
> leftover, or is the other reference to -2 just omitted from your example...?
>
>
> Cheers,
> David C.
>
>
>
> On Monday, November 23, 2015, Nico Schlömer <nico.schloemer at gmail.com>
> wrote:
>
>> Thanks David for your explanations. I've now reached a good solution:
>>
>> Fetch the data:
>> ```
>> INCLUDE(ExternalData)
>> set(
>>   ExternalData_URL_TEMPLATES
>>   "https://downloads.sourceforge.net/project/noshdata/%(algo)/%(hash)"
>>   )
>> foreach(file ${input_files})
>>   ExternalData_Expand_Arguments(
>>     noshTestFetchData
>>     OUT_DATA DATA{${CMAKE_SOURCE_DIR}/test/data/${file}.e}
>>     )
>> endforeach()
>> ExternalData_Add_Target(noshTestFetchData)
>> ```
>> Define conversion commands:
>> ```
>> foreach(file ${input_files})
>>   LIST(APPEND FILES2 ${file}-2.h5m)
>>   add_custom_command(
>>     DEPENDS ${file}.e
>>     COMMAND convert ${file}.e ${file}.h5m
>>     OUTPUT ${file}.h5m
>>     )
>> endforeach()
>> ```
>> Add a custom target with ALL:
>> ```
>> add_custom_target(split2 ALL
>>   SOURCES ${FILES2}
>>   )
>> ```
>> Adding the output files to the SOURCES makes the target do what's its
>> supposed to do.
>>
>> Cheers,
>> Nico
>>
>> On Sun, Nov 22, 2015 at 11:59 PM David Cole <DLRdave at aol.com> wrote:
>>
>>> You don't. You just assume all relevant targets have already been built
>>> by the time you run the tests... There's no such thing as a test from
>>> an add_test call depending on a target.
>>>
>>> There **is** a dependency, of course, if you are using one of the build
>>> products in your test, but it's assumed that everything is already built at
>>> test time.
>>>
>>> There is not yet a notion of connecting certain tests to certain build
>>> targets.
>>>
>>> So, for example, there is no way to re-run only the tests affected by
>>> things which have changed since the last build, because there is no
>>> connection between targets and tests.
>>>
>>> People have artificially created such connections using test labels, and
>>> running subsets of tests by label, but there is no official dependency from
>>> tests back to targets.
>>>
>>>
>>> D
>>>
>>>
>>>
>>> On Sunday, November 22, 2015, Nico Schlömer <nico.schloemer at gmail.com>
>>> wrote:
>>>
>>>> Aha, this was a misunderstanding of me then. Thanks!
>>>> How do I make a test depend on a target then?
>>>>
>>>> Cheers,
>>>> Nico
>>>>
>>>>
>>>> On Sun, Nov 22, 2015 at 8:58 PM David Cole <DLRdave at aol.com> wrote:
>>>>
>>>>> The DEPENDS property of a test is meant to ensure test running order
>>>>> in the case of parallel testing... It simply ensures that one test runs
>>>>> before another. It is not connected to the build system at all. It's
>>>>> different than target dependencies.
>>>>>
>>>>>
>>>>> D
>>>>>
>>>>>
>>>>>
>>>>> On Sunday, November 22, 2015, David Cole <DLRdave at aol.com> wrote:
>>>>>
>>>>>> What do you mean by "depend" in this case? All libs and exes should
>>>>>> be built during a "make" or "make all" or "make install" ... And all that
>>>>>> should be done before any tests get run.
>>>>>>
>>>>>> Simply typing "ctest" to execute all the tests never does any
>>>>>> building. The assumed workflow is that you build stuff first and then run
>>>>>> the tests.
>>>>>>
>>>>>> If you want, you can add a custom target that runs a test, and make
>>>>>> that custom target depend on any other targets, but ctest still won't know
>>>>>> about it. Only "make custom_test_target" will...
>>>>>>
>>>>>>
>>>>>> D
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Sunday, November 22, 2015, Nico Schlömer <nico.schloemer at gmail.com>
>>>>>> wrote:
>>>>>>
>>>>>>> Thanks for the hints!
>>>>>>> I'm almost there now, the only thing missing is to have my test
>>>>>>> depend on the custom_target. This
>>>>>>> ```
>>>>>>> SET_TESTS_PROPERTIES(testname PROPERTIES DEPENDS convert)
>>>>>>> ```
>>>>>>> doesn't do the trick: The target `convert` isn't executed before
>>>>>>> `ctest`.
>>>>>>>
>>>>>>> Any hints?
>>>>>>>
>>>>>>> Cheers,
>>>>>>> Nico
>>>>>>>
>>>>>>>
>>>>>>> On Sun, Nov 22, 2015 at 3:18 AM David Cole <DLRdave at aol.com> wrote:
>>>>>>>
>>>>>>>> Did you try using full path names for the add_custom_command file
>>>>>>>> names?
>>>>>>>>
>>>>>>>> And the NAME/COMMAND form of the add_test command?
>>>>>>>>
>>>>>>>> Also, I've always found custom commands to work best when they're
>>>>>>>> associated with a target. And if it was part of a target you could make the
>>>>>>>> target depend on the external data target with add_dependencies if
>>>>>>>> necessary.
>>>>>>>>
>>>>>>>>
>>>>>>>> HTH,
>>>>>>>> David C.
>>>>>>>>
>>>>>>>>
>>>>>>>> On Saturday, November 21, 2015, Nico Schlömer <
>>>>>>>> nico.schloemer at gmail.com> wrote:
>>>>>>>>
>>>>>>>>> Hi everyone,
>>>>>>>>>
>>>>>>>>> I would like to create a CMake test that does the following:
>>>>>>>>>  * Download a file from an external resource
>>>>>>>>>  * Do something with the file
>>>>>>>>>  * compile an executable myTest
>>>>>>>>>  * execute myTest outputfile
>>>>>>>>>
>>>>>>>>> Using ExternalData for downloading the file works well, but the
>>>>>>>>> second step (file conversion, in this example cp for simplicity) does not
>>>>>>>>> work:
>>>>>>>>> ```
>>>>>>>>> cmake_minimum_required(VERSION 3.2)
>>>>>>>>>
>>>>>>>>> project(mytest)
>>>>>>>>>
>>>>>>>>> # Download the files
>>>>>>>>> INCLUDE(ExternalData)
>>>>>>>>> set(
>>>>>>>>>   ExternalData_URL_TEMPLATES
>>>>>>>>>   "
>>>>>>>>> https://downloads.sourceforge.net/project/noshdata/%(algo)/%(hash)
>>>>>>>>> "
>>>>>>>>>   )
>>>>>>>>> ExternalData_Expand_Arguments(
>>>>>>>>>   testFetchData
>>>>>>>>>   OUT_DATA DATA{${CMAKE_SOURCE_DIR}/test.e}
>>>>>>>>>   )
>>>>>>>>> ExternalData_Add_Target(testFetchData)
>>>>>>>>>
>>>>>>>>> add_custom_command(
>>>>>>>>>   OUTPUT test.g
>>>>>>>>>   COMMAND cp test.e test.g
>>>>>>>>>   DEPENDS test.e
>>>>>>>>>   )
>>>>>>>>>
>>>>>>>>> ADD_EXECUTABLE("myTest" main.cpp)
>>>>>>>>>
>>>>>>>>> add_test(myTest test.g)
>>>>>>>>> ```
>>>>>>>>> I suppose I'm missing something about the dependencies here; after
>>>>>>>>> all, the `add_custom_command` has to wait for `testFetchData` to complete.
>>>>>>>>> Likewise, `add_test` has to wait for `add_custom_command` to complete.
>>>>>>>>>
>>>>>>>>> Hints appreciated.
>>>>>>>>>
>>>>>>>>> Cheers,
>>>>>>>>> Nico
>>>>>>>>>
>>>>>>>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake/attachments/20151123/164f9fbf/attachment-0001.html>


More information about the CMake mailing list