source: trunk/src/kmk/filedef.h

Last change on this file was 3140, checked in by bird, 7 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
RevLine 
[53]1/* Definition of target file data structures for GNU Make.
[3140]2Copyright (C) 1988-2016 Free Software Foundation, Inc.
[53]3This file is part of GNU Make.
4
[503]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
[1993]7Foundation; either version 3 of the License, or (at your option) any later
8version.
[53]9
[503]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.
[53]13
[503]14You should have received a copy of the GNU General Public License along with
[1993]15this program. If not, see <http://www.gnu.org/licenses/>. */
[53]16
17
18/* Structure that represents the info on one file
19 that the makefile says how to make.
[3140]20 All of these are chained together through 'next'. */
[53]21
22#include "hash.h"
23
24struct file
25 {
[903]26 const char *name;
27 const char *hname; /* Hashed filename */
28 const char *vpath; /* VPATH/vpath pathname */
[53]29 struct dep *deps; /* all dependencies, including duplicates */
[1934]30#ifdef CONFIG_WITH_LAZY_DEPS_VARS
[2594]31 struct dep *deps_no_dupes; /* dependencies without duplicates, created on
32 demaned by func_deps. */
[1934]33#endif
[3140]34 struct commands *cmds; /* Commands to execute for this target. */
35 const char *stem; /* Implicit stem, if an implicit
[903]36 rule has been used */
[3140]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. */
[503]41 struct file *last; /* Last entry for the same file name. */
[53]42
43 /* File that this file was renamed to. After any time that a
[3140]44 file could be renamed, call 'check_renamed' (below). */
[53]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
[921]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
[2788]70#ifdef CONFIG_WITH_COMPILER
71 struct kmk_cc_evalprog *evalprog; /* Pointer to evalval/evalctx "program". */
72#endif
73
[3140]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. */
[53]93 } command_state ENUM_BITFIELD (2);
94
[3140]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. */
[53]100 unsigned int tried_implicit:1; /* Nonzero if have searched
[3140]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. */
[53]109 unsigned int intermediate:1;/* Nonzero if this is an intermediate file. */
[503]110 unsigned int secondary:1; /* Nonzero means remove_intermediates should
111 not delete it. */
[3140]112 unsigned int dontcare:1; /* Nonzero if no complaint is to be made if
113 this target cannot be remade. */
[53]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. */
[2591]117 unsigned int no_diag:1; /* True if the file failed to update and no
118 diagnostics has been issued (dontcare). */
119
[921]120#ifdef CONFIG_WITH_EXPLICIT_MULTITARGET
[922]121 unsigned int multi_maybe:1; /* Nonzero if this file isn't always updated
122 by the explicit multi target rule. */
[921]123#endif
[1857]124#ifdef CONFIG_WITH_2ND_TARGET_EXPANSION
125 unsigned int need_2nd_target_expansion:1; /* Nonzero if this file needs
[1701]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
[2788]130#if defined (CONFIG_WITH_COMPILER) || defined (CONFIG_WITH_MAKE_STATS)
131 unsigned int eval_count:14; /* Times evaluated as a makefile. */
132#endif
[53]133 };
134
135
[3140]136extern struct file *default_file;
[53]137
138
[903]139struct file *lookup_file (const char *name);
[1975]140#ifdef CONFIG_WITH_STRCACHE2
[1857]141struct file *lookup_file_cached (const char *name);
142#endif
[903]143struct file *enter_file (const char *name);
[2591]144struct dep *split_prereqs (char *prereqstr);
145struct dep *enter_prereqs (struct dep *prereqs, const char *stem);
[903]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);
[3140]153void verify_file_data_base (void);
[903]154char *build_target_list (char *old_list);
[2591]155void print_prereqs (const struct dep *deps);
156void print_file_data_base (void);
[3140]157int try_implicit_rule (struct file *file, unsigned int depth);
158int stemlen_compare (const void *v1, const void *v2);
[53]159
160#if FILE_TIMESTAMP_HI_RES
161# define FILE_TIMESTAMP_STAT_MODTIME(fname, st) \
[3140]162 file_timestamp_cons (fname, (st).st_mtime, (st).ST_MTIM_NSEC)
[53]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) \
[3140]177 >> FILE_TIMESTAMP_LO_BITS)
[53]178#define FILE_TIMESTAMP_NS(ts) ((int) (((ts) - ORDINARY_MTIME_MIN) \
[3140]179 & ((1 << FILE_TIMESTAMP_LO_BITS) - 1)))
[53]180
181/* Upper bound on length of string "YYYY-MM-DD HH:MM:SS.NNNNNNNNN"
[3140]182 representing a file timestamp. The upper bound is not necessarily 29,
[53]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
[3140]199FILE_TIMESTAMP file_timestamp_cons (char const *, time_t, long int);
[903]200FILE_TIMESTAMP file_timestamp_now (int *);
201void file_timestamp_sprintf (char *p, FILE_TIMESTAMP ts);
[53]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)
[903]211FILE_TIMESTAMP f_mtime (struct file *file, int search);
[53]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)
[1995]229#if FILE_TIMESTAMP_HI_RES == 0 /* bird: shut up annoying warnings!
[2001]230 ASSUMES: unsigned FILE_TIMESTAMP ++. */
231# define ORDINARY_MTIME_MAX ( ~ (FILE_TIMESTAMP) 0 )
[1995]232#else
[53]233#define ORDINARY_MTIME_MAX ((FILE_TIMESTAMP_S (NEW_MTIME) \
[3140]234 << FILE_TIMESTAMP_LO_BITS) \
235 + ORDINARY_MTIME_MIN + FILE_TIMESTAMPS_PER_S - 1)
[1995]236#endif
[53]237
[3140]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
[53]240 trouble when the machine running make and the machine holding a file have
[3140]241 different ideas about what time it is; and can also lose for 'force'
[53]242 targets, which need to be considered newer than anything that depends on
243 them, even if said dependents' modtimes are in the future. */
[2001]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
[53]247#define NEW_MTIME INTEGER_TYPE_MAXIMUM (FILE_TIMESTAMP)
[2001]248#endif
[53]249
250#define check_renamed(file) \
251 while ((file)->renamed != 0) (file) = (file)->renamed /* No ; here. */
[280]252
253/* Have we snapped deps yet? */
254extern int snapped_deps;
Note: See TracBrowser for help on using the repository browser.