VirtualBox

source: kBuild/trunk/src/gmakenew/remake.c@ 944

Last change on this file since 944 was 923, checked in by bird, 18 years ago

Fixed double remake of maybe-update targets.

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

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