[CMake] write file if different?

Matthew Woehlke matthew.woehlke at kitware.com
Thu May 30 13:36:59 EDT 2013


On 2013-05-30 12:11, j s wrote:
> On Wed, May 29, 2013 at 11:14 PM, themiwi at gmail.com wrote:
>> "j s" wrote:
>>> On 28.05.2013 22:07, Matthew Woehlke wrote:
>>>> Is there a built-in way to write a string to a file (a la FILE(WRITE))
>>>> that will only write the file if the content would be different? (Or
>>>> does FILE(WRITE) already work this way despite no obvious hint in the
>>>> documentation that it does?)
>>>
>>> You can always use the rsync command, which is available for all
>>> systems, including Windows.
>>
>> That's probably the worst possible solution... CMake has everything that iy
>> required to accomplish this built-in, so adding a unnecessary dependency
>> that is only needed by the build system is a really bad idea...
>
> You are entitled to your opinion, but there are several system
> utilities that are available by default on many systems, including
> rsync.

Really? I have yet to encounter a Windows system that has rsync "by 
default". (For that matter, even on Linux it is not required, and I 
wouldn't put a lot of faith in finding it on a 'stock' non-Linux/BSD 
UNIX platform.)

Besides, using rsync for a single file where cmake -E copy_if_different 
(or even configure_file as elsewhere mentioned) is clearly overkill. Not 
to mention that rsync is not guaranteed to be present even on UNIX 
systems, much less Windows, whereas CMake is already being used.

> The way CMake does things is often kludgy and just feels wrong.  I
> often write scripts in more effective languages and then run from
> within CMake on Windows, Linux, and Mac OS X.  Perl and Python are
> often a much better way to go than trying to do everything in CMake.

Sure, and where a) it makes sense and b) I *already require the relevant 
tools for other reasons*, I do also. But I try to avoid it, because 
these dependencies are usually NOT present on Windows, especially for 
end users that want to build from a tarball. (Which is why, when I wrote 
test discovery for gtest, I did it in pure CMake. It may not be the 
easiest/cleanest, but I strongly prefer to avoid large external 
dependencies without much stronger motivation for needing them.)

-- 
Matthew



More information about the CMake mailing list