[CMake] copy_if_different on build
Matthew Woehlke
matthew.woehlke at kitware.com
Mon Apr 1 12:41:38 EDT 2013
On 2013-03-29 17:07, Skippy VonDrake wrote:
> I'll look closer at add_custom_command. I want the file to copy over if
> it has changed - at build time. Not cmake time. And not copy if it hasn't
> changed. But that may not be doable.
>
> Seems like every StackOverflow post I see has a different take on how
> to do this simple process.
That's a little surprising... as you say, this shouldn't be complicated.
I believe what you want is:
add_custom_command(
OUTPUT "${output}"
DEPENDS "${input}"
COMMAND ${CMAKE_COMMAND} -E copy
"${input}" "${output}"
...which is roughly equivalent to a Makefile rule like:
output: input
cp input output
IOW, the file "${output}" depends on the file "${input}" (so the target
will only run when "${input}" is newer than "${output}"), and will be
created by copying "${input}" to "${output}" (using 'cmake -E' for
portability).
Don't forget to have an actual target depend on "${output}" :-).
(Probably you are using it as a source file for a library or executable,
so there is no problem.)
You may also want to use 'copy_if_different' instead of just 'copy',
which won't change the time stamp of "${output}" if the contents are the
same as "${input}". On the plus side, this means that large targets
depending on "${output}" won't be needlessly rebuilt/relinked. On the
down side, the copy_if_different will remain out of date, and as a
result still think it needs to run after a successful build.
--
Matthew
More information about the CMake
mailing list