VirtualBox

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

Last change on this file since 2074 was 2001, checked in by bird, 16 years ago

kmk: pedantic warnings.

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

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette