diff options
author | Roland McGrath <roland@redhat.com> | 1996-03-20 00:56:52 +0000 |
---|---|---|
committer | Roland McGrath <roland@redhat.com> | 1996-03-20 00:56:52 +0000 |
commit | 8b2aca5930b9c761cfcd843411c2935bb0e8bf32 (patch) | |
tree | 7a7af6de15cea0b7b585d45569ca804d0051dfd9 | |
parent | b8ea37e31cc6b81a77743383641b48c1158cc94a (diff) | |
download | gunmake-8b2aca5930b9c761cfcd843411c2935bb0e8bf32.tar.gz |
Sun Jul 30 00:49:53 1995 Richard Stallman <rms@mole.gnu.ai.mit.edu>
* file.h (struct file): New field `secondary'.
* file.c (snap_deps): Check for .INTERMEDIATE and .SECONDARY.
(remove_intermediates): Don't delete .SECONDARY files.
-rw-r--r-- | file.c | 41 | ||||
-rw-r--r-- | file.h | 13 |
2 files changed, 50 insertions, 4 deletions
@@ -303,7 +303,8 @@ remove_intermediates (sig) doneany = 0; for (i = 0; i < FILE_BUCKETS; ++i) for (f = files[i]; f != 0; f = f->next) - if (f->intermediate && (f->dontcare || !f->precious)) + if (f->intermediate && (f->dontcare || !f->precious) + && !f->secondary) { int status; if (f->update_status == -1) @@ -349,7 +350,8 @@ remove_intermediates (sig) /* For each dependency of each file, make the `struct dep' point at the appropriate `struct file' (which may have to be created). - Also mark the files depended on by .PRECIOUS and .PHONY. */ + Also mark the files depended on by .PRECIOUS, .PHONY, .SILENT, + and various other special targets. */ void snap_deps () @@ -387,6 +389,41 @@ snap_deps () f2->last_mtime = (time_t) -1; } + for (f = lookup_file (".INTERMEDIATE"); f != 0; f = f->prev) + { + /* .INTERMEDIATE with deps listed + marks those deps as intermediate files. */ + for (d = f->deps; d != 0; d = d->next) + for (f2 = d->file; f2 != 0; f2 = f2->prev) + f2->intermediate = 1; + /* .INTERMEDIATE with no deps does nothing. + Marking all files as intermediates is useless + since the goal targets would be deleted after they are built. */ + } + + for (f = lookup_file (".SECONDARY"); f != 0; f = f->prev) + { + /* .SECONDARY with deps listed + marks those deps as intermediate files + in that they don't get rebuilt if not actually needed; + but unlike real intermediate files, + these are not deleted after make finishes. */ + if (f->deps) + { + for (d = f->deps; d != 0; d = d->next) + for (f2 = d->file; f2 != 0; f2 = f2->prev) + f2->intermediate = f2->secondary = 1; + } + /* .SECONDARY with no deps listed marks *all* files that way. */ + else + { + int i; + for (i = 0; i < FILE_BUCKETS; i++) + for (f2 = files[i]; f2; f2= f2->next) + f2->intermediate = f2->secondary = 1; + } + } + f = lookup_file (".EXPORT_ALL_VARIABLES"); if (f != 0 && f->is_target) export_all_variables = 1; @@ -72,6 +72,9 @@ struct file unsigned int phony:1; /* Nonzero if this is a phony file i.e., a dependency of .PHONY. */ unsigned int intermediate:1;/* Nonzero if this is an intermediate file. */ + /* Nonzero, for an intermediate file, + means remove_intermediates should not delete it. */ + unsigned int secondary:1; unsigned int dontcare:1; /* Nonzero if no complaint is to be made if this target cannot be remade. */ }; @@ -89,11 +92,17 @@ extern void rename_file (), file_hash_enter (); extern void set_command_state (); +/* Return the mtime of file F (a struct file *), caching it. + The value is -1 if the file does not exist. */ +#define file_mtime(f) file_mtime_1 ((f), 1) +/* Return the mtime of file F (a struct file *), caching it. + Don't search using vpath for the file--if it doesn't actually exist, + we don't find it. + The value is -1 if the file does not exist. */ +#define file_mtime_no_search(f) file_mtime_1 ((f), 0) extern time_t f_mtime (); #define file_mtime_1(f, v) \ ((f)->last_mtime != (time_t) 0 ? (f)->last_mtime : f_mtime ((f), v)) -#define file_mtime(f) file_mtime_1 ((f), 1) -#define file_mtime_no_search(f) file_mtime_1 ((f), 0) /* Modtime value to use for `infinitely new'. We used to get the current time from the system and use that whenever we wanted `new'. But that causes |