source: trunk/src/kmk/file.c@ 1980

Last change on this file since 1980 was 1980, checked in by bird, 17 years ago

kmk: Some cleanup.

  • Property svn:eol-style set to native
File size: 39.3 KB
Line 
1/* Target file management for GNU Make.
2Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
31998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 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 2, or (at your option) any later version.
10
11GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
12WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
13A PARTICULAR PURPOSE. See the GNU General Public License for more details.
14
15You should have received a copy of the GNU General Public License along with
16GNU Make; see the file COPYING. If not, write to the Free Software
17Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */
18
19#include "make.h"
20
21#include <assert.h>
22
23#include "dep.h"
24#include "filedef.h"
25#include "job.h"
26#include "commands.h"
27#include "variable.h"
28#include "debug.h"
29#include "hash.h"
30#ifdef CONFIG_WITH_STRCACHE2
31# include <stddef.h>
32#endif
33
34
35/* Remember whether snap_deps has been invoked: we need this to be sure we
36 don't add new rules (via $(eval ...)) afterwards. In the future it would
37 be nice to support this, but it means we'd need to re-run snap_deps() or
38 at least its functionality... it might mean changing snap_deps() to be run
39 per-file, so we can invoke it after the eval... or remembering which files
40 in the hash have been snapped (a new boolean flag?) and having snap_deps()
41 only work on files which have not yet been snapped. */
42int snapped_deps = 0;
43
44/* Hash table of files the makefile knows how to make. */
45
46#ifndef CONFIG_WITH_STRCACHE2
47static unsigned long
48file_hash_1 (const void *key)
49{
50 return_ISTRING_HASH_1 (((struct file const *) key)->hname);
51}
52
53static unsigned long
54file_hash_2 (const void *key)
55{
56 return_ISTRING_HASH_2 (((struct file const *) key)->hname);
57}
58#endif /* !CONFIG_WITH_STRCACHE2 */
59
60static int
61file_hash_cmp (const void *x, const void *y)
62{
63#ifndef CONFIG_WITH_STRCACHE2
64 return_ISTRING_COMPARE (((struct file const *) x)->hname,
65 ((struct file const *) y)->hname);
66#else /* CONFIG_WITH_STRCACHE2 */
67 return ((struct file const *) x)->hname
68 == ((struct file const *) y)->hname ? 0 : -1;
69#endif /* CONFIG_WITH_STRCACHE2 */
70}
71
72#ifndef FILE_BUCKETS
73#define FILE_BUCKETS 1007
74#endif
75static struct hash_table files;
76
77/* Whether or not .SECONDARY with no prerequisites was given. */
78static int all_secondary = 0;
79
80/* Access the hash table of all file records.
81 lookup_file given a name, return the struct file * for that name,
82 or nil if there is none.
83*/
84
85#ifndef CONFIG_WITH_STRCACHE2
86struct file *
87lookup_file (const char *name)
88#else /* CONFIG_WITH_STRCACHE2 */
89MY_INLINE struct file *
90lookup_file_common (const char *name, int cached)
91#endif /* CONFIG_WITH_STRCACHE2 */
92{
93 struct file *f;
94 struct file file_key;
95#if defined(VMS) && !defined(WANT_CASE_SENSITIVE_TARGETS)
96 char *lname;
97#endif
98
99 assert (*name != '\0');
100
101 /* This is also done in parse_file_seq, so this is redundant
102 for names read from makefiles. It is here for names passed
103 on the command line. */
104#ifdef VMS
105# ifndef WANT_CASE_SENSITIVE_TARGETS
106 if (*name != '.')
107 {
108 const char *n;
109 char *ln;
110 lname = xstrdup (name);
111 for (n = name, ln = lname; *n != '\0'; ++n, ++ln)
112 *ln = isupper ((unsigned char)*n) ? tolower ((unsigned char)*n) : *n;
113 *ln = '\0';
114 name = lname;
115 }
116# endif
117
118 while (name[0] == '[' && name[1] == ']' && name[2] != '\0')
119 name += 2;
120#endif
121 while (name[0] == '.' && name[1] == '/' && name[2] != '\0')
122 {
123 name += 2;
124 while (*name == '/')
125 /* Skip following slashes: ".//foo" is "foo", not "/foo". */
126 ++name;
127 }
128
129 if (*name == '\0')
130 /* It was all slashes after a dot. */
131#if defined(VMS)
132 name = "[]";
133#elif defined(_AMIGA)
134 name = "";
135#else
136 name = "./";
137#endif
138
139#ifndef CONFIG_WITH_STRCACHE2
140 file_key.hname = name;
141 f = hash_find_item (&files, &file_key);
142#else /* CONFIG_WITH_STRCACHE2 */
143 if (!cached)
144 {
145 file_key.hname = strcache2_lookup_file (&file_strcache, name, strlen (name));
146 if (file_key.hname)
147 f = hash_find_item_strcached (&files, &file_key);
148 else
149 f = NULL;
150 }
151 else
152 {
153 file_key.hname = name;
154 f = hash_find_item_strcached (&files, &file_key);
155 }
156
157#endif /* CONFIG_WITH_STRCACHE2 */
158#if defined(VMS) && !defined(WANT_CASE_SENSITIVE_TARGETS)
159 if (*name != '.')
160 free (lname);
161#endif
162
163 return f;
164}
165
166#ifdef CONFIG_WITH_STRCACHE2
167/* Given a name, return the struct file * for that name,
168 or nil if there is none. */
169
170struct file *
171lookup_file (const char *name)
172{
173 return lookup_file_common (name, 0 /* cached */);
174}
175
176/* Given a name in the strcache, return the struct file * for that name,
177 or nil if there is none. */
178struct file *
179lookup_file_cached (const char *name)
180{
181 assert (strcache_iscached (name));
182 return lookup_file_common (name, 1 /* cached */);
183}
184#endif /* CONFIG_WITH_STRCACHE2 */
185
186
187/* Look up a file record for file NAME and return it.
188 Create a new record if one doesn't exist. NAME will be stored in the
189 new record so it should be constant or in the strcache etc.
190 */
191
192struct file *
193enter_file (const char *name)
194{
195 struct file *f;
196 struct file *new;
197 struct file **file_slot;
198 struct file file_key;
199
200 assert (*name != '\0');
201 assert (strcache_iscached (name));
202
203#if defined(VMS) && !defined(WANT_CASE_SENSITIVE_TARGETS)
204 if (*name != '.')
205 {
206 const char *n;
207 char *lname, *ln;
208 lname = xstrdup (name);
209 for (n = name, ln = lname; *n != '\0'; ++n, ++ln)
210 if (isupper ((unsigned char)*n))
211 *ln = tolower ((unsigned char)*n);
212 else
213 *ln = *n;
214
215 *ln = '\0';
216 name = strcache_add (lname);
217 free (lname);
218 }
219#endif
220
221 file_key.hname = name;
222#ifndef CONFIG_WITH_STRCACHE2
223 file_slot = (struct file **) hash_find_slot (&files, &file_key);
224#else /* CONFIG_WITH_STRCACHE2 */
225 file_slot = (struct file **) hash_find_slot_strcached (&files, &file_key);
226#endif /* CONFIG_WITH_STRCACHE2 */
227 f = *file_slot;
228 if (! HASH_VACANT (f) && !f->double_colon)
229 return f;
230
231#ifndef CONFIG_WITH_ALLOC_CACHES
232 new = xmalloc (sizeof (struct file));
233 memset (new, '\0', sizeof (struct file));
234#else
235 new = alloccache_calloc (&file_cache);
236#endif
237 new->name = new->hname = name;
238 new->update_status = -1;
239
240 if (HASH_VACANT (f))
241 {
242 new->last = new;
243 hash_insert_at (&files, new, file_slot);
244 }
245 else
246 {
247 /* There is already a double-colon entry for this file. */
248 new->double_colon = f;
249 f->last->prev = new;
250 f->last = new;
251 }
252
253#ifdef CONFIG_WITH_2ND_TARGET_EXPANSION
254 /* Check if the name needs 2nd expansion or not. */
255 if (second_target_expansion && strchr (name, '$') != NULL)
256 new->need_2nd_target_expansion = 1;
257#endif
258
259 return new;
260}
261
262
263/* Rehash FILE to NAME. This is not as simple as resetting
264 the `hname' member, since it must be put in a new hash bucket,
265 and possibly merged with an existing file called NAME. */
266
267void
268rehash_file (struct file *from_file, const char *to_hname)
269{
270 struct file file_key;
271 struct file **file_slot;
272 struct file *to_file;
273 struct file *deleted_file;
274 struct file *f;
275
276#ifdef CONFIG_WITH_STRCACHE2
277 assert (strcache_iscached (to_hname));
278 assert (strcache_iscached (from_file->hname));
279#endif
280
281 /* If it's already that name, we're done. */
282 file_key.hname = to_hname;
283 if (! file_hash_cmp (from_file, &file_key))
284 return;
285
286 /* Find the end of the renamed list for the "from" file. */
287 file_key.hname = from_file->hname;
288 while (from_file->renamed != 0)
289 from_file = from_file->renamed;
290 if (file_hash_cmp (from_file, &file_key))
291 /* hname changed unexpectedly!! */
292 abort ();
293
294 /* Remove the "from" file from the hash. */
295#ifndef CONFIG_WITH_STRCACHE2
296 deleted_file = hash_delete (&files, from_file);
297#else
298 deleted_file = hash_delete_strcached (&files, from_file);
299#endif
300 if (deleted_file != from_file)
301 /* from_file isn't the one stored in files */
302 abort ();
303
304 /* Find where the newly renamed file will go in the hash. */
305 file_key.hname = to_hname;
306#ifndef CONFIG_WITH_STRCACHE2
307 file_slot = (struct file **) hash_find_slot (&files, &file_key);
308#else /* CONFIG_WITH_STRCACHE2 */
309 file_slot = (struct file **) hash_find_slot_strcached (&files, &file_key);
310#endif /* CONFIG_WITH_STRCACHE2 */
311 to_file = *file_slot;
312
313 /* Change the hash name for this file. */
314 from_file->hname = to_hname;
315 for (f = from_file->double_colon; f != 0; f = f->prev)
316 f->hname = to_hname;
317
318 /* If the new name doesn't exist yet just set it to the renamed file. */
319 if (HASH_VACANT (to_file))
320 {
321 hash_insert_at (&files, from_file, file_slot);
322 return;
323 }
324
325 /* TO_FILE already exists under TO_HNAME.
326 We must retain TO_FILE and merge FROM_FILE into it. */
327
328 if (from_file->cmds != 0)
329 {
330 if (to_file->cmds == 0)
331 to_file->cmds = from_file->cmds;
332 else if (from_file->cmds != to_file->cmds)
333 {
334 /* We have two sets of commands. We will go with the
335 one given in the rule explicitly mentioning this name,
336 but give a message to let the user know what's going on. */
337 if (to_file->cmds->fileinfo.filenm != 0)
338 error (&from_file->cmds->fileinfo,
339 _("Commands were specified for file `%s' at %s:%lu,"),
340 from_file->name, to_file->cmds->fileinfo.filenm,
341 to_file->cmds->fileinfo.lineno);
342 else
343 error (&from_file->cmds->fileinfo,
344 _("Commands for file `%s' were found by implicit rule search,"),
345 from_file->name);
346 error (&from_file->cmds->fileinfo,
347 _("but `%s' is now considered the same file as `%s'."),
348 from_file->name, to_hname);
349 error (&from_file->cmds->fileinfo,
350 _("Commands for `%s' will be ignored in favor of those for `%s'."),
351 to_hname, from_file->name);
352 }
353 }
354
355 /* Merge the dependencies of the two files. */
356
357 if (to_file->deps == 0)
358 to_file->deps = from_file->deps;
359 else
360 {
361 struct dep *deps = to_file->deps;
362 while (deps->next != 0)
363 deps = deps->next;
364 deps->next = from_file->deps;
365 }
366
367 merge_variable_set_lists (&to_file->variables, from_file->variables);
368
369 if (to_file->double_colon && from_file->is_target && !from_file->double_colon)
370 fatal (NILF, _("can't rename single-colon `%s' to double-colon `%s'"),
371 from_file->name, to_hname);
372 if (!to_file->double_colon && from_file->double_colon)
373 {
374 if (to_file->is_target)
375 fatal (NILF, _("can't rename double-colon `%s' to single-colon `%s'"),
376 from_file->name, to_hname);
377 else
378 to_file->double_colon = from_file->double_colon;
379 }
380
381 if (from_file->last_mtime > to_file->last_mtime)
382 /* %%% Kludge so -W wins on a file that gets vpathized. */
383 to_file->last_mtime = from_file->last_mtime;
384
385 to_file->mtime_before_update = from_file->mtime_before_update;
386
387#define MERGE(field) to_file->field |= from_file->field
388 MERGE (precious);
389 MERGE (tried_implicit);
390 MERGE (updating);
391 MERGE (updated);
392 MERGE (is_target);
393 MERGE (cmd_target);
394 MERGE (phony);
395 MERGE (ignore_vpath);
396#undef MERGE
397
398 from_file->renamed = to_file;
399}
400
401/* Rename FILE to NAME. This is not as simple as resetting
402 the `name' member, since it must be put in a new hash bucket,
403 and possibly merged with an existing file called NAME. */
404
405void
406rename_file (struct file *from_file, const char *to_hname)
407{
408 rehash_file (from_file, to_hname);
409 while (from_file)
410 {
411 from_file->name = from_file->hname;
412 from_file = from_file->prev;
413 }
414}
415
416
417#ifdef CONFIG_WITH_2ND_TARGET_EXPANSION
418/* Performs secondary target name expansion and then renames
419 the file using rename_file. */
420static void
421do_2nd_target_expansion (struct file *f)
422{
423 unsigned int len;
424 char *tmp_name = allocated_variable_expand_2 (
425 f->name, strcache2_get_len (&file_strcache, f->name), &len);
426 const char *name = strcache_add_len (tmp_name, len);
427 free (tmp_name);
428 rename_file (f, name);
429}
430#endif /* CONFIG_WITH_2ND_TARGET_EXPANSION */
431
432
433/* Remove all nonprecious intermediate files.
434 If SIG is nonzero, this was caused by a fatal signal,
435 meaning that a different message will be printed, and
436 the message will go to stderr rather than stdout. */
437
438void
439remove_intermediates (int sig)
440{
441 struct file **file_slot;
442 struct file **file_end;
443 int doneany = 0;
444
445 /* If there's no way we will ever remove anything anyway, punt early. */
446 if (question_flag || touch_flag || all_secondary)
447 return;
448
449 if (sig && just_print_flag)
450 return;
451
452 file_slot = (struct file **) files.ht_vec;
453 file_end = file_slot + files.ht_size;
454 for ( ; file_slot < file_end; file_slot++)
455 if (! HASH_VACANT (*file_slot))
456 {
457 struct file *f = *file_slot;
458 /* Is this file eligible for automatic deletion?
459 Yes, IFF: it's marked intermediate, it's not secondary, it wasn't
460 given on the command-line, and it's either a -include makefile or
461 it's not precious. */
462 if (f->intermediate && (f->dontcare || !f->precious)
463 && !f->secondary && !f->cmd_target)
464 {
465 int status;
466 if (f->update_status == -1)
467 /* If nothing would have created this file yet,
468 don't print an "rm" command for it. */
469 continue;
470 if (just_print_flag)
471 status = 0;
472 else
473 {
474 status = unlink (f->name);
475 if (status < 0 && errno == ENOENT)
476 continue;
477 }
478 if (!f->dontcare)
479 {
480 if (sig)
481 error (NILF, _("*** Deleting intermediate file `%s'"), f->name);
482 else
483 {
484 if (! doneany)
485 DB (DB_BASIC, (_("Removing intermediate files...\n")));
486 if (!silent_flag)
487 {
488 if (! doneany)
489 {
490 fputs ("rm ", stdout);
491 doneany = 1;
492 }
493 else
494 putchar (' ');
495 fputs (f->name, stdout);
496 fflush (stdout);
497 }
498 }
499 if (status < 0)
500 perror_with_name ("unlink: ", f->name);
501 }
502 }
503 }
504
505 if (doneany && !sig)
506 {
507 putchar ('\n');
508 fflush (stdout);
509 }
510}
511
512
513struct dep *
514parse_prereqs (char *p)
515{
516#ifndef CONFIG_WITH_ALLOC_CACHES
517 struct dep *new = (struct dep *)
518 multi_glob (parse_file_seq (&p, '|', sizeof (struct dep), 1),
519 sizeof (struct dep));
520#else
521 struct dep *new = (struct dep *)
522 multi_glob (parse_file_seq (&p, '|', &dep_cache, 1), &dep_cache);
523#endif
524
525 if (*p)
526 {
527 /* Files that follow '|' are "order-only" prerequisites that satisfy the
528 dependency by existing: their modification times are irrelevant. */
529 struct dep *ood;
530
531 ++p;
532#ifndef CONFIG_WITH_ALLOC_CACHES
533 ood = (struct dep *)
534 multi_glob (parse_file_seq (&p, '\0', sizeof (struct dep), 1),
535 sizeof (struct dep));
536#else
537 ood = (struct dep *)
538 multi_glob (parse_file_seq (&p, '\0', &dep_cache, 1), &dep_cache);
539#endif
540
541 if (! new)
542 new = ood;
543 else
544 {
545 struct dep *dp;
546 for (dp = new; dp->next != NULL; dp = dp->next)
547 ;
548 dp->next = ood;
549 }
550
551 for (; ood != NULL; ood = ood->next)
552 ood->ignore_mtime = 1;
553 }
554
555 return new;
556}
557
558/* Set the intermediate flag. */
559
560static void
561set_intermediate (const void *item)
562{
563 struct file *f = (struct file *) item;
564 f->intermediate = 1;
565}
566
567/* Expand and parse each dependency line. */
568static void
569expand_deps (struct file *f)
570{
571 struct dep *d;
572 struct dep *old = f->deps;
573 const char *file_stem = f->stem;
574 unsigned int last_dep_has_cmds = f->updating;
575 int initialized = 0;
576
577 f->updating = 0;
578 f->deps = 0;
579
580 for (d = old; d != 0; d = d->next)
581 {
582 size_t buffer_offset; /* bird */
583 struct dep *new, *d1;
584 char *p;
585#ifdef CONFIG_WITH_STRCACHE2
586 unsigned int len;
587#endif
588
589 if (! d->name)
590 continue;
591
592#ifdef CONFIG_WITH_INCLUDEDEP
593 /* Dependencies loaded by includedep are ready for use and we skip
594 the expensive parsing and globbing for them. To avoid wasting
595 lots of time walking the f->deps chain, we will advance D and
596 process all subsequent includedep records. */
597
598 if (d->includedep)
599 {
600 new = d1 = alloc_dep();
601 d1->staticpattern = 0;
602 d1->need_2nd_expansion = 0;
603 d1->includedep = 1;
604 d1->file = lookup_file (d->name);
605 if (d1->file == 0)
606 d1->file = enter_file (d->name);
607
608 while (d->next && d->next->includedep)
609 {
610 d = d->next;
611 d1 = d1->next = alloc_dep();
612 d1->staticpattern = 0;
613 d1->need_2nd_expansion = 0;
614 d1->includedep = 1;
615 d1->file = lookup_file (d->name);
616 if (d1->file == 0)
617 d1->file = enter_file (d->name);
618 }
619 }
620 else
621 {
622#endif
623
624 /* Create the dependency list.
625 If we're not doing 2nd expansion, then it's just the name. We will
626 still need to massage it though. */
627 if (! d->need_2nd_expansion)
628 {
629 p = variable_expand ("");
630 buffer_offset = p - variable_buffer;
631#ifndef CONFIG_WITH_STRCACHE2
632 variable_buffer_output (p, d->name, strlen (d->name) + 1);
633#else
634 len = strcache2_get_len (&file_strcache, d->name);
635 variable_buffer_output (p, d->name, len + 1);
636#endif
637 p = variable_buffer + buffer_offset; /* bird - variable_buffer may have been reallocated. (observed it) */
638 }
639 else
640 {
641 /* If it's from a static pattern rule, convert the patterns into
642 "$*" so they'll expand properly. */
643 if (d->staticpattern)
644 {
645 char *o;
646 char *buffer = variable_expand ("");
647 buffer_offset = buffer - variable_buffer; /* bird */
648
649 o = subst_expand (buffer, d->name, "%", "$*", 1, 2, 0);
650 buffer = variable_buffer + buffer_offset; /* bird - variable_buffer may have been reallocated. */
651
652 d->name = strcache_add_len (buffer, o - buffer);
653 d->staticpattern = 0; /* Clear staticpattern so that we don't
654 re-expand %s below. */
655 }
656
657 /* We are going to do second expansion so initialize file variables
658 for the file. Since the stem for static pattern rules comes from
659 individual dep lines, we will temporarily set f->stem to d->stem.
660 */
661 if (!initialized)
662 {
663 initialize_file_variables (f, 0);
664 initialized = 1;
665 }
666
667 if (d->stem != 0)
668 f->stem = d->stem;
669
670 set_file_variables (f);
671
672#if !defined (CONFIG_WITH_VALUE_LENGTH) || !defined (CONFIG_WITH_STRCACHE2)
673 p = variable_expand_for_file (d->name, f);
674#else
675 len = strcache2_get_len (&file_strcache, d->name);
676 p = variable_expand_for_file_2 (NULL, d->name, len, f, &len);
677#endif
678
679 if (d->stem != 0)
680 f->stem = file_stem;
681 }
682
683 /* Parse the prerequisites. */
684 new = parse_prereqs (p);
685
686 /* If this dep list was from a static pattern rule, expand the %s. We
687 use patsubst_expand to translate the prerequisites' patterns into
688 plain prerequisite names. */
689 if (new && d->staticpattern)
690 {
691 const char *pattern = "%";
692 char *buffer = variable_expand ("");
693 const size_t buffer_offset = buffer - variable_buffer; /* bird */
694 struct dep *dp = new, *dl = 0;
695
696 while (dp != 0)
697 {
698 char *percent;
699#ifndef KMK
700 int nl = strlen (dp->name) + 1;
701 char *nm = alloca (nl);
702 memcpy (nm, dp->name, nl);
703 percent = find_percent (nm);
704#else /* KMK - don't make a stack copy unless it's actually required! */
705 unsigned int nl = strcache2_get_len (&file_strcache, dp->name);
706 char *nm;
707 percent = memchr (dp->name, '%', nl);
708 if (percent)
709 {
710 nm = alloca (nl + 1);
711 memcpy (nm, dp->name, nl + 1);
712 percent = find_percent (nm);
713 }
714#endif /* KMK */
715 if (percent)
716 {
717 char *o;
718
719 /* We have to handle empty stems specially, because that
720 would be equivalent to $(patsubst %,dp->name,) which
721 will always be empty. */
722 if (d->stem[0] == '\0')
723 {
724 memmove (percent, percent+1, strlen (percent));
725 o = variable_buffer_output (buffer, nm, strlen (nm) + 1);
726 }
727 else
728 {
729 o = patsubst_expand_pat (buffer, d->stem, pattern, nm,
730 pattern+1, percent+1);
731 o = variable_buffer_output (o, "", 1); /* bird fix - patsubst_expand_pat doesn't terminate,
732 the if case does and strcache would appreciate it. */
733 }
734 buffer = variable_buffer + buffer_offset; /* bird fix - variable_buffer may have been reallocated. */
735
736
737 /* If the name expanded to the empty string, ignore it. */
738 if (buffer[0] == '\0')
739 {
740 struct dep *df = dp;
741 if (dp == new)
742 dp = new = new->next;
743 else
744 dp = dl->next = dp->next;
745 free_dep (df);
746 continue;
747 }
748
749 /* Save the name. */
750 dp->name = strcache_add_len (buffer, o - buffer - 1); /* bird fix - don't include the terminator. */
751 }
752 dl = dp;
753 dp = dp->next;
754 }
755 }
756
757 /* Enter them as files. */
758 for (d1 = new; d1 != 0; d1 = d1->next)
759 {
760 d1->file = lookup_file (d1->name);
761 if (d1->file == 0)
762 d1->file = enter_file (d1->name);
763 d1->name = 0;
764 d1->staticpattern = 0;
765 d1->need_2nd_expansion = 0;
766 }
767
768#ifdef CONFIG_WITH_INCLUDEDEP
769 }
770#endif
771
772 /* Add newly parsed deps to f->deps. If this is the last dependency
773 line and this target has commands then put it in front so the
774 last dependency line (the one with commands) ends up being the
775 first. This is important because people expect $< to hold first
776 prerequisite from the rule with commands. If it is not the last
777 dependency line or the rule does not have commands then link it
778 at the end so it appears in makefile order. */
779
780 if (new != 0)
781 {
782 if (d->next == 0 && last_dep_has_cmds)
783 {
784 struct dep **d_ptr;
785 for (d_ptr = &new; *d_ptr; d_ptr = &(*d_ptr)->next)
786 ;
787
788 *d_ptr = f->deps;
789 f->deps = new;
790 }
791 else
792 {
793 struct dep **d_ptr;
794 for (d_ptr = &f->deps; *d_ptr; d_ptr = &(*d_ptr)->next)
795 ;
796
797 *d_ptr = new;
798 }
799 }
800 }
801
802 free_dep_chain (old);
803}
804
805/* For each dependency of each file, make the `struct dep' point
806 at the appropriate `struct file' (which may have to be created).
807
808 Also mark the files depended on by .PRECIOUS, .PHONY, .SILENT,
809 and various other special targets. */
810
811void
812snap_deps (void)
813{
814 struct file *f;
815 struct file *f2;
816 struct dep *d;
817 struct file **file_slot_0;
818 struct file **file_slot;
819 struct file **file_end;
820
821 /* Perform second expansion and enter each dependency name as a file. */
822
823 /* Expand .SUFFIXES first; it's dependencies are used for $$* calculation. */
824 for (f = lookup_file (".SUFFIXES"); f != 0; f = f->prev)
825 expand_deps (f);
826
827#ifdef CONFIG_WITH_2ND_TARGET_EXPANSION
828 /* Perform 2nd target expansion on files which requires this. This will
829 be re-inserting (delete+insert) hash table entries so we have to use
830 hash_dump(). */
831 if (second_target_expansion)
832 {
833# ifdef KMK /* turn on warnings here. */
834 int save = warn_undefined_variables_flag;
835 warn_undefined_variables_flag = 1;
836# endif
837
838 file_slot_0 = (struct file **) hash_dump (&files, 0, 0);
839 file_end = file_slot_0 + files.ht_fill;
840 for (file_slot = file_slot_0; file_slot < file_end; file_slot++)
841 for (f = *file_slot; f != 0; f = f->prev)
842 if (f->need_2nd_target_expansion)
843 do_2nd_target_expansion (f);
844 free (file_slot_0);
845
846# ifdef KMK
847 warn_undefined_variables_flag = save;
848# endif
849
850 /* Disable second target expansion now since we won't expand files
851 entered after this point. (Saves CPU cycles in enter_file()). */
852 second_target_expansion = 0;
853 }
854#endif /* CONFIG_WITH_2ND_TARGET_EXPANSION */
855
856#ifdef CONFIG_WITH_INCLUDEDEP
857 /* Process any queued includedep files. Since includedep is supposed
858 to be *simple* stuff, we can do this after the second target expansion
859 and thereby save a little time. */
860 incdep_flush_and_term ();
861#endif /* CONFIG_WITH_INCLUDEDEP */
862
863 /* For every target that's not .SUFFIXES, expand its dependencies.
864 We must use hash_dump (), because within this loop we might add new files
865 to the table, possibly causing an in-situ table expansion. */
866 file_slot_0 = (struct file **) hash_dump (&files, 0, 0);
867 file_end = file_slot_0 + files.ht_fill;
868 for (file_slot = file_slot_0; file_slot < file_end; file_slot++)
869 for (f = *file_slot; f != 0; f = f->prev)
870#ifndef CONFIG_WITH_STRCACHE2
871 if (strcmp (f->name, ".SUFFIXES") != 0)
872#else
873 if (f->name != suffixes_strcached)
874#endif
875 expand_deps (f);
876#ifdef KMK
877 /* This is a HACK to work around the still broken test #9 in
878 features/double_colon. It produces the wrong result if the build is
879 parallel because of changed evaluation order. Just make these
880 problematic rules execute in single field till a proper fix is
881 forthcomming... */
882
883 for (file_slot = file_slot_0; file_slot < file_end; file_slot++)
884 if ( (f = *file_slot) != 0
885 && f->double_colon
886 && ( f->double_colon != f
887 || f->last != f))
888 for (f2 = f->double_colon; f2 != 0; f2 = f2->prev)
889 f2->command_flags |= COMMANDS_NOTPARALLEL;
890#endif /* KMK */
891 free (file_slot_0);
892
893 /* Now manage all the special targets. */
894
895 for (f = lookup_file (".PRECIOUS"); f != 0; f = f->prev)
896 for (d = f->deps; d != 0; d = d->next)
897 for (f2 = d->file; f2 != 0; f2 = f2->prev)
898 f2->precious = 1;
899
900 for (f = lookup_file (".LOW_RESOLUTION_TIME"); f != 0; f = f->prev)
901 for (d = f->deps; d != 0; d = d->next)
902 for (f2 = d->file; f2 != 0; f2 = f2->prev)
903 f2->low_resolution_time = 1;
904
905 for (f = lookup_file (".PHONY"); f != 0; f = f->prev)
906 for (d = f->deps; d != 0; d = d->next)
907 for (f2 = d->file; f2 != 0; f2 = f2->prev)
908 {
909 /* Mark this file as phony nonexistent target. */
910 f2->phony = 1;
911 f2->is_target = 1;
912 f2->last_mtime = NONEXISTENT_MTIME;
913 f2->mtime_before_update = NONEXISTENT_MTIME;
914 }
915
916 for (f = lookup_file (".INTERMEDIATE"); f != 0; f = f->prev)
917 /* Mark .INTERMEDIATE deps as intermediate files. */
918 for (d = f->deps; d != 0; d = d->next)
919 for (f2 = d->file; f2 != 0; f2 = f2->prev)
920 f2->intermediate = 1;
921 /* .INTERMEDIATE with no deps does nothing.
922 Marking all files as intermediates is useless since the goal targets
923 would be deleted after they are built. */
924
925 for (f = lookup_file (".SECONDARY"); f != 0; f = f->prev)
926 /* Mark .SECONDARY deps as both intermediate and secondary. */
927 if (f->deps)
928 for (d = f->deps; d != 0; d = d->next)
929 for (f2 = d->file; f2 != 0; f2 = f2->prev)
930 f2->intermediate = f2->secondary = 1;
931 /* .SECONDARY with no deps listed marks *all* files that way. */
932 else
933 {
934 all_secondary = 1;
935 hash_map (&files, set_intermediate);
936 }
937
938 f = lookup_file (".EXPORT_ALL_VARIABLES");
939 if (f != 0 && f->is_target)
940 export_all_variables = 1;
941
942 f = lookup_file (".IGNORE");
943 if (f != 0 && f->is_target)
944 {
945 if (f->deps == 0)
946 ignore_errors_flag = 1;
947 else
948 for (d = f->deps; d != 0; d = d->next)
949 for (f2 = d->file; f2 != 0; f2 = f2->prev)
950 f2->command_flags |= COMMANDS_NOERROR;
951 }
952
953 f = lookup_file (".SILENT");
954 if (f != 0 && f->is_target)
955 {
956 if (f->deps == 0)
957 silent_flag = 1;
958 else
959 for (d = f->deps; d != 0; d = d->next)
960 for (f2 = d->file; f2 != 0; f2 = f2->prev)
961 f2->command_flags |= COMMANDS_SILENT;
962 }
963
964 f = lookup_file (".NOTPARALLEL");
965 if (f != 0 && f->is_target)
966#ifndef CONFIG_WITH_EXTENDED_NOTPARALLEL
967 not_parallel = 1;
968#else /* CONFIG_WITH_EXTENDED_NOTPARALLEL */
969 {
970 if (f->deps == 0)
971 {
972 DB (DB_KMK, (_("not_parallel -1\n")));
973 not_parallel = -1;
974 }
975 else
976 for (d = f->deps; d != 0; d = d->next)
977 for (f2 = d->file; f2 != 0; f2 = f2->prev)
978 f2->command_flags |= COMMANDS_NOTPARALLEL;
979 }
980#endif /* CONFIG_WITH_EXTENDED_NOTPARALLEL */
981
982#ifndef NO_MINUS_C_MINUS_O
983 /* If .POSIX was defined, remove OUTPUT_OPTION to comply. */
984 /* This needs more work: what if the user sets this in the makefile?
985 if (posix_pedantic)
986 define_variable (STRING_SIZE_TUPLE("OUTPUT_OPTION"), "", o_default, 1);
987 */
988#endif
989
990 /* Remember that we've done this. */
991 snapped_deps = 1;
992}
993
994
995/* Set the `command_state' member of FILE and all its `also_make's. */
996
997void
998set_command_state (struct file *file, enum cmd_state state)
999{
1000 struct dep *d;
1001
1002 file->command_state = state;
1003
1004 for (d = file->also_make; d != 0; d = d->next)
1005 d->file->command_state = state;
1006
1007#ifdef CONFIG_WITH_EXPLICIT_MULTITARGET
1008 if (file->multi_head)
1009 for (file = file->multi_head; file != 0; file = file->multi_next)
1010 file->command_state = state;
1011#endif
1012}
1013
1014
1015/* Convert an external file timestamp to internal form. */
1016
1017FILE_TIMESTAMP
1018file_timestamp_cons (const char *fname, time_t s, int ns)
1019{
1020 int offset = ORDINARY_MTIME_MIN + (FILE_TIMESTAMP_HI_RES ? ns : 0);
1021 FILE_TIMESTAMP product = (FILE_TIMESTAMP) s << FILE_TIMESTAMP_LO_BITS;
1022 FILE_TIMESTAMP ts = product + offset;
1023
1024 if (! (s <= FILE_TIMESTAMP_S (ORDINARY_MTIME_MAX)
1025 && product <= ts && ts <= ORDINARY_MTIME_MAX))
1026 {
1027 char buf[FILE_TIMESTAMP_PRINT_LEN_BOUND + 1];
1028 ts = s <= OLD_MTIME ? ORDINARY_MTIME_MIN : ORDINARY_MTIME_MAX;
1029 file_timestamp_sprintf (buf, ts);
1030 error (NILF, _("%s: Timestamp out of range; substituting %s"),
1031 fname ? fname : _("Current time"), buf);
1032 }
1033
1034 return ts;
1035}
1036
1037
1038/* Return the current time as a file timestamp, setting *RESOLUTION to
1039 its resolution. */
1040FILE_TIMESTAMP
1041file_timestamp_now (int *resolution)
1042{
1043 int r;
1044 time_t s;
1045 int ns;
1046
1047 /* Don't bother with high-resolution clocks if file timestamps have
1048 only one-second resolution. The code below should work, but it's
1049 not worth the hassle of debugging it on hosts where it fails. */
1050#if FILE_TIMESTAMP_HI_RES
1051# if HAVE_CLOCK_GETTIME && defined CLOCK_REALTIME
1052 {
1053 struct timespec timespec;
1054 if (clock_gettime (CLOCK_REALTIME, &timespec) == 0)
1055 {
1056 r = 1;
1057 s = timespec.tv_sec;
1058 ns = timespec.tv_nsec;
1059 goto got_time;
1060 }
1061 }
1062# endif
1063# if HAVE_GETTIMEOFDAY
1064 {
1065 struct timeval timeval;
1066 if (gettimeofday (&timeval, 0) == 0)
1067 {
1068 r = 1000;
1069 s = timeval.tv_sec;
1070 ns = timeval.tv_usec * 1000;
1071 goto got_time;
1072 }
1073 }
1074# endif
1075#endif
1076
1077 r = 1000000000;
1078 s = time ((time_t *) 0);
1079 ns = 0;
1080
1081#if FILE_TIMESTAMP_HI_RES
1082 got_time:
1083#endif
1084 *resolution = r;
1085 return file_timestamp_cons (0, s, ns);
1086}
1087
1088/* Place into the buffer P a printable representation of the file
1089 timestamp TS. */
1090void
1091file_timestamp_sprintf (char *p, FILE_TIMESTAMP ts)
1092{
1093 time_t t = FILE_TIMESTAMP_S (ts);
1094 struct tm *tm = localtime (&t);
1095
1096 if (tm)
1097 sprintf (p, "%04d-%02d-%02d %02d:%02d:%02d",
1098 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
1099 tm->tm_hour, tm->tm_min, tm->tm_sec);
1100 else if (t < 0)
1101 sprintf (p, "%ld", (long) t);
1102 else
1103 sprintf (p, "%lu", (unsigned long) t);
1104 p += strlen (p);
1105
1106 /* Append nanoseconds as a fraction, but remove trailing zeros. We don't
1107 know the actual timestamp resolution, since clock_getres applies only to
1108 local times, whereas this timestamp might come from a remote filesystem.
1109 So removing trailing zeros is the best guess that we can do. */
1110 sprintf (p, ".%09d", FILE_TIMESTAMP_NS (ts));
1111 p += strlen (p) - 1;
1112 while (*p == '0')
1113 p--;
1114 p += *p != '.';
1115
1116 *p = '\0';
1117}
1118
1119
1120/* Print the data base of files. */
1121
1122static void
1123print_file (const void *item)
1124{
1125 const struct file *f = item;
1126 struct dep *d;
1127 struct dep *ood = 0;
1128
1129 putchar ('\n');
1130 if (!f->is_target)
1131 puts (_("# Not a target:"));
1132#ifdef CONFIG_WITH_EXPLICIT_MULTITARGET
1133 if (f->multi_head)
1134 {
1135 const struct file *f2;
1136 if (f->multi_head == f)
1137 {
1138 int multi_maybe = -1;
1139 assert (!f->multi_maybe);
1140 assert (!f->double_colon);
1141
1142 printf ("%s", f->name);
1143 for (f2 = f->multi_next; f2 != 0; f2 = f2->multi_next)
1144 {
1145 printf (" %s%s", f2->multi_maybe != multi_maybe
1146 ? f2->multi_maybe ? "+| " : "+ " : "",
1147 f2->name);
1148 multi_maybe = f2->multi_maybe;
1149 }
1150 putchar (':');
1151 }
1152 else
1153 printf ("%s:%s", f->name, f->double_colon ? ":" : "");
1154 }
1155 else
1156#endif
1157 printf ("%s:%s", f->name, f->double_colon ? ":" : "");
1158
1159 /* Print all normal dependencies; note any order-only deps. */
1160 for (d = f->deps; d != 0; d = d->next)
1161 if (! d->ignore_mtime)
1162 printf (" %s", dep_name (d));
1163 else if (! ood)
1164 ood = d;
1165
1166 /* Print order-only deps, if we have any. */
1167 if (ood)
1168 {
1169 printf (" | %s", dep_name (ood));
1170 for (d = ood->next; d != 0; d = d->next)
1171 if (d->ignore_mtime)
1172 printf (" %s", dep_name (d));
1173 }
1174
1175 putchar ('\n');
1176
1177#ifdef CONFIG_WITH_EXPLICIT_MULTITARGET
1178 if (f->multi_head && f->multi_head != f)
1179 {
1180 const struct file *f2;
1181 fputs (_("# In multi target list:"), stdout);
1182 for (f2 = f->multi_head; f2 != 0; f2 = f2->multi_next)
1183 printf (" %s%s", f2->name, f == f2 ? "(*)" : "");
1184 putchar ('\n');
1185 if (f->multi_maybe)
1186 puts (_("# File is an optional multi target member."));
1187 }
1188#endif
1189
1190 if (f->precious)
1191 puts (_("# Precious file (prerequisite of .PRECIOUS)."));
1192 if (f->phony)
1193 puts (_("# Phony target (prerequisite of .PHONY)."));
1194 if (f->cmd_target)
1195 puts (_("# Command-line target."));
1196 if (f->dontcare)
1197 puts (_("# A default, MAKEFILES, or -include/sinclude makefile."));
1198 puts (f->tried_implicit
1199 ? _("# Implicit rule search has been done.")
1200 : _("# Implicit rule search has not been done."));
1201 if (f->stem != 0)
1202 printf (_("# Implicit/static pattern stem: `%s'\n"), f->stem);
1203 if (f->intermediate)
1204 puts (_("# File is an intermediate prerequisite."));
1205 if (f->also_make != 0)
1206 {
1207 fputs (_("# Also makes:"), stdout);
1208 for (d = f->also_make; d != 0; d = d->next)
1209 printf (" %s", dep_name (d));
1210 putchar ('\n');
1211 }
1212 if (f->last_mtime == UNKNOWN_MTIME)
1213 puts (_("# Modification time never checked."));
1214 else if (f->last_mtime == NONEXISTENT_MTIME)
1215 puts (_("# File does not exist."));
1216 else if (f->last_mtime == OLD_MTIME)
1217 puts (_("# File is very old."));
1218 else
1219 {
1220 char buf[FILE_TIMESTAMP_PRINT_LEN_BOUND + 1];
1221 file_timestamp_sprintf (buf, f->last_mtime);
1222 printf (_("# Last modified %s\n"), buf);
1223 }
1224 puts (f->updated
1225 ? _("# File has been updated.") : _("# File has not been updated."));
1226 switch (f->command_state)
1227 {
1228 case cs_running:
1229 puts (_("# Commands currently running (THIS IS A BUG)."));
1230 break;
1231 case cs_deps_running:
1232 puts (_("# Dependencies commands running (THIS IS A BUG)."));
1233 break;
1234 case cs_not_started:
1235 case cs_finished:
1236 switch (f->update_status)
1237 {
1238 case -1:
1239 break;
1240 case 0:
1241 puts (_("# Successfully updated."));
1242 break;
1243 case 1:
1244 assert (question_flag);
1245 puts (_("# Needs to be updated (-q is set)."));
1246 break;
1247 case 2:
1248 puts (_("# Failed to be updated."));
1249 break;
1250 default:
1251 puts (_("# Invalid value in `update_status' member!"));
1252 fflush (stdout);
1253 fflush (stderr);
1254 abort ();
1255 }
1256 break;
1257 default:
1258 puts (_("# Invalid value in `command_state' member!"));
1259 fflush (stdout);
1260 fflush (stderr);
1261 abort ();
1262 }
1263
1264 if (f->variables != 0)
1265 print_file_variables (f);
1266
1267 if (f->cmds != 0)
1268 print_commands (f->cmds);
1269
1270 if (f->prev)
1271 print_file ((const void *) f->prev);
1272}
1273
1274void
1275print_file_data_base (void)
1276{
1277 puts (_("\n# Files"));
1278
1279 hash_map (&files, print_file);
1280
1281 fputs (_("\n# files hash-table stats:\n# "), stdout);
1282 hash_print_stats (&files, stdout);
1283}
1284
1285#ifdef CONFIG_WITH_PRINT_STATS_SWITCH
1286void
1287print_file_stats (void)
1288{
1289 fputs (_("\n# files hash-table stats:\n# "), stdout);
1290 hash_print_stats (&files, stdout);
1291 fputs ("\n", stdout);
1292}
1293#endif
1294
1295
1296/* Verify the integrity of the data base of files. */
1297
1298#define VERIFY_CACHED(_p,_n) \
1299 do{\
1300 if (_p->_n && _p->_n[0] && !strcache_iscached (_p->_n)) \
1301 printf ("%s: Field %s not cached: %s\n", _p->name, # _n, _p->_n); \
1302 }while(0)
1303
1304static void
1305verify_file (const void *item)
1306{
1307 const struct file *f = item;
1308 const struct dep *d;
1309
1310 VERIFY_CACHED (f, name);
1311 VERIFY_CACHED (f, hname);
1312 VERIFY_CACHED (f, vpath);
1313 VERIFY_CACHED (f, stem);
1314
1315 /* Check the deps. */
1316 for (d = f->deps; d != 0; d = d->next)
1317 {
1318 VERIFY_CACHED (d, name);
1319 VERIFY_CACHED (d, stem);
1320 }
1321}
1322
1323void
1324verify_file_data_base (void)
1325{
1326 hash_map (&files, verify_file);
1327}
1328
1329#define EXPANSION_INCREMENT(_l) ((((_l) / 500) + 1) * 500)
1330
1331char *
1332build_target_list (char *value)
1333{
1334 static unsigned long last_targ_count = 0;
1335
1336 if (files.ht_fill != last_targ_count)
1337 {
1338 unsigned long max = EXPANSION_INCREMENT (strlen (value));
1339 unsigned long len;
1340 char *p;
1341 struct file **fp = (struct file **) files.ht_vec;
1342 struct file **end = &fp[files.ht_size];
1343
1344 /* Make sure we have at least MAX bytes in the allocated buffer. */
1345 value = xrealloc (value, max);
1346
1347 p = value;
1348 len = 0;
1349 for (; fp < end; ++fp)
1350 if (!HASH_VACANT (*fp) && (*fp)->is_target)
1351 {
1352 struct file *f = *fp;
1353 int l = strlen (f->name);
1354
1355 len += l + 1;
1356 if (len > max)
1357 {
1358 unsigned long off = p - value;
1359
1360 max += EXPANSION_INCREMENT (l + 1);
1361 value = xrealloc (value, max);
1362 p = &value[off];
1363 }
1364
1365 memcpy (p, f->name, l);
1366 p += l;
1367 *(p++) = ' ';
1368 }
1369 *(p-1) = '\0';
1370
1371 last_targ_count = files.ht_fill;
1372 }
1373
1374 return value;
1375}
1376
1377void
1378init_hash_files (void)
1379{
1380#ifndef CONFIG_WITH_STRCACHE2
1381# ifdef KMK
1382 hash_init (&files, /*65535*/ 32755, file_hash_1, file_hash_2, file_hash_cmp);
1383# else
1384 hash_init (&files, 1000, file_hash_1, file_hash_2, file_hash_cmp);
1385# endif
1386#else /* CONFIG_WITH_STRCACHE2 */
1387# ifdef KMK
1388 hash_init_strcached (&files, 32755, &file_strcache,
1389 offsetof (struct file, hname));
1390# else
1391 hash_init_strcached (&files, 1000, &file_strcache,
1392 offsetof (struct file, hname));
1393# endif
1394#endif /* CONFIG_WITH_STRCACHE2 */
1395}
1396
1397/* EOF */
Note: See TracBrowser for help on using the repository browser.