VirtualBox

source: kBuild/trunk/src/kmk/filedef.h@ 3387

Last change on this file since 3387 was 3140, checked in by bird, 6 years ago

kmk: Merged in changes from GNU make 4.2.1 (2e55f5e4abdc0e38c1d64be703b446695e70b3b6 / https://git.savannah.gnu.org/git/make.git).

  • Property svn:eol-style set to native
File size: 11.5 KB
Line 
1/* Definition of target file data structures for GNU Make.
2Copyright (C) 1988-2016 Free Software Foundation, Inc.
3This file is part of GNU Make.
4
5GNU Make is free software; you can redistribute it and/or modify it under the
6terms of the GNU General Public License as published by the Free Software
7Foundation; either version 3 of the License, or (at your option) any later
8version.
9
10GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
11WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12A PARTICULAR PURPOSE. See the GNU General Public License for more details.
13
14You should have received a copy of the GNU General Public License along with
15this program. If not, see <http://www.gnu.org/licenses/>. */
16
17
18/* Structure that represents the info on one file
19 that the makefile says how to make.
20 All of these are chained together through 'next'. */
21
22#include "hash.h"
23
24struct file
25 {
26 const char *name;
27 const char *hname; /* Hashed filename */
28 const char *vpath; /* VPATH/vpath pathname */
29 struct dep *deps; /* all dependencies, including duplicates */
30#ifdef CONFIG_WITH_LAZY_DEPS_VARS
31 struct dep *deps_no_dupes; /* dependencies without duplicates, created on
32 demaned by func_deps. */
33#endif
34 struct commands *cmds; /* Commands to execute for this target. */
35 const char *stem; /* Implicit stem, if an implicit
36 rule has been used */
37 struct dep *also_make; /* Targets that are made by making this. */
38 struct file *prev; /* Previous entry for same file name;
39 used when there are multiple double-colon
40 entries for the same file. */
41 struct file *last; /* Last entry for the same file name. */
42
43 /* File that this file was renamed to. After any time that a
44 file could be renamed, call 'check_renamed' (below). */
45 struct file *renamed;
46
47 /* List of variable sets used for this file. */
48 struct variable_set_list *variables;
49
50 /* Pattern-specific variable reference for this target, or null if there
51 isn't one. Also see the pat_searched flag, below. */
52 struct variable_set_list *pat_variables;
53
54 /* Immediate dependent that caused this target to be remade,
55 or nil if there isn't one. */
56 struct file *parent;
57
58 /* For a double-colon entry, this is the first double-colon entry for
59 the same file. Otherwise this is null. */
60 struct file *double_colon;
61
62#ifdef CONFIG_WITH_EXPLICIT_MULTITARGET
63 /* For a target of an explicit multi target rule, this points to the
64 primary target. Otherwise this is null. */
65 struct file *multi_head;
66 /* Pointer to next target of an explicit multi target rule. */
67 struct file *multi_next;
68#endif
69
70#ifdef CONFIG_WITH_COMPILER
71 struct kmk_cc_evalprog *evalprog; /* Pointer to evalval/evalctx "program". */
72#endif
73
74 FILE_TIMESTAMP last_mtime; /* File's modtime, if already known. */
75 FILE_TIMESTAMP mtime_before_update; /* File's modtime before any updating
76 has been performed. */
77 unsigned int considered; /* equal to 'considered' if file has been
78 considered on current scan of goal chain */
79 int command_flags; /* Flags OR'd in for cmds; see commands.h. */
80 enum update_status /* Status of the last attempt to update. */
81 {
82 us_success = 0, /* Successfully updated. Must be 0! */
83 us_none, /* No attempt to update has been made. */
84 us_question, /* Needs to be updated (-q is is set). */
85 us_failed /* Update failed. */
86 } update_status ENUM_BITFIELD (2);
87 enum cmd_state /* State of the commands. */
88 {
89 cs_not_started = 0, /* Not yet started. Must be 0! */
90 cs_deps_running, /* Dep commands running. */
91 cs_running, /* Commands running. */
92 cs_finished /* Commands finished. */
93 } command_state ENUM_BITFIELD (2);
94
95 unsigned int builtin:1; /* True if the file is a builtin rule. */
96 unsigned int precious:1; /* Non-0 means don't delete file on quit */
97 unsigned int loaded:1; /* True if the file is a loaded object. */
98 unsigned int low_resolution_time:1; /* Nonzero if this file's time stamp
99 has only one-second resolution. */
100 unsigned int tried_implicit:1; /* Nonzero if have searched
101 for implicit rule for making
102 this file; don't search again. */
103 unsigned int updating:1; /* Nonzero while updating deps of this file */
104 unsigned int updated:1; /* Nonzero if this file has been remade. */
105 unsigned int is_target:1; /* Nonzero if file is described as target. */
106 unsigned int cmd_target:1; /* Nonzero if file was given on cmd line. */
107 unsigned int phony:1; /* Nonzero if this is a phony file
108 i.e., a prerequisite of .PHONY. */
109 unsigned int intermediate:1;/* Nonzero if this is an intermediate file. */
110 unsigned int secondary:1; /* Nonzero means remove_intermediates should
111 not delete it. */
112 unsigned int dontcare:1; /* Nonzero if no complaint is to be made if
113 this target cannot be remade. */
114 unsigned int ignore_vpath:1;/* Nonzero if we threw out VPATH name. */
115 unsigned int pat_searched:1;/* Nonzero if we already searched for
116 pattern-specific variables. */
117 unsigned int no_diag:1; /* True if the file failed to update and no
118 diagnostics has been issued (dontcare). */
119
120#ifdef CONFIG_WITH_EXPLICIT_MULTITARGET
121 unsigned int multi_maybe:1; /* Nonzero if this file isn't always updated
122 by the explicit multi target rule. */
123#endif
124#ifdef CONFIG_WITH_2ND_TARGET_EXPANSION
125 unsigned int need_2nd_target_expansion:1; /* Nonzero if this file needs
126 second expansion of its name. Whether it
127 can receive this is decided at parse time,
128 and the expanding done in snap_deps. */
129#endif
130#if defined (CONFIG_WITH_COMPILER) || defined (CONFIG_WITH_MAKE_STATS)
131 unsigned int eval_count:14; /* Times evaluated as a makefile. */
132#endif
133 };
134
135
136extern struct file *default_file;
137
138
139struct file *lookup_file (const char *name);
140#ifdef CONFIG_WITH_STRCACHE2
141struct file *lookup_file_cached (const char *name);
142#endif
143struct file *enter_file (const char *name);
144struct dep *split_prereqs (char *prereqstr);
145struct dep *enter_prereqs (struct dep *prereqs, const char *stem);
146void remove_intermediates (int sig);
147void snap_deps (void);
148void rename_file (struct file *file, const char *name);
149void rehash_file (struct file *file, const char *name);
150void set_command_state (struct file *file, enum cmd_state state);
151void notice_finished_file (struct file *file);
152void init_hash_files (void);
153void verify_file_data_base (void);
154char *build_target_list (char *old_list);
155void print_prereqs (const struct dep *deps);
156void print_file_data_base (void);
157int try_implicit_rule (struct file *file, unsigned int depth);
158int stemlen_compare (const void *v1, const void *v2);
159
160#if FILE_TIMESTAMP_HI_RES
161# define FILE_TIMESTAMP_STAT_MODTIME(fname, st) \
162 file_timestamp_cons (fname, (st).st_mtime, (st).ST_MTIM_NSEC)
163#else
164# define FILE_TIMESTAMP_STAT_MODTIME(fname, st) \
165 file_timestamp_cons (fname, (st).st_mtime, 0)
166#endif
167
168/* If FILE_TIMESTAMP is 64 bits (or more), use nanosecond resolution.
169 (Multiply by 2**30 instead of by 10**9 to save time at the cost of
170 slightly decreasing the number of available timestamps.) With
171 64-bit FILE_TIMESTAMP, this stops working on 2514-05-30 01:53:04
172 UTC, but by then uintmax_t should be larger than 64 bits. */
173#define FILE_TIMESTAMPS_PER_S (FILE_TIMESTAMP_HI_RES ? 1000000000 : 1)
174#define FILE_TIMESTAMP_LO_BITS (FILE_TIMESTAMP_HI_RES ? 30 : 0)
175
176#define FILE_TIMESTAMP_S(ts) (((ts) - ORDINARY_MTIME_MIN) \
177 >> FILE_TIMESTAMP_LO_BITS)
178#define FILE_TIMESTAMP_NS(ts) ((int) (((ts) - ORDINARY_MTIME_MIN) \
179 & ((1 << FILE_TIMESTAMP_LO_BITS) - 1)))
180
181/* Upper bound on length of string "YYYY-MM-DD HH:MM:SS.NNNNNNNNN"
182 representing a file timestamp. The upper bound is not necessarily 29,
183 since the year might be less than -999 or greater than 9999.
184
185 Subtract one for the sign bit if in case file timestamps can be negative;
186 subtract FLOOR_LOG2_SECONDS_PER_YEAR to yield an upper bound on how many
187 file timestamp bits might affect the year;
188 302 / 1000 is log10 (2) rounded up;
189 add one for integer division truncation;
190 add one more for a minus sign if file timestamps can be negative;
191 add 4 to allow for any 4-digit epoch year (e.g. 1970);
192 add 25 to allow for "-MM-DD HH:MM:SS.NNNNNNNNN". */
193#define FLOOR_LOG2_SECONDS_PER_YEAR 24
194#define FILE_TIMESTAMP_PRINT_LEN_BOUND \
195 (((sizeof (FILE_TIMESTAMP) * CHAR_BIT - 1 - FLOOR_LOG2_SECONDS_PER_YEAR) \
196 * 302 / 1000) \
197 + 1 + 1 + 4 + 25)
198
199FILE_TIMESTAMP file_timestamp_cons (char const *, time_t, long int);
200FILE_TIMESTAMP file_timestamp_now (int *);
201void file_timestamp_sprintf (char *p, FILE_TIMESTAMP ts);
202
203/* Return the mtime of file F (a struct file *), caching it.
204 The value is NONEXISTENT_MTIME if the file does not exist. */
205#define file_mtime(f) file_mtime_1 ((f), 1)
206/* Return the mtime of file F (a struct file *), caching it.
207 Don't search using vpath for the file--if it doesn't actually exist,
208 we don't find it.
209 The value is NONEXISTENT_MTIME if the file does not exist. */
210#define file_mtime_no_search(f) file_mtime_1 ((f), 0)
211FILE_TIMESTAMP f_mtime (struct file *file, int search);
212#define file_mtime_1(f, v) \
213 ((f)->last_mtime == UNKNOWN_MTIME ? f_mtime ((f), v) : (f)->last_mtime)
214
215/* Special timestamp values. */
216
217/* The file's timestamp is not yet known. */
218#define UNKNOWN_MTIME 0
219
220/* The file does not exist. */
221#define NONEXISTENT_MTIME 1
222
223/* The file does not exist, and we assume that it is older than any
224 actual file. */
225#define OLD_MTIME 2
226
227/* The smallest and largest ordinary timestamps. */
228#define ORDINARY_MTIME_MIN (OLD_MTIME + 1)
229#if FILE_TIMESTAMP_HI_RES == 0 /* bird: shut up annoying warnings!
230 ASSUMES: unsigned FILE_TIMESTAMP ++. */
231# define ORDINARY_MTIME_MAX ( ~ (FILE_TIMESTAMP) 0 )
232#else
233#define ORDINARY_MTIME_MAX ((FILE_TIMESTAMP_S (NEW_MTIME) \
234 << FILE_TIMESTAMP_LO_BITS) \
235 + ORDINARY_MTIME_MIN + FILE_TIMESTAMPS_PER_S - 1)
236#endif
237
238/* Modtime value to use for 'infinitely new'. We used to get the current time
239 from the system and use that whenever we wanted 'new'. But that causes
240 trouble when the machine running make and the machine holding a file have
241 different ideas about what time it is; and can also lose for 'force'
242 targets, which need to be considered newer than anything that depends on
243 them, even if said dependents' modtimes are in the future. */
244#if 1 /* bird: ASSUME the type is unsigned and the wrath of a pedantic gcc. */
245# define NEW_MTIME ( ~ (FILE_TIMESTAMP) 0 )
246#else
247#define NEW_MTIME INTEGER_TYPE_MAXIMUM (FILE_TIMESTAMP)
248#endif
249
250#define check_renamed(file) \
251 while ((file)->renamed != 0) (file) = (file)->renamed /* No ; here. */
252
253/* Have we snapped deps yet? */
254extern int snapped_deps;
Note: See TracBrowser for help on using the repository browser.

© 2023 Oracle
ContactPrivacy policyTerms of Use