[CMake] Copy files to build folder

Michael Wild themiwi at gmail.com
Tue Jan 17 08:19:57 EST 2012


AFAICS these files are considered to be source files, right? So they
should be explicitly listed in the CMakeLists.txt file. If your
CMakeLists.txt file gets too big, you can put the relevant code into
another file and then include() it from the CMakeLists.txt.

Doing this also helps you detecting errors early on. E.g. it is much
less likely that a developer forgets to add the new file to the version
control when you do it this way, because it's not enough to just drop
the file into the source tree.

Also, once you have the files in your CMakeLists.txt, you might as well
just use configure_file(... COPYONLY).

Michael

On 01/17/2012 02:07 PM, Tim Hutton wrote:
> Thanks Andreas, but that leaves us with having to edit the
> CMakeLists.txt every time we add a pattern file. There must be a
> better way?
> 
> On 17 January 2012 13:02, Andreas Pakulat <apaku at gmx.de> wrote:
>> On 17.01.12 12:54:28, Tim Hutton wrote:
>>> We've got this section in our CMakeLists.txt:
>>>
>>> #--------------------------copy pattern files to build
>>> folder---------------------------------
>>>
>>> file( GLOB_RECURSE pattern_files RELATIVE
>>> "${CMAKE_CURRENT_SOURCE_DIR}/" "patterns/*.vti" )
>>> foreach( pattern_file ${pattern_files} )
>>>   add_custom_command(
>>>     OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${pattern_file}"
>>>     COMMAND cmake -E copy
>>> "${CMAKE_CURRENT_SOURCE_DIR}/${pattern_file}"
>>> "${CMAKE_CURRENT_BINARY_DIR}/${pattern_file}"
>>>     DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/${pattern_file}"
>>>   )
>>>   list( APPEND pattern_files_dest "${pattern_file}" )
>>> endforeach( pattern_file )
>>>
>>> add_custom_target( CopyPatterns ALL DEPENDS ${pattern_files_dest} )
>>>
>>> #-----------------------------------------------------------------------------------------------
>>>
>>> The idea is to copy all the *.vti files in the "patterns" folder (and
>>> subfolders) into the build folder, so our program can load them. This
>>> works fine when running CMake for the first time. However, if we add a
>>> new pattern file it doesn't get picked up, even after make clean. (It
>>> works if we edit the CMakeLists.txt, or delete everything in the build
>>> folder.) Is there a way to make this work every time?
>>
>> Don't use GLOB, but list all files individually in a variable and
>> iterate over that. CMake is not executed when doing a make call and no
>> cmake-related file has changed and hence the above code is not re-run on
>> each make call.
>>
>> Andreas
>>




More information about the CMake mailing list