source: trunk/src/kmk/remake.c@ 2742

Last change on this file since 2742 was 2742, checked in by bird, 11 years ago

remake.c: Some check_rename and rename related fixes to update_file_1.

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