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