Sun Jul 14 12:59:27 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu>
[platform/upstream/make.git] / filedef.h
1 /* Definition of target file data structures for GNU Make.
2 Copyright (C) 1988, 89, 90, 91, 92, 93, 94 Free Software Foundation, Inc.
3 This file is part of GNU Make.
4
5 GNU Make is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2, or (at your option)
8 any later version.
9
10 GNU Make is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with GNU Make; see the file COPYING.  If not, write to
17 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
18
19 /* Structure that represents the info on one file
20    that the makefile says how to make.
21    All of these are chained together through `next'.  */
22
23 struct file
24   {
25     struct file *next;
26     char *name;
27     struct dep *deps;
28     struct commands *cmds;      /* Commands to execute for this target.  */
29     int command_flags;          /* Flags OR'd in for cmds; see commands.h.  */
30     char *stem;                 /* Implicit stem, if an implicit
31                                    rule has been used */
32     struct dep *also_make;      /* Targets that are made by making this.  */
33     time_t last_mtime;          /* File's modtime, if already known.  */
34     struct file *prev;          /* Previous entry for same file name;
35                                    used when there are multiple double-colon
36                                    entries for the same file.  */
37
38     /* File that this file was renamed to.  After any time that a
39        file could be renamed, call `check_renamed' (below).  */
40     struct file *renamed;
41
42     /* List of variable sets used for this file.  */
43     struct variable_set_list *variables;
44
45     /* Immediate dependent that caused this target to be remade,
46        or nil if there isn't one.  */
47     struct file *parent;
48
49     /* For a double-colon entry, this is the first double-colon entry for
50        the same file.  Otherwise this is null.  */
51     struct file *double_colon;
52
53     short int update_status;    /* Status of the last attempt to update,
54                                    or -1 if none has been made.  */
55
56     enum                        /* State of the commands.  */
57       {         /* Note: It is important that cs_not_started be zero.  */
58         cs_not_started,         /* Not yet started.  */
59         cs_deps_running,        /* Dep commands running.  */
60         cs_running,             /* Commands running.  */
61         cs_finished             /* Commands finished.  */
62       } command_state ENUM_BITFIELD (2);
63
64     unsigned int precious:1;    /* Non-0 means don't delete file on quit */
65     unsigned int tried_implicit:1; /* Nonzero if have searched
66                                       for implicit rule for making
67                                       this file; don't search again.  */
68     unsigned int updating:1;    /* Nonzero while updating deps of this file */
69     unsigned int updated:1;     /* Nonzero if this file has been remade.  */
70     unsigned int is_target:1;   /* Nonzero if file is described as target.  */
71     unsigned int cmd_target:1;  /* Nonzero if file was given on cmd line.  */
72     unsigned int phony:1;       /* Nonzero if this is a phony file
73                                    i.e., a dependency of .PHONY.  */
74     unsigned int intermediate:1;/* Nonzero if this is an intermediate file.  */
75     /* Nonzero, for an intermediate file,
76        means remove_intermediates should not delete it.  */
77     unsigned int secondary:1;
78     unsigned int dontcare:1;    /* Nonzero if no complaint is to be made if
79                                    this target cannot be remade.  */
80   };
81
82 /* Number of intermediate files entered.  */
83
84 extern unsigned int num_intermediates;
85
86 extern struct file *default_goal_file, *suffix_file, *default_file;
87
88
89 extern struct file *lookup_file (), *enter_file ();
90 extern void remove_intermediates (), snap_deps ();
91 extern void rename_file (), file_hash_enter ();
92 extern void set_command_state ();
93
94
95 /* Return the mtime of file F (a struct file *), caching it.
96    The value is -1 if the file does not exist.  */
97 #define file_mtime(f) file_mtime_1 ((f), 1)
98 /* Return the mtime of file F (a struct file *), caching it.
99    Don't search using vpath for the file--if it doesn't actually exist,
100    we don't find it.
101    The value is -1 if the file does not exist.  */
102 #define file_mtime_no_search(f) file_mtime_1 ((f), 0)
103 extern time_t f_mtime ();
104 #define file_mtime_1(f, v) \
105   ((f)->last_mtime != (time_t) 0 ? (f)->last_mtime : f_mtime ((f), v))
106
107 /* Modtime value to use for `infinitely new'.  We used to get the current time
108    from the system and use that whenever we wanted `new'.  But that causes
109    trouble when the machine running make and the machine holding a file have
110    different ideas about what time it is; and can also lose for `force'
111    targets, which need to be considered newer than anything that depends on
112    them, even if said dependents' modtimes are in the future.
113
114    NOTE: This assumes 32-bit `time_t's, but I cannot think of a portable way
115    to produce the largest representable integer of a given signed type.  */
116 #define NEW_MTIME       ((time_t) 0x7fffffff)
117
118
119 #define check_renamed(file) \
120   while ((file)->renamed != 0) (file) = (file)->renamed /* No ; here.  */