/* Definitions of dependency data structures for GNU Make.
-Copyright (C) 1988-2020 Free Software Foundation, Inc.
+Copyright (C) 1988-2022 Free Software Foundation, Inc.
This file is part of GNU Make.
GNU Make is free software; you can redistribute it and/or modify it under the
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
-this program. If not, see <http://www.gnu.org/licenses/>. */
+this program. If not, see <https://www.gnu.org/licenses/>. */
/* Structure used in chains of names, for parsing and globbing. */
These flags are saved in the 'flags' field of each
'struct goaldep' in the chain returned by 'read_all_makefiles'. */
+#define RM_NOFLAG 0
#define RM_NO_DEFAULT_GOAL (1 << 0) /* Do not set default goal. */
#define RM_INCLUDED (1 << 1) /* Search makefile search path. */
#define RM_DONTCARE (1 << 2) /* No error if it doesn't exist. */
#define RM_NO_TILDE (1 << 3) /* Don't expand ~ in file name. */
-#define RM_NOFLAG 0
/* Structure representing one dependency of a file.
Each struct file's 'deps' points to a chain of these, through 'next'.
- 'stem' is the stem for this dep line of static pattern rule or NULL. */
+ 'stem' is the stem for this dep line of static pattern rule or NULL.
+ explicit is set when implicit rule search is performed and the prerequisite
+ does not contain %. When explicit is set the file is not intermediate. */
+
#define DEP(_t) \
NAMESEQ (_t); \
struct file *file; \
+ _t *shuf; \
const char *stem; \
unsigned int flags : 8; \
unsigned int changed : 1; \
unsigned int ignore_mtime : 1; \
unsigned int staticpattern : 1; \
unsigned int need_2nd_expansion : 1; \
- unsigned int ignore_automatic_vars : 1
+ unsigned int ignore_automatic_vars : 1; \
+ unsigned int is_explicit : 1; \
+ unsigned int wait_here : 1
struct dep
{
#define PARSEFS_EXISTS 0x0008
#define PARSEFS_NOCACHE 0x0010
#define PARSEFS_ONEWORD 0x0020
+#define PARSEFS_WAIT 0x0040
#define PARSE_FILE_SEQ(_s,_t,_c,_p,_f) \
(_t *)parse_file_seq ((_s),sizeof (_t),(_c),(_p),(_f))
struct nameseq *ar_glob (const char *arname, const char *member_pattern, size_t size);
#endif
-#define dep_name(d) ((d)->name ? (d)->name : (d)->file->name)
+#define dep_name(d) ((d)->name ? (d)->name : (d)->file->name)
-#define alloc_seq_elt(_t) xcalloc (sizeof (_t))
+#define alloc_seq_elt(_t) xcalloc (sizeof (_t))
void free_ns_chain (struct nameseq *n);
#if defined(MAKE_MAINTAINER_MODE) && defined(__GNUC__) && !defined(__STRICT_ANSI__)
/* Use inline to get real type-checking. */
#define SI static inline
-SI struct nameseq *alloc_ns() { return alloc_seq_elt (struct nameseq); }
-SI struct dep *alloc_dep() { return alloc_seq_elt (struct dep); }
-SI struct goaldep *alloc_goaldep() { return alloc_seq_elt (struct goaldep); }
-
-SI void free_ns(struct nameseq *n) { free (n); }
-SI void free_dep(struct dep *d) { free_ns ((struct nameseq *)d); }
-SI void free_goaldep(struct goaldep *g) { free_dep ((struct dep *)g); }
-
-SI void free_dep_chain(struct dep *d) { free_ns_chain((struct nameseq *)d); }
-SI void free_goal_chain(struct goaldep *g) { free_dep_chain((struct dep *)g); }
+SI struct nameseq *alloc_ns (void) { return alloc_seq_elt (struct nameseq); }
+SI struct dep *alloc_dep (void) { return alloc_seq_elt (struct dep); }
+SI struct goaldep *alloc_goaldep (void) { return alloc_seq_elt (struct goaldep); }
+
+SI void free_ns (struct nameseq *n) { free (n); }
+SI void free_dep (struct dep *d) { free_ns ((struct nameseq *)d); }
+SI void free_goaldep (struct goaldep *g) { free_dep ((struct dep *)g); }
+SI void free_dep_chain (struct dep *d) { free_ns_chain((struct nameseq *)d); }
+SI void free_goal_chain (struct goaldep *g) { free_dep_chain((struct dep *)g); }
#else
# define alloc_ns() alloc_seq_elt (struct nameseq)
# define alloc_dep() alloc_seq_elt (struct dep)