| 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 |