VirtualBox

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

Last change on this file since 2700 was 2666, checked in by bird, 13 years ago

remake.c: Remake if we tried to update a non-existing multi_maybe file. Doesn't always fix the issue thought, some syntax redefinitions will be required.

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

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette