delorie.com/djgpp/doc/utils/utils_11.html | search |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
update
update
is a fancy copy-if-needed program. Basically, it compares
the two files you give it, and if they differ, copies one to the other.
This is useful in makefiles where a file is generated often, but its
contents changes rarely, and other files depend on it. For example,
bison
emits a header file each time it parses the grammar. The
header rarely changes, but the grammar changes often. So, you use
update
to copy the header to its real name only when it changes,
and everything else won't need to be recompiled each time.
Usage: update
new_file copied_to
Example:
foo.c foo.h : foo.y bison foo.y update y_tab.h foo.h update y_tab.c foo.c |
Another use of update
might be to validate (and replace if
necessary) a local copy of some master data file:
.PHONY: foo.dat foo.dat: /master/data/foo.dat [ -f $@ ] && cmp -s $< $@ || cp -f $< $@ && touch $@ |
update
is similar to the GNU-standard shell script
move-if-change
that comes with some GNU packages
(e.g., GCC, binutils).
The two are not functionally equivalent, however;
in particular, move-if-change
always removes
the source file in the process of updating the target,
whereas update
leaves the source file intact.
If you need a portable replacement for update
,
there are several options:
move-if-change
script
to perform a "copy-if-change" operation.
cp -f new_file copied_to && touch copied_to |
[ -f copied_to ] \ && cmp -s new_file copied_to \ || cp -f new_file copied_to \ && touch copied_to |
An important feature of update
is that copied_to
is created with the current timestamp.
If you are certain that cp
on your system is not aliased
to cp -p
or cp --preserve
(to preserve timestamps),
then you can omit the `&& touch copied_to' bit in
the above command strings.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
webmaster | delorie software privacy |
Copyright © 2004 | Updated Nov 2004 |