VirtualBox

source: kBuild/trunk/src/kmk/remake.c@ 1673

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

More CONFIG_WITH_EXPLICIT_MULTITARGET hacking. Have to deal with non-run stuff, or we'll get into endless loops.

  • Property svn:eol-style set to native
File size: 52.4 KB
Line 
1/* Basic dependency engine 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#include "filedef.h"
21#include "job.h"
22#include "commands.h"
23#include "dep.h"
24#include "variable.h"
25#include "debug.h"
26
27#include <assert.h>
28
29#ifdef HAVE_FCNTL_H
30#include <fcntl.h>
31#else
32#include <sys/file.h>
33#endif
34
35#ifdef VMS
36#include <starlet.h>
37#endif
38#ifdef WINDOWS32
39#include <io.h>
40#endif
41
42extern int try_implicit_rule (struct file *file, unsigned int depth);
43
44
45/* The test for circular dependencies is based on the 'updating' bit in
46 `struct file'. However, double colon targets have seperate `struct
47 file's; make sure we always use the base of the double colon chain. */
48
49#define start_updating(_f) (((_f)->double_colon ? (_f)->double_colon : (_f))\
50 ->updating = 1)
51#define finish_updating(_f) (((_f)->double_colon ? (_f)->double_colon : (_f))\
52 ->updating = 0)
53#define is_updating(_f) (((_f)->double_colon ? (_f)->double_colon : (_f))\
54 ->updating)
55
56
57/* Incremented when a command is started (under -n, when one would be). */
58unsigned int commands_started = 0;
59
60/* Current value for pruning the scan of the goal chain (toggle 0/1). */
61static unsigned int considered;
62
63static int update_file (struct file *file, unsigned int depth);
64static int update_file_1 (struct file *file, unsigned int depth);
65static int check_dep (struct file *file, unsigned int depth,
66 FILE_TIMESTAMP this_mtime, int *must_make_ptr);
67static int touch_file (struct file *file);
68static void remake_file (struct file *file);
69static FILE_TIMESTAMP name_mtime (const char *name);
70static const char *library_search (const char *lib, FILE_TIMESTAMP *mtime_ptr);
71
72
73
74/* Remake all the goals in the `struct dep' chain GOALS. Return -1 if nothing
75 was done, 0 if all goals were updated successfully, or 1 if a goal failed.
76
77 If rebuilding_makefiles is nonzero, these goals are makefiles, so -t, -q,
78 and -n should be disabled for them unless they were also command-line
79 targets, and we should only make one goal at a time and return as soon as
80 one goal whose `changed' member is nonzero is successfully made. */
81
82int
83update_goal_chain (struct dep *goals)
84{
85 int t = touch_flag, q = question_flag, n = just_print_flag;
86 unsigned int j = job_slots;
87 int status = -1;
88
89#define MTIME(file) (rebuilding_makefiles ? file_mtime_no_search (file) \
90 : file_mtime (file))
91
92 /* Duplicate the chain so we can remove things from it. */
93
94 goals = copy_dep_chain (goals);
95
96 {
97 /* Clear the `changed' flag of each goal in the chain.
98 We will use the flag below to notice when any commands
99 have actually been run for a target. When no commands
100 have been run, we give an "up to date" diagnostic. */
101
102 struct dep *g;
103 for (g = goals; g != 0; g = g->next)
104 g->changed = 0;
105 }
106
107 /* All files start with the considered bit 0, so the global value is 1. */
108 considered = 1;
109
110 /* Update all the goals until they are all finished. */
111
112 while (goals != 0)
113 {
114 register struct dep *g, *lastgoal;
115
116 /* Start jobs that are waiting for the load to go down. */
117
118 start_waiting_jobs ();
119
120 /* Wait for a child to die. */
121
122 reap_children (1, 0);
123
124 lastgoal = 0;
125 g = goals;
126 while (g != 0)
127 {
128 /* Iterate over all double-colon entries for this file. */
129 struct file *file;
130 int stop = 0, any_not_updated = 0;
131
132 for (file = g->file->double_colon ? g->file->double_colon : g->file;
133 file != NULL;
134 file = file->prev)
135 {
136 unsigned int ocommands_started;
137 int x;
138 check_renamed (file);
139 if (rebuilding_makefiles)
140 {
141 if (file->cmd_target)
142 {
143 touch_flag = t;
144 question_flag = q;
145 just_print_flag = n;
146 }
147 else
148 touch_flag = question_flag = just_print_flag = 0;
149 }
150
151 /* Save the old value of `commands_started' so we can compare
152 later. It will be incremented when any commands are
153 actually run. */
154 ocommands_started = commands_started;
155
156 x = update_file (file, rebuilding_makefiles ? 1 : 0);
157 check_renamed (file);
158
159 /* Set the goal's `changed' flag if any commands were started
160 by calling update_file above. We check this flag below to
161 decide when to give an "up to date" diagnostic. */
162 if (commands_started > ocommands_started)
163 g->changed = 1;
164
165 /* If we updated a file and STATUS was not already 1, set it to
166 1 if updating failed, or to 0 if updating succeeded. Leave
167 STATUS as it is if no updating was done. */
168
169 stop = 0;
170 if ((x != 0 || file->updated) && status < 1)
171 {
172 if (file->update_status != 0)
173 {
174 /* Updating failed, or -q triggered. The STATUS value
175 tells our caller which. */
176 status = file->update_status;
177 /* If -q just triggered, stop immediately. It doesn't
178 matter how much more we run, since we already know
179 the answer to return. */
180 stop = (question_flag && !keep_going_flag
181 && !rebuilding_makefiles);
182 }
183 else
184 {
185 FILE_TIMESTAMP mtime = MTIME (file);
186 check_renamed (file);
187
188 if (file->updated && g->changed &&
189 mtime != file->mtime_before_update)
190 {
191 /* Updating was done. If this is a makefile and
192 just_print_flag or question_flag is set (meaning
193 -n or -q was given and this file was specified
194 as a command-line target), don't change STATUS.
195 If STATUS is changed, we will get re-exec'd, and
196 enter an infinite loop. */
197 if (!rebuilding_makefiles
198 || (!just_print_flag && !question_flag))
199 status = 0;
200 if (rebuilding_makefiles && file->dontcare)
201 /* This is a default makefile; stop remaking. */
202 stop = 1;
203 }
204 }
205 }
206
207 /* Keep track if any double-colon entry is not finished.
208 When they are all finished, the goal is finished. */
209 any_not_updated |= !file->updated;
210
211 if (stop)
212 break;
213 }
214
215 /* Reset FILE since it is null at the end of the loop. */
216 file = g->file;
217
218 if (stop || !any_not_updated)
219 {
220 /* If we have found nothing whatever to do for the goal,
221 print a message saying nothing needs doing. */
222
223 if (!rebuilding_makefiles
224 /* If the update_status is zero, we updated successfully
225 or not at all. G->changed will have been set above if
226 any commands were actually started for this goal. */
227 && file->update_status == 0 && !g->changed
228 /* Never give a message under -s or -q. */
229 && !silent_flag && !question_flag)
230 message (1, ((file->phony || file->cmds == 0)
231 ? _("Nothing to be done for `%s'.")
232 : _("`%s' is up to date.")),
233 file->name);
234
235 /* This goal is finished. Remove it from the chain. */
236 if (lastgoal == 0)
237 goals = g->next;
238 else
239 lastgoal->next = g->next;
240
241 /* Free the storage. */
242 free (g);
243
244 g = lastgoal == 0 ? goals : lastgoal->next;
245
246 if (stop)
247 break;
248 }
249 else
250 {
251 lastgoal = g;
252 g = g->next;
253 }
254 }
255
256 /* If we reached the end of the dependency graph toggle the considered
257 flag for the next pass. */
258 if (g == 0)
259 considered = !considered;
260 }
261
262 if (rebuilding_makefiles)
263 {
264 touch_flag = t;
265 question_flag = q;
266 just_print_flag = n;
267 job_slots = j;
268 }
269
270 return status;
271}
272
273
274/* If FILE is not up to date, execute the commands for it.
275 Return 0 if successful, 1 if unsuccessful;
276 but with some flag settings, just call `exit' if unsuccessful.
277
278 DEPTH is the depth in recursions of this function.
279 We increment it during the consideration of our dependencies,
280 then decrement it again after finding out whether this file
281 is out of date.
282
283 If there are multiple double-colon entries for FILE,
284 each is considered in turn. */
285
286static int
287update_file (struct file *file, unsigned int depth)
288{
289 register int status = 0;
290 register struct file *f;
291
292 f = file->double_colon ? file->double_colon : file;
293
294 /* Prune the dependency graph: if we've already been here on _this_
295 pass through the dependency graph, we don't have to go any further.
296 We won't reap_children until we start the next pass, so no state
297 change is possible below here until then. */
298 if (f->considered == considered)
299 {
300 DBF (DB_VERBOSE, _("Pruning file `%s'.\n"));
301 return f->command_state == cs_finished ? f->update_status : 0;
302 }
303
304 /* This loop runs until we start commands for a double colon rule, or until
305 the chain is exhausted. */
306 for (; f != 0; f = f->prev)
307 {
308 f->considered = considered;
309
310 status |= update_file_1 (f, depth);
311 check_renamed (f);
312
313 /* Clean up any alloca() used during the update. */
314 alloca (0);
315
316 /* If we got an error, don't bother with double_colon etc. */
317 if (status != 0 && !keep_going_flag)
318 return status;
319
320 if (f->command_state == cs_running
321 || f->command_state == cs_deps_running)
322 {
323 /* Don't run the other :: rules for this
324 file until this rule is finished. */
325 status = 0;
326 break;
327 }
328 }
329
330 /* Process the remaining rules in the double colon chain so they're marked
331 considered. Start their prerequisites, too. */
332 if (file->double_colon)
333 for (; f != 0 ; f = f->prev)
334 {
335 struct dep *d;
336
337 f->considered = considered;
338
339 for (d = f->deps; d != 0; d = d->next)
340 status |= update_file (d->file, depth + 1);
341 }
342
343 return status;
344}
345
346
347/* Show a message stating the target failed to build. */
348
349static void
350complain (const struct file *file)
351{
352 const char *msg_noparent
353 = _("%sNo rule to make target `%s'%s");
354 const char *msg_parent
355 = _("%sNo rule to make target `%s', needed by `%s'%s");
356
357 if (!keep_going_flag)
358 {
359 if (file->parent == 0)
360 fatal (NILF, msg_noparent, "", file->name, "");
361
362 fatal (NILF, msg_parent, "", file->name, file->parent->name, "");
363 }
364
365 if (file->parent == 0)
366 error (NILF, msg_noparent, "*** ", file->name, ".");
367 else
368 error (NILF, msg_parent, "*** ", file->name, file->parent->name, ".");
369}
370
371/* Consider a single `struct file' and update it as appropriate. */
372
373static int
374update_file_1 (struct file *file, unsigned int depth)
375{
376 register FILE_TIMESTAMP this_mtime;
377 int noexist, must_make, deps_changed;
378 int dep_status = 0;
379 register struct dep *d, *lastd;
380 int running = 0;
381#ifdef CONFIG_WITH_EXPLICIT_MULTITARGET
382 struct file *f2, *f3;
383
384 /* Always work on the primary multi target file. */
385
386 if (file->multi_head != NULL && file->multi_head != file)
387 {
388 DBS (DB_VERBOSE, (_("Considering target file `%s' -> multi head `%s'.\n"),
389 file->name, file->multi_head->name));
390 file = file->multi_head;
391 }
392 else
393#endif /* CONFIG_WITH_EXPLICIT_MULTITARGET */
394 DBF (DB_VERBOSE, _("Considering target file `%s'.\n"));
395
396 if (file->updated)
397 {
398 if (file->update_status > 0)
399 {
400 DBF (DB_VERBOSE,
401 _("Recently tried and failed to update file `%s'.\n"));
402
403 /* If the file we tried to make is marked dontcare then no message
404 was printed about it when it failed during the makefile rebuild.
405 If we're trying to build it again in the normal rebuild, print a
406 message now. */
407 if (file->dontcare && !rebuilding_makefiles)
408 {
409 file->dontcare = 0;
410 complain (file);
411 }
412
413 return file->update_status;
414 }
415
416 DBF (DB_VERBOSE, _("File `%s' was considered already.\n"));
417 return 0;
418 }
419
420 switch (file->command_state)
421 {
422 case cs_not_started:
423 case cs_deps_running:
424 break;
425 case cs_running:
426 DBF (DB_VERBOSE, _("Still updating file `%s'.\n"));
427 return 0;
428 case cs_finished:
429 DBF (DB_VERBOSE, _("Finished updating file `%s'.\n"));
430 return file->update_status;
431 default:
432 abort ();
433 }
434
435 ++depth;
436
437 /* Notice recursive update of the same file. */
438 start_updating (file);
439
440 /* Looking at the file's modtime beforehand allows the possibility
441 that its name may be changed by a VPATH search, and thus it may
442 not need an implicit rule. If this were not done, the file
443 might get implicit commands that apply to its initial name, only
444 to have that name replaced with another found by VPATH search.
445
446 For multi target files check the other files and use the time
447 of the oldest / non-existing file. */
448
449#ifdef CONFIG_WITH_EXPLICIT_MULTITARGET
450 this_mtime = file_mtime (file);
451 f3 = file;
452 for (f2 = file->multi_next;
453 f2 != NULL && this_mtime != NONEXISTENT_MTIME;
454 f2 = f2->multi_next)
455 if (!f2->multi_maybe)
456 {
457 FILE_TIMESTAMP second_mtime = file_mtime (f2);
458 if (second_mtime < this_mtime)
459 {
460 this_mtime = second_mtime;
461 f3 = f2;
462 }
463 }
464 check_renamed (file);
465 noexist = this_mtime == NONEXISTENT_MTIME;
466 if (noexist)
467 DBS (DB_BASIC, (_("File `%s' does not exist.\n"), f3->name));
468#else /* !CONFIG_WITH_EXPLICIT_MULTITARGET */
469 this_mtime = file_mtime (file);
470 check_renamed (file);
471 noexist = this_mtime == NONEXISTENT_MTIME;
472 if (noexist)
473 DBF (DB_BASIC, _("File `%s' does not exist.\n"));
474#endif /* !CONFIG_WITH_EXPLICIT_MULTITARGET */
475 else if (ORDINARY_MTIME_MIN <= this_mtime && this_mtime <= ORDINARY_MTIME_MAX
476 && file->low_resolution_time)
477 {
478 /* Avoid spurious rebuilds due to low resolution time stamps. */
479 int ns = FILE_TIMESTAMP_NS (this_mtime);
480 if (ns != 0)
481 error (NILF, _("*** Warning: .LOW_RESOLUTION_TIME file `%s' has a high resolution time stamp"),
482 file->name);
483 this_mtime += FILE_TIMESTAMPS_PER_S - 1 - ns;
484 }
485
486 must_make = noexist;
487
488 /* If file was specified as a target with no commands,
489 come up with some default commands. */
490
491 if (!file->phony && file->cmds == 0 && !file->tried_implicit)
492 {
493 if (try_implicit_rule (file, depth))
494 DBF (DB_IMPLICIT, _("Found an implicit rule for `%s'.\n"));
495 else
496 DBF (DB_IMPLICIT, _("No implicit rule found for `%s'.\n"));
497 file->tried_implicit = 1;
498 }
499 if (file->cmds == 0 && !file->is_target
500 && default_file != 0 && default_file->cmds != 0)
501 {
502 DBF (DB_IMPLICIT, _("Using default commands for `%s'.\n"));
503 file->cmds = default_file->cmds;
504 }
505
506 /* Update all non-intermediate files we depend on, if necessary,
507 and see whether any of them is more recent than this file.
508 For explicit multitarget rules we must iterate all the output
509 files to get the correct picture. */
510
511#ifdef CONFIG_WITH_EXPLICIT_MULTITARGET
512 for (f2 = file; f2; f2 = f2->multi_next)
513 {
514 lastd = 0;
515 d = f2->deps;
516#else
517 lastd = 0;
518 d = file->deps;
519#endif
520 while (d != 0)
521 {
522 FILE_TIMESTAMP mtime;
523 int maybe_make;
524 int dontcare = 0;
525
526 check_renamed (d->file);
527
528 mtime = file_mtime (d->file);
529 check_renamed (d->file);
530
531 if (is_updating (d->file))
532 {
533#ifdef CONFIG_WITH_EXPLICIT_MULTITARGET
534 /* silently ignore the order-only dep hack. */
535 if (f2->multi_maybe && d->file == file)
536 {
537 lastd = d;
538 d = d->next;
539 continue;
540 }
541#endif
542
543 error (NILF, _("Circular %s <- %s dependency dropped."),
544#ifdef CONFIG_WITH_EXPLICIT_MULTITARGET
545 f2->name, d->file->name);
546#else
547 file->name, d->file->name);
548#endif
549 /* We cannot free D here because our the caller will still have
550 a reference to it when we were called recursively via
551 check_dep below. */
552 if (lastd == 0)
553#ifdef CONFIG_WITH_EXPLICIT_MULTITARGET
554 f2->deps = d->next;
555#else
556 file->deps = d->next;
557#endif
558 else
559 lastd->next = d->next;
560 d = d->next;
561 continue;
562 }
563
564#ifdef CONFIG_WITH_EXPLICIT_MULTITARGET
565 d->file->parent = f2;
566#else
567 d->file->parent = file;
568#endif
569 maybe_make = must_make;
570
571 /* Inherit dontcare flag from our parent. */
572 if (rebuilding_makefiles)
573 {
574 dontcare = d->file->dontcare;
575 d->file->dontcare = file->dontcare;
576 }
577
578
579 dep_status |= check_dep (d->file, depth, this_mtime, &maybe_make);
580
581 /* Restore original dontcare flag. */
582 if (rebuilding_makefiles)
583 d->file->dontcare = dontcare;
584
585 if (! d->ignore_mtime)
586 must_make = maybe_make;
587
588 check_renamed (d->file);
589
590 {
591 register struct file *f = d->file;
592 if (f->double_colon)
593 f = f->double_colon;
594 do
595 {
596 running |= (f->command_state == cs_running
597 || f->command_state == cs_deps_running);
598 f = f->prev;
599 }
600 while (f != 0);
601 }
602
603 if (dep_status != 0 && !keep_going_flag)
604 break;
605
606 if (!running)
607 /* The prereq is considered changed if the timestamp has changed while
608 it was built, OR it doesn't exist. */
609 d->changed = ((file_mtime (d->file) != mtime)
610 || (mtime == NONEXISTENT_MTIME));
611
612 lastd = d;
613 d = d->next;
614 }
615#ifdef CONFIG_WITH_EXPLICIT_MULTITARGET
616 if (dep_status != 0 && !keep_going_flag)
617 break;
618 }
619#endif
620
621 /* Now we know whether this target needs updating.
622 If it does, update all the intermediate files we depend on. */
623
624 if (must_make || always_make_flag)
625 {
626#ifdef CONFIG_WITH_EXPLICIT_MULTITARGET
627 for (f2 = file; f2; f2 = f2->multi_next)
628 for (d = f2->deps; d != 0; d = d->next)
629#else
630 for (d = file->deps; d != 0; d = d->next)
631#endif
632 if (d->file->intermediate)
633 {
634 int dontcare = 0;
635
636 FILE_TIMESTAMP mtime = file_mtime (d->file);
637 check_renamed (d->file);
638#ifdef CONFIG_WITH_EXPLICIT_MULTITARGET
639 d->file->parent = f2;
640#else
641 d->file->parent = file;
642#endif
643
644 /* Inherit dontcare flag from our parent. */
645 if (rebuilding_makefiles)
646 {
647 dontcare = d->file->dontcare;
648 d->file->dontcare = file->dontcare;
649 }
650
651
652 dep_status |= update_file (d->file, depth);
653
654 /* Restore original dontcare flag. */
655 if (rebuilding_makefiles)
656 d->file->dontcare = dontcare;
657
658 check_renamed (d->file);
659
660 {
661 register struct file *f = d->file;
662 if (f->double_colon)
663 f = f->double_colon;
664 do
665 {
666 running |= (f->command_state == cs_running
667 || f->command_state == cs_deps_running);
668 f = f->prev;
669 }
670 while (f != 0);
671 }
672
673 if (dep_status != 0 && !keep_going_flag)
674 break;
675
676 if (!running)
677#ifdef CONFIG_WITH_EXPLICIT_MULTITARGET
678 d->changed = ((f2->phony && f2->cmds != 0)
679#else
680 d->changed = ((file->phony && file->cmds != 0)
681#endif
682 || file_mtime (d->file) != mtime);
683 }
684 }
685
686 finish_updating (file);
687
688 DBF (DB_VERBOSE, _("Finished prerequisites of target file `%s'.\n"));
689
690 if (running)
691 {
692 set_command_state (file, cs_deps_running);
693 --depth;
694 DBF (DB_VERBOSE, _("The prerequisites of `%s' are being made.\n"));
695 return 0;
696 }
697
698 /* If any dependency failed, give up now. */
699
700 if (dep_status != 0)
701 {
702 file->update_status = dep_status;
703 notice_finished_file (file);
704
705 --depth;
706
707 DBF (DB_VERBOSE, _("Giving up on target file `%s'.\n"));
708
709 if (depth == 0 && keep_going_flag
710 && !just_print_flag && !question_flag)
711 error (NILF,
712 _("Target `%s' not remade because of errors."), file->name);
713
714 return dep_status;
715 }
716
717 if (file->command_state == cs_deps_running)
718 /* The commands for some deps were running on the last iteration, but
719 they have finished now. Reset the command_state to not_started to
720 simplify later bookkeeping. It is important that we do this only
721 when the prior state was cs_deps_running, because that prior state
722 was definitely propagated to FILE's also_make's by set_command_state
723 (called above), but in another state an also_make may have
724 independently changed to finished state, and we would confuse that
725 file's bookkeeping (updated, but not_started is bogus state). */
726 set_command_state (file, cs_not_started);
727
728 /* Now record which prerequisites are more
729 recent than this file, so we can define $?. */
730
731 deps_changed = 0;
732#ifdef CONFIG_WITH_EXPLICIT_MULTITARGET
733 for (f2 = file; f2; f2 = f2->multi_next)
734#endif
735 for (d = file->deps; d != 0; d = d->next)
736 {
737 FILE_TIMESTAMP d_mtime = file_mtime (d->file);
738#ifdef CONFIG_WITH_EXPLICIT_MULTITARGET
739 if (d->file == file && f2->multi_maybe)
740 continue;
741#endif
742 check_renamed (d->file);
743
744 if (! d->ignore_mtime)
745 {
746#if 1
747 /* %%% In version 4, remove this code completely to
748 implement not remaking deps if their deps are newer
749 than their parents. */
750 if (d_mtime == NONEXISTENT_MTIME && !d->file->intermediate)
751 /* We must remake if this dep does not
752 exist and is not intermediate. */
753 must_make = 1;
754#endif
755
756 /* Set DEPS_CHANGED if this dep actually changed. */
757 deps_changed |= d->changed;
758 }
759
760 /* Set D->changed if either this dep actually changed,
761 or its dependent, FILE, is older or does not exist. */
762 d->changed |= noexist || d_mtime > this_mtime;
763
764 if (!noexist && ISDB (DB_BASIC|DB_VERBOSE))
765 {
766 const char *fmt = 0;
767
768 if (d->ignore_mtime)
769 {
770 if (ISDB (DB_VERBOSE))
771 fmt = _("Prerequisite `%s' is order-only for target `%s'.\n");
772 }
773 else if (d_mtime == NONEXISTENT_MTIME)
774 {
775 if (ISDB (DB_BASIC))
776 fmt = _("Prerequisite `%s' of target `%s' does not exist.\n");
777 }
778 else if (d->changed)
779 {
780 if (ISDB (DB_BASIC))
781 fmt = _("Prerequisite `%s' is newer than target `%s'.\n");
782 }
783 else if (ISDB (DB_VERBOSE))
784 fmt = _("Prerequisite `%s' is older than target `%s'.\n");
785
786 if (fmt)
787 {
788 print_spaces (depth);
789 printf (fmt, dep_name (d), file->name);
790 fflush (stdout);
791 }
792 }
793 }
794
795 /* Here depth returns to the value it had when we were called. */
796 depth--;
797
798 if (file->double_colon && file->deps == 0)
799 {
800 must_make = 1;
801 DBF (DB_BASIC,
802 _("Target `%s' is double-colon and has no prerequisites.\n"));
803 }
804 else if (!noexist && file->is_target && !deps_changed && file->cmds == 0
805 && !always_make_flag)
806 {
807 must_make = 0;
808 DBF (DB_VERBOSE,
809 _("No commands for `%s' and no prerequisites actually changed.\n"));
810 }
811 else if (!must_make && file->cmds != 0 && always_make_flag)
812 {
813 must_make = 1;
814 DBF (DB_VERBOSE, _("Making `%s' due to always-make flag.\n"));
815 }
816
817 if (!must_make)
818 {
819 if (ISDB (DB_VERBOSE))
820 {
821 print_spaces (depth);
822 printf (_("No need to remake target `%s'"), file->name);
823 if (!streq (file->name, file->hname))
824 printf (_("; using VPATH name `%s'"), file->hname);
825 puts (".");
826 fflush (stdout);
827 }
828
829 notice_finished_file (file);
830
831 /* Since we don't need to remake the file, convert it to use the
832 VPATH filename if we found one. hfile will be either the
833 local name if no VPATH or the VPATH name if one was found. */
834
835 while (file)
836 {
837 file->name = file->hname;
838 file = file->prev;
839 }
840
841 return 0;
842 }
843
844 DBF (DB_BASIC, _("Must remake target `%s'.\n"));
845
846 /* It needs to be remade. If it's VPATH and not reset via GPATH, toss the
847 VPATH. */
848 if (!streq(file->name, file->hname))
849 {
850 DB (DB_BASIC, (_(" Ignoring VPATH name `%s'.\n"), file->hname));
851 file->ignore_vpath = 1;
852 }
853
854 /* Now, take appropriate actions to remake the file. */
855 remake_file (file);
856
857 if (file->command_state != cs_finished)
858 {
859 DBF (DB_VERBOSE, _("Commands of `%s' are being run.\n"));
860 return 0;
861 }
862
863 switch (file->update_status)
864 {
865 case 2:
866 DBF (DB_BASIC, _("Failed to remake target file `%s'.\n"));
867 break;
868 case 0:
869 DBF (DB_BASIC, _("Successfully remade target file `%s'.\n"));
870 break;
871 case 1:
872 DBF (DB_BASIC, _("Target file `%s' needs remade under -q.\n"));
873 break;
874 default:
875 assert (file->update_status >= 0 && file->update_status <= 2);
876 break;
877 }
878
879 file->updated = 1;
880 return file->update_status;
881}
882
883
884/* Set FILE's `updated' flag and re-check its mtime and the mtime's of all
885 files listed in its `also_make' member. Under -t, this function also
886 touches FILE.
887
888 On return, FILE->update_status will no longer be -1 if it was. */
889
890void
891notice_finished_file (struct file *file)
892{
893#ifdef CONFIG_WITH_EXPLICIT_MULTITARGET
894 struct file *f2;
895#endif
896 struct dep *d;
897 int ran = file->command_state == cs_running;
898 int touched = 0;
899 DB (DB_JOBS, (_("notice_finished_file - entering: file=%p `%s' update_status=%d command_state=%d\n"), /* bird */
900 file, file->name, file->update_status, file->command_state));
901 file->command_state = cs_finished;
902 file->updated = 1;
903#ifdef CONFIG_WITH_EXPLICIT_MULTITARGET
904 if (file->multi_head)
905 {
906 assert (file == file->multi_head);
907 for (f2 = file->multi_next; f2 != 0; f2 = f2->multi_next)
908 {
909 f2->command_state = cs_finished;
910 f2->updated = 1;
911 }
912 }
913#endif
914
915#ifdef CONFIG_WITH_EXTENDED_NOTPARALLEL
916 /* update not_parallel if the file was flagged for that. */
917 if ( ran
918 && (file->command_flags & (COMMANDS_NOTPARALLEL | COMMANDS_NO_COMMANDS))
919 == COMMANDS_NOTPARALLEL)
920 {
921 DB (DB_KMK, (_("not_parallel %d -> %d (file=%p `%s') [notice_finished_file]\n"), not_parallel,
922 not_parallel - 1, file, file->name));
923 assert(not_parallel >= 1);
924 --not_parallel;
925 }
926#endif
927
928 if (touch_flag
929 /* The update status will be:
930 -1 if this target was not remade;
931 0 if 0 or more commands (+ or ${MAKE}) were run and won;
932 1 if some commands were run and lost.
933 We touch the target if it has commands which either were not run
934 or won when they ran (i.e. status is 0). */
935 && file->update_status == 0)
936 {
937 if (file->cmds != 0 && file->cmds->any_recurse)
938 {
939 /* If all the command lines were recursive,
940 we don't want to do the touching. */
941 unsigned int i;
942 for (i = 0; i < file->cmds->ncommand_lines; ++i)
943 if (!(file->cmds->lines_flags[i] & COMMANDS_RECURSE))
944 goto have_nonrecursing;
945 }
946 else
947 {
948 have_nonrecursing:
949 if (file->phony)
950#ifdef CONFIG_WITH_EXPLICIT_MULTITARGET
951 {
952 file->update_status = 0;
953 if (file->multi_head)
954 for (f2 = file->multi_next; f2 != 0; f2 = f2->multi_next)
955 f2->update_status = 0;
956 }
957#else
958 file->update_status = 0;
959#endif
960 /* According to POSIX, -t doesn't affect targets with no cmds. */
961 else if (file->cmds != 0)
962 {
963 /* Should set file's modification date and do nothing else. */
964 file->update_status = touch_file (file);
965#ifdef CONFIG_WITH_EXPLICIT_MULTITARGET
966 if (file->multi_head)
967 for (f2 = file->multi_next; f2 != 0; f2 = f2->multi_next)
968 {
969 /* figure out this, touch if it exist ignore otherwise? */
970 }
971#endif
972
973 /* Pretend we ran a real touch command, to suppress the
974 "`foo' is up to date" message. */
975 commands_started++;
976
977 /* Request for the timestamp to be updated (and distributed
978 to the double-colon entries). Simply setting ran=1 would
979 almost have done the trick, but messes up with the also_make
980 updating logic below. */
981 touched = 1;
982 }
983 }
984 }
985
986 if (file->mtime_before_update == UNKNOWN_MTIME)
987 file->mtime_before_update = file->last_mtime;
988#ifdef CONFIG_WITH_EXPLICIT_MULTITARGET
989 if (file->multi_head)
990 for (f2 = file->multi_next; f2 != 0; f2 = f2->multi_next)
991 if (f2->mtime_before_update == UNKNOWN_MTIME)
992 f2->mtime_before_update = f2->last_mtime;
993#endif
994
995 if ((ran && !file->phony) || touched)
996 {
997 int i = 0;
998
999 /* If -n, -t, or -q and all the commands are recursive, we ran them so
1000 really check the target's mtime again. Otherwise, assume the target
1001 would have been updated. */
1002
1003 if (question_flag || just_print_flag || touch_flag)
1004 {
1005 for (i = file->cmds->ncommand_lines; i > 0; --i)
1006 if (! (file->cmds->lines_flags[i-1] & COMMANDS_RECURSE))
1007 break;
1008 }
1009
1010 /* If there were no commands at all, it's always new. */
1011
1012 else if (file->is_target && file->cmds == 0)
1013 i = 1;
1014
1015 file->last_mtime = i == 0 ? UNKNOWN_MTIME : NEW_MTIME;
1016#ifdef CONFIG_WITH_EXPLICIT_MULTITARGET
1017 if (file->multi_head)
1018 for (f2 = file->multi_next; f2 != 0; f2 = f2->multi_next)
1019 file->last_mtime = i == 0 ? UNKNOWN_MTIME : NEW_MTIME; /*??*/
1020#endif
1021 }
1022
1023 if (file->double_colon)
1024 {
1025 /* If this is a double colon rule and it is the last one to be
1026 updated, propagate the change of modification time to all the
1027 double-colon entries for this file.
1028
1029 We do it on the last update because it is important to handle
1030 individual entries as separate rules with separate timestamps
1031 while they are treated as targets and then as one rule with the
1032 unified timestamp when they are considered as a prerequisite
1033 of some target. */
1034
1035 struct file *f;
1036 FILE_TIMESTAMP max_mtime = file->last_mtime;
1037
1038 /* Check that all rules were updated and at the same time find
1039 the max timestamp. We assume UNKNOWN_MTIME is newer then
1040 any other value. */
1041 for (f = file->double_colon; f != 0 && f->updated; f = f->prev)
1042 if (max_mtime != UNKNOWN_MTIME
1043 && (f->last_mtime == UNKNOWN_MTIME || f->last_mtime > max_mtime))
1044 max_mtime = f->last_mtime;
1045
1046 if (f == 0)
1047 for (f = file->double_colon; f != 0; f = f->prev)
1048 f->last_mtime = max_mtime;
1049 }
1050
1051 if (ran && file->update_status != -1)
1052#ifdef CONFIG_WITH_EXPLICIT_MULTITARGET
1053 {
1054#endif
1055 /* We actually tried to update FILE, which has
1056 updated its also_make's as well (if it worked).
1057 If it didn't work, it wouldn't work again for them.
1058 So mark them as updated with the same status. */
1059 for (d = file->also_make; d != 0; d = d->next)
1060 {
1061 d->file->command_state = cs_finished;
1062 d->file->updated = 1;
1063 d->file->update_status = file->update_status;
1064
1065 if (ran && !d->file->phony)
1066 /* Fetch the new modification time.
1067 We do this instead of just invalidating the cached time
1068 so that a vpath_search can happen. Otherwise, it would
1069 never be done because the target is already updated. */
1070 f_mtime (d->file, 0);
1071 }
1072#ifdef CONFIG_WITH_EXPLICIT_MULTITARGET
1073 /* Same as above but for explicit multi target rules. */
1074 if (file->multi_head)
1075 for (f2 = file->multi_next; f2 != 0; f2 = f2->multi_next)
1076 {
1077 f2->update_status = file->update_status;
1078 if (!f2->phony)
1079 f_mtime (f2, 0);
1080 }
1081 }
1082#endif
1083 else if (file->update_status == -1)
1084#ifdef CONFIG_WITH_EXPLICIT_MULTITARGET
1085 {
1086 /* Nothing was done for FILE, but it needed nothing done.
1087 So mark it now as "succeeded". */
1088 file->update_status = 0;
1089 if (file->multi_head)
1090 for (f2 = file->multi_next; f2 != 0; f2 = f2->multi_next)
1091 f2->update_status = 0;
1092 }
1093#else
1094 /* Nothing was done for FILE, but it needed nothing done.
1095 So mark it now as "succeeded". */
1096 file->update_status = 0;
1097#endif
1098}
1099
1100
1101/* Check whether another file (whose mtime is THIS_MTIME) needs updating on
1102 account of a dependency which is file FILE. If it does, store 1 in
1103 *MUST_MAKE_PTR. In the process, update any non-intermediate files that
1104 FILE depends on (including FILE itself). Return nonzero if any updating
1105 failed. */
1106
1107static int
1108check_dep (struct file *file, unsigned int depth,
1109 FILE_TIMESTAMP this_mtime, int *must_make_ptr)
1110{
1111 struct dep *d;
1112 int dep_status = 0;
1113
1114 ++depth;
1115 start_updating (file);
1116
1117 if (file->phony || !file->intermediate)
1118 {
1119 /* If this is a non-intermediate file, update it and record whether it
1120 is newer than THIS_MTIME. */
1121 FILE_TIMESTAMP mtime;
1122 dep_status = update_file (file, depth);
1123 check_renamed (file);
1124 mtime = file_mtime (file);
1125 check_renamed (file);
1126 if (mtime == NONEXISTENT_MTIME || mtime > this_mtime)
1127 *must_make_ptr = 1;
1128 }
1129 else
1130 {
1131 /* FILE is an intermediate file. */
1132 FILE_TIMESTAMP mtime;
1133
1134 if (!file->phony && file->cmds == 0 && !file->tried_implicit)
1135 {
1136 if (try_implicit_rule (file, depth))
1137 DBF (DB_IMPLICIT, _("Found an implicit rule for `%s'.\n"));
1138 else
1139 DBF (DB_IMPLICIT, _("No implicit rule found for `%s'.\n"));
1140 file->tried_implicit = 1;
1141 }
1142 if (file->cmds == 0 && !file->is_target
1143 && default_file != 0 && default_file->cmds != 0)
1144 {
1145 DBF (DB_IMPLICIT, _("Using default commands for `%s'.\n"));
1146 file->cmds = default_file->cmds;
1147 }
1148
1149 check_renamed (file);
1150 mtime = file_mtime (file);
1151 check_renamed (file);
1152 if (mtime != NONEXISTENT_MTIME && mtime > this_mtime)
1153 /* If the intermediate file actually exists and is newer, then we
1154 should remake from it. */
1155 *must_make_ptr = 1;
1156 else
1157 {
1158 /* Otherwise, update all non-intermediate files we depend on, if
1159 necessary, and see whether any of them is more recent than the
1160 file on whose behalf we are checking. */
1161 struct dep *lastd;
1162
1163 lastd = 0;
1164 d = file->deps;
1165 while (d != 0)
1166 {
1167 int maybe_make;
1168
1169 if (is_updating (d->file))
1170 {
1171 error (NILF, _("Circular %s <- %s dependency dropped."),
1172 file->name, d->file->name);
1173 if (lastd == 0)
1174 {
1175 file->deps = d->next;
1176 free_dep (d);
1177 d = file->deps;
1178 }
1179 else
1180 {
1181 lastd->next = d->next;
1182 free_dep (d);
1183 d = lastd->next;
1184 }
1185 continue;
1186 }
1187
1188 d->file->parent = file;
1189 maybe_make = *must_make_ptr;
1190 dep_status |= check_dep (d->file, depth, this_mtime,
1191 &maybe_make);
1192 if (! d->ignore_mtime)
1193 *must_make_ptr = maybe_make;
1194 check_renamed (d->file);
1195 if (dep_status != 0 && !keep_going_flag)
1196 break;
1197
1198 if (d->file->command_state == cs_running
1199 || d->file->command_state == cs_deps_running)
1200 /* Record that some of FILE's deps are still being made.
1201 This tells the upper levels to wait on processing it until
1202 the commands are finished. */
1203 set_command_state (file, cs_deps_running);
1204
1205 lastd = d;
1206 d = d->next;
1207 }
1208 }
1209 }
1210
1211 finish_updating (file);
1212 return dep_status;
1213}
1214
1215
1216/* Touch FILE. Return zero if successful, one if not. */
1217
1218#define TOUCH_ERROR(call) return (perror_with_name (call, file->name), 1)
1219
1220static int
1221touch_file (struct file *file)
1222{
1223 if (!silent_flag)
1224 message (0, "touch %s", file->name);
1225
1226#ifndef NO_ARCHIVES
1227 if (ar_name (file->name))
1228 return ar_touch (file->name);
1229 else
1230#endif
1231 {
1232 int fd = open (file->name, O_RDWR | O_CREAT, 0666);
1233
1234 if (fd < 0)
1235 TOUCH_ERROR ("touch: open: ");
1236 else
1237 {
1238 struct stat statbuf;
1239 char buf = 'x';
1240 int e;
1241
1242 EINTRLOOP (e, fstat (fd, &statbuf));
1243 if (e < 0)
1244 TOUCH_ERROR ("touch: fstat: ");
1245 /* Rewrite character 0 same as it already is. */
1246 if (read (fd, &buf, 1) < 0)
1247 TOUCH_ERROR ("touch: read: ");
1248 if (lseek (fd, 0L, 0) < 0L)
1249 TOUCH_ERROR ("touch: lseek: ");
1250 if (write (fd, &buf, 1) < 0)
1251 TOUCH_ERROR ("touch: write: ");
1252 /* If file length was 0, we just
1253 changed it, so change it back. */
1254 if (statbuf.st_size == 0)
1255 {
1256 (void) close (fd);
1257 fd = open (file->name, O_RDWR | O_TRUNC, 0666);
1258 if (fd < 0)
1259 TOUCH_ERROR ("touch: open: ");
1260 }
1261 (void) close (fd);
1262 }
1263 }
1264
1265 return 0;
1266}
1267
1268
1269/* Having checked and updated the dependencies of FILE,
1270 do whatever is appropriate to remake FILE itself.
1271 Return the status from executing FILE's commands. */
1272
1273static void
1274remake_file (struct file *file)
1275{
1276#ifdef CONFIG_WITH_EXPLICIT_MULTITARGET
1277 assert(file->multi_head == NULL || file->multi_head == file);
1278#endif
1279
1280 if (file->cmds == 0)
1281 {
1282 if (file->phony)
1283 /* Phony target. Pretend it succeeded. */
1284 file->update_status = 0;
1285 else if (file->is_target)
1286 /* This is a nonexistent target file we cannot make.
1287 Pretend it was successfully remade. */
1288 file->update_status = 0;
1289 else
1290 {
1291 /* This is a dependency file we cannot remake. Fail. */
1292 if (!rebuilding_makefiles || !file->dontcare)
1293 complain (file);
1294 file->update_status = 2;
1295 }
1296 }
1297 else
1298 {
1299 chop_commands (file->cmds);
1300
1301 /* The normal case: start some commands. */
1302 if (!touch_flag || file->cmds->any_recurse)
1303 {
1304 execute_file_commands (file);
1305 return;
1306 }
1307
1308 /* This tells notice_finished_file it is ok to touch the file. */
1309 file->update_status = 0;
1310 }
1311
1312 /* This does the touching under -t. */
1313 notice_finished_file (file);
1314}
1315
1316
1317/* Return the mtime of a file, given a `struct file'.
1318 Caches the time in the struct file to avoid excess stat calls.
1319
1320 If the file is not found, and SEARCH is nonzero, VPATH searching and
1321 replacement is done. If that fails, a library (-lLIBNAME) is tried and
1322 the library's actual name (/lib/libLIBNAME.a, etc.) is substituted into
1323 FILE. */
1324
1325FILE_TIMESTAMP
1326f_mtime (struct file *file, int search)
1327{
1328 FILE_TIMESTAMP mtime;
1329
1330 /* File's mtime is not known; must get it from the system. */
1331
1332#ifndef NO_ARCHIVES
1333 if (ar_name (file->name))
1334 {
1335 /* This file is an archive-member reference. */
1336
1337 char *arname, *memname;
1338 struct file *arfile;
1339 time_t member_date;
1340
1341 /* Find the archive's name. */
1342 ar_parse_name (file->name, &arname, &memname);
1343
1344 /* Find the modification time of the archive itself.
1345 Also allow for its name to be changed via VPATH search. */
1346 arfile = lookup_file (arname);
1347 if (arfile == 0)
1348 arfile = enter_file (strcache_add (arname));
1349 mtime = f_mtime (arfile, search);
1350 check_renamed (arfile);
1351 if (search && strcmp (arfile->hname, arname))
1352 {
1353 /* The archive's name has changed.
1354 Change the archive-member reference accordingly. */
1355
1356 char *name;
1357 unsigned int arlen, memlen;
1358
1359 arlen = strlen (arfile->hname);
1360 memlen = strlen (memname);
1361
1362 name = xmalloc (arlen + 1 + memlen + 2);
1363 memcpy (name, arfile->hname, arlen);
1364 name[arlen] = '(';
1365 memcpy (name + arlen + 1, memname, memlen);
1366 name[arlen + 1 + memlen] = ')';
1367 name[arlen + 1 + memlen + 1] = '\0';
1368
1369 /* If the archive was found with GPATH, make the change permanent;
1370 otherwise defer it until later. */
1371 if (arfile->name == arfile->hname)
1372 rename_file (file, name);
1373 else
1374 rehash_file (file, name);
1375 check_renamed (file);
1376 }
1377
1378 free (arname);
1379
1380 file->low_resolution_time = 1;
1381
1382 if (mtime == NONEXISTENT_MTIME)
1383 /* The archive doesn't exist, so its members don't exist either. */
1384 return NONEXISTENT_MTIME;
1385
1386 member_date = ar_member_date (file->hname);
1387 mtime = (member_date == (time_t) -1
1388 ? NONEXISTENT_MTIME
1389 : file_timestamp_cons (file->hname, member_date, 0));
1390 }
1391 else
1392#endif
1393 {
1394 mtime = name_mtime (file->name);
1395
1396 if (mtime == NONEXISTENT_MTIME && search && !file->ignore_vpath)
1397 {
1398 /* If name_mtime failed, search VPATH. */
1399 const char *name = vpath_search (file->name, &mtime);
1400 if (name
1401 /* Last resort, is it a library (-lxxx)? */
1402 || (file->name[0] == '-' && file->name[1] == 'l'
1403 && (name = library_search (file->name, &mtime)) != 0))
1404 {
1405 if (mtime != UNKNOWN_MTIME)
1406 /* vpath_search and library_search store UNKNOWN_MTIME
1407 if they didn't need to do a stat call for their work. */
1408 file->last_mtime = mtime;
1409
1410 /* If we found it in VPATH, see if it's in GPATH too; if so,
1411 change the name right now; if not, defer until after the
1412 dependencies are updated. */
1413 if (gpath_search (name, strlen(name) - strlen(file->name) - 1))
1414 {
1415 rename_file (file, name);
1416 check_renamed (file);
1417 return file_mtime (file);
1418 }
1419
1420 rehash_file (file, name);
1421 check_renamed (file);
1422 /* If the result of a vpath search is -o or -W, preserve it.
1423 Otherwise, find the mtime of the resulting file. */
1424 if (mtime != OLD_MTIME && mtime != NEW_MTIME)
1425 mtime = name_mtime (name);
1426 }
1427 }
1428 }
1429
1430 /* Files can have bogus timestamps that nothing newly made will be
1431 "newer" than. Updating their dependents could just result in loops.
1432 So notify the user of the anomaly with a warning.
1433
1434 We only need to do this once, for now. */
1435
1436 if (!clock_skew_detected
1437 && mtime != NONEXISTENT_MTIME && mtime != NEW_MTIME
1438 && !file->updated)
1439 {
1440 static FILE_TIMESTAMP adjusted_now;
1441
1442 FILE_TIMESTAMP adjusted_mtime = mtime;
1443
1444#if defined(WINDOWS32) || defined(__MSDOS__)
1445 /* Experimentation has shown that FAT filesystems can set file times
1446 up to 3 seconds into the future! Play it safe. */
1447
1448#define FAT_ADJ_OFFSET (FILE_TIMESTAMP) 3
1449
1450 FILE_TIMESTAMP adjustment = FAT_ADJ_OFFSET << FILE_TIMESTAMP_LO_BITS;
1451 if (ORDINARY_MTIME_MIN + adjustment <= adjusted_mtime)
1452 adjusted_mtime -= adjustment;
1453#elif defined(__EMX__)
1454 /* FAT filesystems round time to the nearest even second!
1455 Allow for any file (NTFS or FAT) to perhaps suffer from this
1456 brain damage. */
1457 FILE_TIMESTAMP adjustment = (((FILE_TIMESTAMP_S (adjusted_mtime) & 1) == 0
1458 && FILE_TIMESTAMP_NS (adjusted_mtime) == 0)
1459 ? (FILE_TIMESTAMP) 1 << FILE_TIMESTAMP_LO_BITS
1460 : 0);
1461#endif
1462
1463 /* If the file's time appears to be in the future, update our
1464 concept of the present and try once more. */
1465 if (adjusted_now < adjusted_mtime)
1466 {
1467 int resolution;
1468 FILE_TIMESTAMP now = file_timestamp_now (&resolution);
1469 adjusted_now = now + (resolution - 1);
1470 if (adjusted_now < adjusted_mtime)
1471 {
1472#ifdef NO_FLOAT
1473 error (NILF, _("Warning: File `%s' has modification time in the future"),
1474 file->name);
1475#else
1476 double from_now =
1477 (FILE_TIMESTAMP_S (mtime) - FILE_TIMESTAMP_S (now)
1478 + ((FILE_TIMESTAMP_NS (mtime) - FILE_TIMESTAMP_NS (now))
1479 / 1e9));
1480 error (NILF, _("Warning: File `%s' has modification time %.2g s in the future"),
1481 file->name, from_now);
1482#endif
1483 clock_skew_detected = 1;
1484 }
1485 }
1486 }
1487
1488 /* Store the mtime into all the entries for this file. */
1489 if (file->double_colon)
1490 file = file->double_colon;
1491
1492 do
1493 {
1494 /* If this file is not implicit but it is intermediate then it was
1495 made so by the .INTERMEDIATE target. If this file has never
1496 been built by us but was found now, it existed before make
1497 started. So, turn off the intermediate bit so make doesn't
1498 delete it, since it didn't create it. */
1499 if (mtime != NONEXISTENT_MTIME && file->command_state == cs_not_started
1500 && file->command_state == cs_not_started
1501 && !file->tried_implicit && file->intermediate)
1502 file->intermediate = 0;
1503
1504 file->last_mtime = mtime;
1505 file = file->prev;
1506 }
1507 while (file != 0);
1508
1509 return mtime;
1510}
1511
1512
1513/* Return the mtime of the file or archive-member reference NAME. */
1514
1515/* First, we check with stat(). If the file does not exist, then we return
1516 NONEXISTENT_MTIME. If it does, and the symlink check flag is set, then
1517 examine each indirection of the symlink and find the newest mtime.
1518 This causes one duplicate stat() when -L is being used, but the code is
1519 much cleaner. */
1520
1521static FILE_TIMESTAMP
1522name_mtime (const char *name)
1523{
1524 FILE_TIMESTAMP mtime;
1525 struct stat st;
1526 int e;
1527
1528 EINTRLOOP (e, stat (name, &st));
1529 if (e == 0)
1530 mtime = FILE_TIMESTAMP_STAT_MODTIME (name, st);
1531 else if (errno == ENOENT || errno == ENOTDIR)
1532 mtime = NONEXISTENT_MTIME;
1533 else
1534 {
1535 perror_with_name ("stat: ", name);
1536 return NONEXISTENT_MTIME;
1537 }
1538
1539 /* If we get here we either found it, or it doesn't exist.
1540 If it doesn't exist see if we can use a symlink mtime instead. */
1541
1542#ifdef MAKE_SYMLINKS
1543#ifndef S_ISLNK
1544# define S_ISLNK(_m) (((_m)&S_IFMT)==S_IFLNK)
1545#endif
1546 if (check_symlink_flag)
1547 {
1548 PATH_VAR (lpath);
1549
1550 /* Check each symbolic link segment (if any). Find the latest mtime
1551 amongst all of them (and the target file of course).
1552 Note that we have already successfully dereferenced all the links
1553 above. So, if we run into any error trying to lstat(), or
1554 readlink(), or whatever, something bizarre-o happened. Just give up
1555 and use whatever mtime we've already computed at that point. */
1556 strcpy (lpath, name);
1557 while (1)
1558 {
1559 FILE_TIMESTAMP ltime;
1560 PATH_VAR (lbuf);
1561 long llen;
1562 char *p;
1563
1564 EINTRLOOP (e, lstat (lpath, &st));
1565 if (e)
1566 {
1567 /* Just take what we have so far. */
1568 if (errno != ENOENT && errno != ENOTDIR)
1569 perror_with_name ("lstat: ", lpath);
1570 break;
1571 }
1572
1573 /* If this is not a symlink, we're done (we started with the real
1574 file's mtime so we don't need to test it again). */
1575 if (!S_ISLNK (st.st_mode))
1576 break;
1577
1578 /* If this mtime is newer than what we had, keep the new one. */
1579 ltime = FILE_TIMESTAMP_STAT_MODTIME (lpath, st);
1580 if (ltime > mtime)
1581 mtime = ltime;
1582
1583 /* Set up to check the file pointed to by this link. */
1584 EINTRLOOP (llen, readlink (lpath, lbuf, GET_PATH_MAX));
1585 if (llen < 0)
1586 {
1587 /* Eh? Just take what we have. */
1588 perror_with_name ("readlink: ", lpath);
1589 break;
1590 }
1591 lbuf[llen] = '\0';
1592
1593 /* If the target is fully-qualified or the source is just a
1594 filename, then the new path is the target. Otherwise it's the
1595 source directory plus the target. */
1596 if (lbuf[0] == '/' || (p = strrchr (lpath, '/')) == NULL)
1597 strcpy (lpath, lbuf);
1598 else if ((p - lpath) + llen + 2 > GET_PATH_MAX)
1599 /* Eh? Path too long! Again, just go with what we have. */
1600 break;
1601 else
1602 /* Create the next step in the symlink chain. */
1603 strcpy (p+1, lbuf);
1604 }
1605 }
1606#endif
1607
1608 return mtime;
1609}
1610
1611
1612/* Search for a library file specified as -lLIBNAME, searching for a
1613 suitable library file in the system library directories and the VPATH
1614 directories. */
1615
1616static const char *
1617library_search (const char *lib, FILE_TIMESTAMP *mtime_ptr)
1618{
1619 static char *dirs[] =
1620 {
1621#ifdef KMK
1622 ".",
1623#else /* !KMK */
1624#ifndef _AMIGA
1625 "/lib",
1626 "/usr/lib",
1627#endif
1628#if defined(WINDOWS32) && !defined(LIBDIR)
1629/*
1630 * This is completely up to the user at product install time. Just define
1631 * a placeholder.
1632 */
1633#define LIBDIR "."
1634#endif
1635# ifdef LIBDIR /* bird */
1636 LIBDIR, /* Defined by configuration. */
1637# else /* bird */
1638 ".", /* bird */
1639# endif /* bird */
1640#endif /* !KMK */
1641 0
1642 };
1643
1644 static char *libpatterns = NULL;
1645
1646 const char *libname = lib+2; /* Name without the '-l'. */
1647 FILE_TIMESTAMP mtime;
1648
1649 /* Loop variables for the libpatterns value. */
1650 char *p;
1651 const char *p2;
1652 unsigned int len;
1653
1654 char **dp;
1655
1656 /* If we don't have libpatterns, get it. */
1657 if (!libpatterns)
1658 {
1659 int save = warn_undefined_variables_flag;
1660 warn_undefined_variables_flag = 0;
1661
1662 libpatterns = xstrdup (variable_expand ("$(strip $(.LIBPATTERNS))"));
1663
1664 warn_undefined_variables_flag = save;
1665 }
1666
1667 /* Loop through all the patterns in .LIBPATTERNS, and search on each one. */
1668 p2 = libpatterns;
1669 while ((p = find_next_token (&p2, &len)) != 0)
1670 {
1671 static char *buf = NULL;
1672 static unsigned int buflen = 0;
1673 static int libdir_maxlen = -1;
1674 char *libbuf = variable_expand ("");
1675 const size_t libbuf_offset = libbuf - variable_buffer; /* bird */
1676
1677 /* Expand the pattern using LIBNAME as a replacement. */
1678 {
1679 char c = p[len];
1680 char *p3, *p4;
1681
1682 p[len] = '\0';
1683 p3 = find_percent (p);
1684 if (!p3)
1685 {
1686 /* Give a warning if there is no pattern, then remove the
1687 pattern so it's ignored next time. */
1688 error (NILF, _(".LIBPATTERNS element `%s' is not a pattern"), p);
1689 for (; len; --len, ++p)
1690 *p = ' ';
1691 *p = c;
1692 continue;
1693 }
1694 p4 = variable_buffer_output (libbuf, p, p3-p);
1695 p4 = variable_buffer_output (p4, libname, strlen (libname));
1696 p4 = variable_buffer_output (p4, p3+1, len - (p3-p));
1697 p[len] = c;
1698 libbuf = variable_buffer + libbuf_offset; /* bird - variable_buffer may have been reallocated. */
1699 }
1700
1701 /* Look first for `libNAME.a' in the current directory. */
1702 mtime = name_mtime (libbuf);
1703 if (mtime != NONEXISTENT_MTIME)
1704 {
1705 if (mtime_ptr != 0)
1706 *mtime_ptr = mtime;
1707 return strcache_add (libbuf);
1708 }
1709
1710 /* Now try VPATH search on that. */
1711
1712 {
1713 const char *file = vpath_search (libbuf, mtime_ptr);
1714 if (file)
1715 return file;
1716 }
1717
1718 /* Now try the standard set of directories. */
1719
1720 if (!buflen)
1721 {
1722 for (dp = dirs; *dp != 0; ++dp)
1723 {
1724 int l = strlen (*dp);
1725 if (l > libdir_maxlen)
1726 libdir_maxlen = l;
1727 }
1728 buflen = strlen (libbuf);
1729 buf = xmalloc(libdir_maxlen + buflen + 2);
1730 }
1731 else if (buflen < strlen (libbuf))
1732 {
1733 buflen = strlen (libbuf);
1734 buf = xrealloc (buf, libdir_maxlen + buflen + 2);
1735 }
1736
1737 for (dp = dirs; *dp != 0; ++dp)
1738 {
1739 sprintf (buf, "%s/%s", *dp, libbuf);
1740 mtime = name_mtime (buf);
1741 if (mtime != NONEXISTENT_MTIME)
1742 {
1743 if (mtime_ptr != 0)
1744 *mtime_ptr = mtime;
1745 return strcache_add (buf);
1746 }
1747 }
1748 }
1749
1750 return 0;
1751}
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