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

Nico Schlömer nico.schloemer at gmail.com
Mon Nov 23 04:14:27 EST 2015


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/6174b167/attachment-0001.html>


More information about the CMake mailing list