1 /*
2  * Copyright 1993-2002 Christopher Seiwald and Perforce Software, Inc.
3  *
4  * This file is part of Jam - see jam.c for Copyright information.
5  */
6 
7 /*  This file is ALSO:
8  *  Copyright 2001-2004 David Abrahams.
9  *  Distributed under the Boost Software License, Version 1.0.
10  *  (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
11  */
12 
13 /*
14  * make1.c - execute commands to bring targets up to date
15  *
16  * This module contains make1(), the entry point called by make() to recursively
17  * descend the dependency graph executing update actions as marked by make0().
18  *
19  * External routines:
20  *   make1() - execute commands to update a TARGET and all of its dependencies
21  *
22  * Internal routines, the recursive/asynchronous command executors:
23  *   make1a()         - recursively schedules dependency builds and then goes to
24  *                      MAKE1B
25  *   make1b()         - if nothing is blocking this target's build, proceed to
26  *                      MAKE1C
27  *   make1c()         - launch target's next command, or go to parents' MAKE1B
28  *                      if none
29  *   make1c_closure() - handle command execution completion and go to MAKE1C
30  *
31  * Internal support routines:
32  *   make1cmds()     - turn ACTIONS into CMDs, grouping, splitting, etc.
33  *   make1list()     - turn a list of targets into a LIST, for $(<) and $(>)
34  *   make1settings() - for vars with bound values, build up replacement lists
35  *   make1bind()     - bind targets that weren't bound in dependency analysis
36  */
37 
38 #include "jam.h"
39 #include "make.h"
40 
41 #include "command.h"
42 #include "compile.h"
43 #include "execcmd.h"
44 #include "headers.h"
45 #include "lists.h"
46 #include "object.h"
47 #include "output.h"
48 #include "parse.h"
49 #include "rules.h"
50 #include "search.h"
51 #include "variable.h"
52 #include "output.h"
53 
54 #include <assert.h>
55 #include <stdlib.h>
56 
57 #if !defined( NT ) || defined( __GNUC__ )
58     #include <unistd.h>  /* for unlink */
59 #endif
60 
61 static CMD      * make1cmds      ( TARGET * );
62 static LIST     * make1list      ( LIST *, TARGETS *, int flags );
63 static SETTINGS * make1settings  ( struct module_t *, LIST * vars );
64 static void       make1bind      ( TARGET * );
65 static TARGET   * make1findcycle ( TARGET * );
66 static void       make1breakcycle( TARGET *, TARGET * cycle_root );
67 static void       push_cmds( CMDLIST * cmds, int status );
68 static int        cmd_sem_lock( TARGET * t );
69 static void       cmd_sem_unlock( TARGET * t );
70 
71 static int targets_contains( TARGETS * l, TARGET * t );
72 static int targets_equal( TARGETS * l1, TARGETS * l2 );
73 
74 /* Ugly static - it is too hard to carry it through the callbacks. */
75 
76 static struct
77 {
78     int failed;
79     int skipped;
80     int total;
81     int made;
82 } counts[ 1 ];
83 
84 /* Target state. */
85 #define T_STATE_MAKE1A  0  /* make1a() should be called */
86 #define T_STATE_MAKE1B  1  /* make1b() should be called */
87 #define T_STATE_MAKE1C  2  /* make1c() should be called */
88 
89 typedef struct _state state;
90 struct _state
91 {
92     state  * prev;      /* previous state on stack */
93     TARGET * t;         /* current target */
94     TARGET * parent;    /* parent argument necessary for MAKE1A */
95     int      curstate;  /* current state */
96 };
97 
98 static void make1a( state * const );
99 static void make1b( state * const );
100 static void make1c( state const * const );
101 
102 static void make1c_closure( void * const closure, int status,
103     timing_info const * const, char const * const cmd_stdout,
104     char const * const cmd_stderr, int const cmd_exit_reason );
105 
106 typedef struct _stack
107 {
108     state * stack;
109 } stack;
110 
111 static stack state_stack = { NULL };
112 
113 static state * state_freelist = NULL;
114 
115 /* Currently running command counter. */
116 static int cmdsrunning;
117 
118 
alloc_state()119 static state * alloc_state()
120 {
121     if ( state_freelist )
122     {
123         state * const pState = state_freelist;
124         state_freelist = pState->prev;
125         memset( pState, 0, sizeof( state ) );
126         return pState;
127     }
128     return (state *)BJAM_MALLOC( sizeof( state ) );
129 }
130 
131 
free_state(state * const pState)132 static void free_state( state * const pState )
133 {
134     pState->prev = state_freelist;
135     state_freelist = pState;
136 }
137 
138 
clear_state_freelist()139 static void clear_state_freelist()
140 {
141     while ( state_freelist )
142     {
143         state * const pState = state_freelist;
144         state_freelist = state_freelist->prev;
145         BJAM_FREE( pState );
146     }
147 }
148 
149 
current_state(stack * const pStack)150 static state * current_state( stack * const pStack )
151 {
152     return pStack->stack;
153 }
154 
155 
pop_state(stack * const pStack)156 static void pop_state( stack * const pStack )
157 {
158     if ( pStack->stack )
159     {
160         state * const pState = pStack->stack->prev;
161         free_state( pStack->stack );
162         pStack->stack = pState;
163     }
164 }
165 
166 
push_state(stack * const pStack,TARGET * const t,TARGET * const parent,int const curstate)167 static state * push_state( stack * const pStack, TARGET * const t,
168     TARGET * const parent, int const curstate )
169 {
170     state * const pState = alloc_state();
171     pState->t = t;
172     pState->parent = parent;
173     pState->prev = pStack->stack;
174     pState->curstate = curstate;
175     return pStack->stack = pState;
176 }
177 
178 
179 /*
180  * Pushes a stack onto another stack, effectively reversing the order.
181  */
182 
push_stack_on_stack(stack * const pDest,stack * const pSrc)183 static void push_stack_on_stack( stack * const pDest, stack * const pSrc )
184 {
185     while ( pSrc->stack )
186     {
187         state * const pState = pSrc->stack;
188         pSrc->stack = pState->prev;
189         pState->prev = pDest->stack;
190         pDest->stack = pState;
191     }
192 }
193 
194 
195 /*
196  * make1() - execute commands to update a list of targets and all of their dependencies
197  */
198 
199 static int intr = 0;
200 static int quit = 0;
201 
make1(LIST * targets)202 int make1( LIST * targets )
203 {
204     state * pState;
205     int status = 0;
206 
207     memset( (char *)counts, 0, sizeof( *counts ) );
208 
209     {
210         LISTITER iter, end;
211         stack temp_stack = { NULL };
212         for ( iter = list_begin( targets ), end = list_end( targets );
213               iter != end; iter = list_next( iter ) )
214             push_state( &temp_stack, bindtarget( list_item( iter ) ), NULL, T_STATE_MAKE1A );
215         push_stack_on_stack( &state_stack, &temp_stack );
216     }
217 
218     /* Clear any state left over from the past */
219     quit = 0;
220 
221     /* Recursively make the target and its dependencies. */
222 
223     while ( 1 )
224     {
225         while ( ( pState = current_state( &state_stack ) ) )
226         {
227             if ( quit )
228                 pop_state( &state_stack );
229 
230             switch ( pState->curstate )
231             {
232                 case T_STATE_MAKE1A: make1a( pState ); break;
233                 case T_STATE_MAKE1B: make1b( pState ); break;
234                 case T_STATE_MAKE1C: make1c( pState ); break;
235                 default:
236                     assert( !"make1(): Invalid state detected." );
237             }
238         }
239         if ( !cmdsrunning )
240             break;
241         /* Wait for outstanding commands to finish running. */
242         exec_wait();
243     }
244 
245     clear_state_freelist();
246 
247     /* Talk about it. */
248     if ( counts->failed )
249         out_printf( "...failed updating %d target%s...\n", counts->failed,
250             counts->failed > 1 ? "s" : "" );
251     if ( DEBUG_MAKE && counts->skipped )
252         out_printf( "...skipped %d target%s...\n", counts->skipped,
253             counts->skipped > 1 ? "s" : "" );
254     if ( DEBUG_MAKE && counts->made )
255         out_printf( "...updated %d target%s...\n", counts->made,
256             counts->made > 1 ? "s" : "" );
257 
258     /* If we were interrupted, exit now that all child processes
259        have finished. */
260     if ( intr )
261         exit( EXITBAD );
262 
263     {
264         LISTITER iter, end;
265         for ( iter = list_begin( targets ), end = list_end( targets );
266               iter != end; iter = list_next( iter ) )
267         {
268             /* Check that the target was updated and that the
269                update succeeded. */
270             TARGET * t = bindtarget( list_item( iter ) );
271             if (t->progress == T_MAKE_DONE)
272             {
273                 if (t->status != EXEC_CMD_OK)
274                     status = 1;
275             }
276             else if ( ! ( t->progress == T_MAKE_NOEXEC_DONE && globs.noexec ) )
277             {
278                 status = 1;
279             }
280         }
281     }
282     return status;
283 }
284 
285 
286 /*
287  * make1a() - recursively schedules dependency builds and then goes to MAKE1B
288  *
289  * Called to start processing a specified target. Does nothing if the target is
290  * already being processed or otherwise starts processing all of its
291  * dependencies.
292  */
293 
make1a(state * const pState)294 static void make1a( state * const pState )
295 {
296     TARGET * t = pState->t;
297     TARGET * const scc_root = target_scc( t );
298 
299     if ( !pState->parent || target_scc( pState->parent ) != scc_root )
300         pState->t = t = scc_root;
301 
302     /* If the parent is the first to try to build this target or this target is
303      * in the MAKE1C quagmire, arrange for the parent to be notified when this
304      * target has been built.
305      */
306     if ( pState->parent && t->progress <= T_MAKE_RUNNING )
307     {
308         TARGET * const parent_scc = target_scc( pState->parent );
309         if ( t != parent_scc )
310         {
311             t->parents = targetentry( t->parents, parent_scc );
312             ++parent_scc->asynccnt;
313         }
314     }
315 
316     /* If the target has been previously updated with -n in effect, and we are
317      * now ignoring -n, update it for real. E.g. if the UPDATE_NOW rule was
318      * called for it twice - first with the -n option and then without.
319      */
320     if ( !globs.noexec && t->progress == T_MAKE_NOEXEC_DONE )
321         t->progress = T_MAKE_INIT;
322 
323     /* If this target is already being processed then do nothing. There is no
324      * need to start processing the same target all over again.
325      */
326     if ( t->progress != T_MAKE_INIT )
327     {
328         pop_state( &state_stack );
329         return;
330     }
331 
332     /* Guard against circular dependencies. */
333     t->progress = T_MAKE_ONSTACK;
334 
335     /* 'asynccnt' counts the dependencies preventing this target from proceeding
336      * to MAKE1C for actual building. We start off with a count of 1 to prevent
337      * anything from happening until we can notify all dependencies that they
338      * are needed. This 1 is then accounted for when we enter MAKE1B ourselves,
339      * below. Without this if a dependency gets built before we finish
340      * processing all of our other dependencies our build might be triggered
341      * prematurely.
342      */
343     t->asynccnt = 1;
344 
345     /* Push dependency build requests (to be executed in the natural order). */
346     {
347         stack temp_stack = { NULL };
348         TARGETS * c;
349         for ( c = t->depends; c && !quit; c = c->next )
350             push_state( &temp_stack, c->target, t, T_STATE_MAKE1A );
351         push_stack_on_stack( &state_stack, &temp_stack );
352     }
353 
354     t->progress = T_MAKE_ACTIVE;
355 
356     /* Once all of our dependencies have started getting processed we can move
357      * onto MAKE1B.
358      */
359     /* Implementation note:
360      *   In theory this would be done by popping this state before pushing
361      * dependency target build requests but as a slight optimization we simply
362      * modify our current state and leave it on the stack instead.
363      */
364     pState->curstate = T_STATE_MAKE1B;
365 }
366 
367 
368 /*
369  * make1b() - if nothing is blocking this target's build, proceed to MAKE1C
370  *
371  * Called after something stops blocking this target's build, e.g. that all of
372  * its dependencies have started being processed, one of its dependencies has
373  * been built or a semaphore this target has been waiting for is free again.
374  */
375 
make1b(state * const pState)376 static void make1b( state * const pState )
377 {
378     TARGET * const t = pState->t;
379     TARGET * failed = 0;
380     char const * failed_name = "dependencies";
381 
382     pop_state( &state_stack );
383 
384     /* If any dependencies are still outstanding, wait until they signal their
385      * completion by pushing this same state for their parent targets.
386      */
387     if ( --t->asynccnt )
388     {
389         return;
390     }
391 
392     /* Now ready to build target 't', if dependencies built OK. */
393 
394     /* Collect status from dependencies. If -n was passed then act as though all
395      * dependencies built correctly (the only way they can fail is if UPDATE_NOW
396      * was called). If the dependencies can not be found or we got an interrupt,
397      * we can not get here.
398      */
399     if ( !globs.noexec )
400     {
401         TARGETS * c;
402         for ( c = t->depends; c; c = c->next )
403             if ( c->target->status > t->status && !( c->target->flags &
404                 T_FLAG_NOCARE ) )
405             {
406                 failed = c->target;
407                 t->status = c->target->status;
408             }
409     }
410 
411     /* If an internal header node failed to build, we want to output the target
412      * that it failed on.
413      */
414     if ( failed )
415         failed_name = failed->flags & T_FLAG_INTERNAL
416             ? failed->failed
417             : object_str( failed->name );
418     t->failed = failed_name;
419 
420     /* If actions for building any of the dependencies have failed, bail.
421      * Otherwise, execute all actions to make the current target.
422      */
423     if ( ( t->status == EXEC_CMD_FAIL ) && t->actions )
424     {
425         ++counts->skipped;
426         if ( ( t->flags & ( T_FLAG_RMOLD | T_FLAG_NOTFILE ) ) == T_FLAG_RMOLD )
427         {
428             if ( !unlink( object_str( t->boundname ) ) )
429                 out_printf( "...removing outdated %s\n", object_str( t->boundname )
430                     );
431         }
432         else
433             out_printf( "...skipped %s for lack of %s...\n", object_str( t->name ),
434                 failed_name );
435     }
436 
437     if ( t->status == EXEC_CMD_OK )
438         switch ( t->fate )
439         {
440         case T_FATE_STABLE:
441         case T_FATE_NEWER:
442             break;
443 
444         case T_FATE_CANTFIND:
445         case T_FATE_CANTMAKE:
446             t->status = EXEC_CMD_FAIL;
447             break;
448 
449         case T_FATE_ISTMP:
450             if ( DEBUG_MAKE )
451                 out_printf( "...using %s...\n", object_str( t->name ) );
452             break;
453 
454         case T_FATE_TOUCHED:
455         case T_FATE_MISSING:
456         case T_FATE_NEEDTMP:
457         case T_FATE_OUTDATED:
458         case T_FATE_UPDATE:
459         case T_FATE_REBUILD:
460             /* Prepare commands for executing actions scheduled for this target.
461              * Commands have their embedded variables automatically expanded,
462              * including making use of any "on target" variables.
463              */
464             if ( t->actions )
465             {
466                 ++counts->total;
467                 if ( DEBUG_MAKE && !( counts->total % 100 ) )
468                     out_printf( "...on %dth target...\n", counts->total );
469 
470                 t->cmds = (char *)make1cmds( t );
471                 /* Update the target's "progress" so MAKE1C processing counts it
472                  * among its successes/failures.
473                  */
474                 t->progress = T_MAKE_RUNNING;
475             }
476             break;
477 
478         /* All valid fates should have been accounted for by now. */
479         default:
480             err_printf( "ERROR: %s has bad fate %d", object_str( t->name ),
481                 t->fate );
482             abort();
483         }
484 
485     /* Proceed to MAKE1C to begin executing the chain of commands prepared for
486      * building the target. If we are not going to build the target (e.g. due to
487      * dependency failures or no commands needing to be run) the chain will be
488      * empty and MAKE1C processing will directly signal the target's completion.
489      */
490 
491     if ( t->cmds == NULL || --( ( CMD * )t->cmds )->asynccnt == 0 )
492         push_state( &state_stack, t, NULL, T_STATE_MAKE1C );
493     else if ( DEBUG_EXECCMD )
494     {
495         CMD * cmd = ( CMD * )t->cmds;
496         out_printf( "Delaying %s %s: %d targets not ready\n", object_str( cmd->rule->name ), object_str( t->boundname ), cmd->asynccnt );
497     }
498 }
499 
500 
501 /*
502  * make1c() - launch target's next command, or go to parents' MAKE1B if none
503  *
504  * If there are (more) commands to run to build this target (and we have not hit
505  * an error running earlier comands) we launch the command using exec_cmd().
506  * Command execution signals its completion in exec_wait() by calling our
507  * make1c_closure() callback.
508  *
509  * If there are no more commands to run, we collect the status from all the
510  * actions and report our completion to all the parents.
511  */
512 
make1c(state const * const pState)513 static void make1c( state const * const pState )
514 {
515     TARGET * const t = pState->t;
516     CMD * const cmd = (CMD *)t->cmds;
517     int exec_flags = 0;
518 
519     if ( cmd )
520     {
521         /* Pop state first in case something below (e.g. exec_cmd(), exec_wait()
522          * or make1c_closure()) pushes a new state. Note that we must not access
523          * the popped state data after this as the same stack node might have
524          * been reused internally for some newly pushed state.
525          */
526         pop_state( &state_stack );
527 
528         if ( cmd->status != EXEC_CMD_OK )
529         {
530             t->cmds = NULL;
531             push_cmds( cmd->next, cmd->status );
532             cmd_free( cmd );
533             return;
534         }
535 
536 #ifdef OPT_SEMAPHORE
537         if ( ! cmd_sem_lock( t ) )
538         {
539             return;
540         }
541 #endif
542 
543         /* Increment the jobs running counter. */
544         ++cmdsrunning;
545 
546         if ( ( globs.jobs == 1 ) && ( DEBUG_MAKEQ ||
547             ( DEBUG_MAKE && !( cmd->rule->actions->flags & RULE_QUIETLY ) ) ) )
548         {
549             OBJECT * action  = cmd->rule->name;
550             OBJECT * target = list_front( lol_get( (LOL *)&cmd->args, 0 ) );
551 
552             out_printf( "%s %s\n", object_str( action ), object_str( target ) );
553 
554             /* Print out the command executed if given -d+2. */
555             if ( DEBUG_EXEC )
556             {
557                 out_puts( cmd->buf->value );
558                 out_putc( '\n' );
559             }
560 
561             /* We only need to flush the streams if there's likely to
562              * be a wait before it finishes.
563              */
564             if ( ! globs.noexec && ! cmd->noop )
565             {
566                 out_flush();
567                 err_flush();
568             }
569         }
570         else
571         {
572             exec_flags |= EXEC_CMD_QUIET;
573         }
574 
575         /* Execute the actual build command or fake it if no-op. */
576         if ( globs.noexec || cmd->noop )
577         {
578             timing_info time_info = { 0 };
579             timestamp_current( &time_info.start );
580             timestamp_copy( &time_info.end, &time_info.start );
581             make1c_closure( t, EXEC_CMD_OK, &time_info, "", "", EXIT_OK );
582         }
583         else
584         {
585             exec_cmd( cmd->buf, exec_flags, make1c_closure, t, cmd->shell );
586 
587             /* Wait until under the concurrent command count limit. */
588             /* FIXME: This wait could be skipped here and moved to just before
589              * trying to execute a command that would cross the command count
590              * limit. Note though that this might affect the order in which
591              * unrelated targets get built and would thus require that all
592              * affected Boost Build tests be updated.
593              */
594             assert( 0 < globs.jobs );
595             while ( cmdsrunning >= globs.jobs )
596                 exec_wait();
597         }
598     }
599     else
600     {
601         ACTIONS * actions;
602 
603         /* Tally success/failure for those we tried to update. */
604         if ( t->progress == T_MAKE_RUNNING )
605         {
606             /* Invert OK/FAIL target status when FAIL_EXPECTED has been applied. */
607             if ( t->flags & T_FLAG_FAIL_EXPECTED && !globs.noexec )
608             {
609                 switch ( t->status )
610                 {
611                     case EXEC_CMD_FAIL: t->status = EXEC_CMD_OK; break;
612                     case EXEC_CMD_OK: t->status = EXEC_CMD_FAIL; break;
613                 }
614 
615                 /* Printing failure has to be delayed until the last
616                  * action is completed for FAIL_EXPECTED targets.
617                  * Do it here.
618                  */
619                 if ( t->status == EXEC_CMD_FAIL )
620                 {
621                     out_printf( "...failed %s ", object_str( t->actions->action->rule->name ) );
622                     out_printf( "%s", object_str( t->boundname ) );
623                     out_printf( "...\n" );
624                 }
625 
626                 /* Handle -q */
627                 if ( t->status == EXEC_CMD_FAIL && globs.quitquick )
628                     ++quit;
629 
630                 /* Delete the target on failure. */
631                 if ( !( t->flags & ( T_FLAG_PRECIOUS | T_FLAG_NOTFILE ) ) &&
632                     !unlink( object_str( t->boundname ) ) )
633                     out_printf( "...removing %s\n", object_str( t->boundname ) );
634             }
635             switch ( t->status )
636             {
637                 case EXEC_CMD_OK: ++counts->made; break;
638                 case EXEC_CMD_FAIL: ++counts->failed; break;
639             }
640         }
641 
642         /* Tell parents their dependency has been built. */
643         {
644             TARGETS * c;
645             stack temp_stack = { NULL };
646             TARGET * additional_includes = NULL;
647 
648             t->progress = globs.noexec ? T_MAKE_NOEXEC_DONE : T_MAKE_DONE;
649 
650             /* Target has been updated so rescan it for dependencies. */
651             if ( t->fate >= T_FATE_MISSING && t->status == EXEC_CMD_OK &&
652                 !( t->flags & T_FLAG_INTERNAL ) )
653             {
654                 TARGET * saved_includes;
655                 SETTINGS * s;
656 
657                 /* Clean current includes. */
658                 saved_includes = t->includes;
659                 t->includes = 0;
660 
661                 s = copysettings( t->settings );
662                 pushsettings( root_module(), s );
663                 headers( t );
664                 popsettings( root_module(), s );
665                 freesettings( s );
666 
667                 if ( t->includes )
668                 {
669                     /* Tricky. The parents have already been processed, but they
670                      * have not seen the internal node, because it was just
671                      * created. We need to:
672                      *  - push MAKE1A states that would have been pushed by the
673                      *    parents here
674                      *  - make sure all unprocessed parents will pick up the
675                      *    new includes
676                      *  - make sure processing the additional MAKE1A states is
677                      *    done before processing the MAKE1B state for our
678                      *    current target (which would mean this target has
679                      *    already been built), otherwise the parent would be
680                      *    considered built before the additional MAKE1A state
681                      *    processing even got a chance to start.
682                      */
683                     make0( t->includes, t->parents->target, 0, 0, 0, t->includes
684                         );
685                     /* Link the old includes on to make sure that it gets
686                      * cleaned up correctly.
687                      */
688                     t->includes->includes = saved_includes;
689                     for ( c = t->dependants; c; c = c->next )
690                         c->target->depends = targetentry( c->target->depends,
691                             t->includes );
692                     /* Will be processed below. */
693                     additional_includes = t->includes;
694                 }
695                 else
696                 {
697                     t->includes = saved_includes;
698                 }
699             }
700 
701             if ( additional_includes )
702                 for ( c = t->parents; c; c = c->next )
703                     push_state( &temp_stack, additional_includes, c->target,
704                         T_STATE_MAKE1A );
705 
706             if ( t->scc_root )
707             {
708                 TARGET * const scc_root = target_scc( t );
709                 assert( scc_root->progress < T_MAKE_DONE );
710                 for ( c = t->parents; c; c = c->next )
711                 {
712                     if ( target_scc( c->target ) == scc_root )
713                         push_state( &temp_stack, c->target, NULL, T_STATE_MAKE1B
714                             );
715                     else
716                         scc_root->parents = targetentry( scc_root->parents,
717                             c->target );
718                 }
719             }
720             else
721             {
722                 for ( c = t->parents; c; c = c->next )
723                     push_state( &temp_stack, c->target, NULL, T_STATE_MAKE1B );
724             }
725 
726             /* Must pop state before pushing any more. */
727             pop_state( &state_stack );
728 
729             /* Using stacks reverses the order of execution. Reverse it back. */
730             push_stack_on_stack( &state_stack, &temp_stack );
731         }
732     }
733 }
734 
735 
736 /*
737  * call_timing_rule() - Look up the __TIMING_RULE__ variable on the given
738  * target, and if non-empty, invoke the rule it names, passing the given
739  * timing_info.
740  */
741 
call_timing_rule(TARGET * target,timing_info const * const time)742 static void call_timing_rule( TARGET * target, timing_info const * const time )
743 {
744     LIST * timing_rule;
745 
746     pushsettings( root_module(), target->settings );
747     timing_rule = var_get( root_module(), constant_TIMING_RULE );
748     popsettings( root_module(), target->settings );
749 
750     if ( !list_empty( timing_rule ) )
751     {
752         /* rule timing-rule ( args * : target : start end user system clock ) */
753 
754         /* Prepare the argument list. */
755         FRAME frame[ 1 ];
756         OBJECT * rulename = list_front( timing_rule );
757         frame_init( frame );
758 
759         /* args * :: $(__TIMING_RULE__[2-]) */
760         lol_add( frame->args, list_copy_range( timing_rule, list_next(
761             list_begin( timing_rule ) ), list_end( timing_rule ) ) );
762 
763         /* target :: the name of the target */
764         lol_add( frame->args, list_new( object_copy( target->name ) ) );
765 
766         /* start end user system clock :: info about the action command */
767         lol_add( frame->args, list_push_back( list_push_back( list_push_back( list_push_back( list_new(
768             outf_time( &time->start ) ),
769             outf_time( &time->end ) ),
770             outf_double( time->user ) ),
771             outf_double( time->system ) ),
772             outf_double( timestamp_delta_seconds(&time->start, &time->end) ) )
773             );
774 
775         /* Call the rule. */
776         evaluate_rule( bindrule( rulename , root_module() ), rulename, frame );
777 
778         /* Clean up. */
779         frame_free( frame );
780     }
781 }
782 
783 
784 /*
785  * call_action_rule() - Look up the __ACTION_RULE__ variable on the given
786  * target, and if non-empty, invoke the rule it names, passing the given info,
787  * timing_info, executed command and command output.
788  */
789 
call_action_rule(TARGET * target,int status,timing_info const * time,char const * executed_command,char const * command_output)790 static void call_action_rule
791 (
792     TARGET * target,
793     int status,
794     timing_info const * time,
795     char const * executed_command,
796     char const * command_output
797 )
798 {
799     LIST * action_rule;
800 
801     pushsettings( root_module(), target->settings );
802     action_rule = var_get( root_module(), constant_ACTION_RULE );
803     popsettings( root_module(), target->settings );
804 
805     if ( !list_empty( action_rule ) )
806     {
807         /* rule action-rule (
808             args * :
809             target :
810             command status start end user system :
811             output ? ) */
812 
813         /* Prepare the argument list. */
814         FRAME frame[ 1 ];
815         OBJECT * rulename = list_front( action_rule );
816         frame_init( frame );
817 
818         /* args * :: $(__ACTION_RULE__[2-]) */
819         lol_add( frame->args, list_copy_range( action_rule, list_next(
820             list_begin( action_rule ) ), list_end( action_rule ) ) );
821 
822         /* target :: the name of the target */
823         lol_add( frame->args, list_new( object_copy( target->name ) ) );
824 
825         /* command status start end user system :: info about the action command
826          */
827         lol_add( frame->args,
828             list_push_back( list_push_back( list_push_back( list_push_back( list_push_back( list_new(
829                 object_new( executed_command ) ),
830                 outf_int( status ) ),
831                 outf_time( &time->start ) ),
832                 outf_time( &time->end ) ),
833                 outf_double( time->user ) ),
834                 outf_double( time->system ) ) );
835 
836         /* output ? :: the output of the action command */
837         if ( command_output )
838         {
839             OBJECT * command_output_obj = object_new( command_output );
840             char * output_i = (char*)object_str(command_output_obj);
841             /* Clean the output of control characters. */
842             for (; *output_i; ++output_i)
843             {
844                 if (iscntrl(*output_i) && !isspace(*output_i)) *output_i = '?';
845             }
846             lol_add( frame->args, list_new( command_output_obj ) );
847         }
848         else
849             lol_add( frame->args, L0 );
850 
851         /* Call the rule. */
852         evaluate_rule( bindrule( rulename, root_module() ), rulename, frame );
853 
854         /* Clean up. */
855         frame_free( frame );
856     }
857 }
858 
859 
860 /*
861  * make1c_closure() - handle command execution completion and go to MAKE1C.
862  *
863  * Internal function passed as a notification callback for when a command
864  * finishes getting executed by the OS or called directly when faking that a
865  * command had been executed by the OS.
866  *
867  * Now all we need to do is fiddle with the command exit status and push a new
868  * MAKE1C state to execute the next command scheduled for building this target
869  * or close up the target's build process in case there are no more commands
870  * scheduled for it. On interrupts, we bail heavily.
871  */
872 
make1c_closure(void * const closure,int status_orig,timing_info const * const time,char const * const cmd_stdout,char const * const cmd_stderr,int const cmd_exit_reason)873 static void make1c_closure
874 (
875     void * const closure,
876     int status_orig,
877     timing_info const * const time,
878     char const * const cmd_stdout,
879     char const * const cmd_stderr,
880     int const cmd_exit_reason
881 )
882 {
883     TARGET * const t = (TARGET *)closure;
884     CMD * const cmd = (CMD *)t->cmds;
885     char const * rule_name = 0;
886     char const * target_name = 0;
887     int print_buffer = 0;
888 
889     assert( cmd );
890 
891     --cmdsrunning;
892 
893     /* Calculate the target's status from the cmd execution result. */
894     {
895         /* Store the target's status. */
896         t->status = status_orig;
897 
898         /* Ignore failures for actions marked as 'ignore'. */
899         if ( t->status == EXEC_CMD_FAIL && cmd->rule->actions->flags &
900             RULE_IGNORE )
901             t->status = EXEC_CMD_OK;
902     }
903 
904     if ( DEBUG_MAKEQ ||
905         ( DEBUG_MAKE && !( cmd->rule->actions->flags & RULE_QUIETLY ) ) )
906     {
907         rule_name = object_str( cmd->rule->name );
908         target_name = object_str( list_front( lol_get( (LOL *)&cmd->args, 0 ) )
909             );
910     }
911 
912     if ( rule_name == NULL || globs.jobs > 1 )
913         out_action( rule_name, target_name, cmd->buf->value, cmd_stdout,
914             cmd_stderr, cmd_exit_reason );
915 
916     /* If the process expired, make user aware with an explicit message, but do
917      * this only for non-quiet actions.
918      */
919     if ( cmd_exit_reason == EXIT_TIMEOUT && target_name )
920         out_printf( "%ld second time limit exceeded\n", globs.timeout );
921 
922     out_flush();
923     err_flush();
924 
925     if ( !globs.noexec )
926     {
927         call_timing_rule( t, time );
928         if ( DEBUG_EXECCMD )
929             out_printf( "%f sec system; %f sec user; %f sec clock\n",
930                 time->system, time->user,
931                 timestamp_delta_seconds(&time->start, &time->end) );
932 
933         /* Assume -p0 is in effect, i.e. cmd_stdout contains merged output. */
934         call_action_rule( t, status_orig, time, cmd->buf->value, cmd_stdout );
935     }
936 
937     /* Print command text on failure. */
938     if ( t->status == EXEC_CMD_FAIL && DEBUG_MAKE &&
939         ! ( t->flags & T_FLAG_FAIL_EXPECTED ) )
940     {
941         if ( !DEBUG_EXEC )
942             out_printf( "%s\n", cmd->buf->value );
943 
944         out_printf( "...failed %s ", object_str( cmd->rule->name ) );
945         list_print( lol_get( (LOL *)&cmd->args, 0 ) );
946         out_printf( "...\n" );
947     }
948 
949     /* On interrupt, set quit so _everything_ fails. Do the same for failed
950      * commands if we were asked to stop the build in case of any errors.
951      */
952     if ( t->status == EXEC_CMD_INTR )
953     {
954         ++intr;
955         ++quit;
956     }
957     if ( t->status == EXEC_CMD_FAIL && globs.quitquick &&
958         ! ( t->flags & T_FLAG_FAIL_EXPECTED ) )
959         ++quit;
960 
961     /* If the command was not successful remove all of its targets not marked as
962      * "precious".
963      */
964     if ( t->status != EXEC_CMD_OK )
965     {
966         LIST * const targets = lol_get( (LOL *)&cmd->args, 0 );
967         LISTITER iter = list_begin( targets );
968         LISTITER const end = list_end( targets );
969         for ( ; iter != end; iter = list_next( iter ) )
970         {
971             char const * const filename = object_str( list_item( iter ) );
972             TARGET const * const t = bindtarget( list_item( iter ) );
973             if ( !( t->flags & T_FLAG_PRECIOUS ) && !unlink( filename ) )
974                 out_printf( "...removing %s\n", filename );
975         }
976     }
977 
978 #ifdef OPT_SEMAPHORE
979     /* Release any semaphores used by this action. */
980     cmd_sem_unlock( t );
981 #endif
982 
983     /* Free this command and push the MAKE1C state to execute the next one
984      * scheduled for building this same target.
985      */
986     t->cmds = NULL;
987     push_cmds( cmd->next, t->status );
988     cmd_free( cmd );
989 }
990 
991 /* push the next MAKE1C state after a command is run. */
push_cmds(CMDLIST * cmds,int status)992 static void push_cmds( CMDLIST * cmds, int status )
993 {
994     CMDLIST * cmd_iter;
995     for( cmd_iter = cmds; cmd_iter; cmd_iter = cmd_iter->next )
996     {
997         if ( cmd_iter->iscmd )
998         {
999             CMD * next_cmd = cmd_iter->impl.cmd;
1000             /* Propagate the command status. */
1001             if ( next_cmd->status < status )
1002                 next_cmd->status = status;
1003             if ( --next_cmd->asynccnt == 0 )
1004             {
1005                 /* Select the first target associated with the action.
1006                  * This is safe because sibling CMDs cannot have targets
1007                  * in common.
1008                  */
1009                 TARGET * first_target = bindtarget( list_front( lol_get( &next_cmd->args, 0 ) ) );
1010                 first_target->cmds = (char *)next_cmd;
1011                 push_state( &state_stack, first_target, NULL, T_STATE_MAKE1C );
1012             }
1013             else if ( DEBUG_EXECCMD )
1014             {
1015                 TARGET * first_target = bindtarget( list_front( lol_get( &next_cmd->args, 0 ) ) );
1016                 out_printf( "Delaying %s %s: %d targets not ready\n", object_str( next_cmd->rule->name ), object_str( first_target->boundname ), next_cmd->asynccnt );
1017             }
1018         }
1019         else
1020         {
1021             /* This is a target that we're finished updating */
1022             TARGET * updated_target = cmd_iter->impl.t;
1023             if ( updated_target->status < status )
1024                 updated_target->status = status;
1025             updated_target->cmds = NULL;
1026             push_state( &state_stack, updated_target, NULL, T_STATE_MAKE1C );
1027         }
1028     }
1029 }
1030 
1031 
1032 /*
1033  * swap_settings() - replace the settings from the current module and target
1034  * with those from the new module and target
1035  */
1036 
swap_settings(module_t ** current_module,TARGET ** current_target,module_t * new_module,TARGET * new_target)1037 static void swap_settings
1038 (
1039     module_t * * current_module,
1040     TARGET   * * current_target,
1041     module_t   * new_module,
1042     TARGET     * new_target
1043 )
1044 {
1045     if ( ( new_target == *current_target ) &&
1046         ( new_module == *current_module ) )
1047         return;
1048 
1049     if ( *current_target )
1050         popsettings( *current_module, (*current_target)->settings );
1051 
1052     if ( new_target )
1053         pushsettings( new_module, new_target->settings );
1054 
1055     *current_module = new_module;
1056     *current_target = new_target;
1057 }
1058 
1059 
1060 /*
1061  * make1cmds() - turn ACTIONS into CMDs, grouping, splitting, etc.
1062  *
1063  * Essentially copies a chain of ACTIONs to a chain of CMDs, grouping
1064  * RULE_TOGETHER actions, splitting RULE_PIECEMEAL actions, and handling
1065  * RULE_NEWSRCS actions. The result is a chain of CMDs which has already had all
1066  * of its embedded variable references expanded and can now be executed using
1067  * exec_cmd().
1068  */
1069 
make1cmds(TARGET * t)1070 static CMD * make1cmds( TARGET * t )
1071 {
1072     CMD * cmds = 0;
1073     CMD * last_cmd;
1074     LIST * shell = L0;
1075     module_t * settings_module = 0;
1076     TARGET * settings_target = 0;
1077     ACTIONS * a0;
1078     int const running_flag = globs.noexec ? A_RUNNING_NOEXEC : A_RUNNING;
1079 
1080     /* Step through actions.
1081      */
1082     for ( a0 = t->actions; a0; a0 = a0->next )
1083     {
1084         RULE         * rule = a0->action->rule;
1085         rule_actions * actions = rule->actions;
1086         SETTINGS     * boundvars;
1087         LIST         * nt;
1088         LIST         * ns;
1089         ACTIONS      * a1;
1090 
1091         /* Only do rules with commands to execute.
1092          */
1093         if ( !actions )
1094             continue;
1095 
1096         if ( a0->action->running >= running_flag )
1097         {
1098             CMD * first;
1099             /* If this action was skipped either because it was
1100              * combined with another action by RULE_TOGETHER, or
1101              * because all of its sources were filtered out,
1102              * then we don't have anything to do here.
1103              */
1104             if ( a0->action->first_cmd == NULL )
1105                 continue;
1106             /* This action has already been processed for another target.
1107              * Just set up the dependency graph correctly and move on.
1108              */
1109             first = (CMD *)a0->action->first_cmd;
1110             if( cmds )
1111             {
1112                 last_cmd->next = cmdlist_append_cmd( last_cmd->next, first );
1113             }
1114             else
1115             {
1116                 cmds = first;
1117             }
1118             last_cmd = (CMD *)a0->action->last_cmd;
1119             continue;
1120         }
1121 
1122         a0->action->running = running_flag;
1123 
1124         /* Make LISTS of targets and sources. If `execute together` has been
1125          * specified for this rule, tack on sources from each instance of this
1126          * rule for this target.
1127          */
1128         nt = make1list( L0, a0->action->targets, 0 );
1129         ns = make1list( L0, a0->action->sources, actions->flags );
1130         if ( actions->flags & RULE_TOGETHER )
1131             for ( a1 = a0->next; a1; a1 = a1->next )
1132                 if ( a1->action->rule == rule &&
1133                     a1->action->running < running_flag &&
1134                     targets_equal( a0->action->targets, a1->action->targets ) )
1135                 {
1136                     ns = make1list( ns, a1->action->sources, actions->flags );
1137                     a1->action->running = running_flag;
1138                 }
1139 
1140         /* If doing only updated (or existing) sources, but none have been
1141          * updated (or exist), skip this action.
1142          */
1143         if ( list_empty( ns ) &&
1144             ( actions->flags & ( RULE_NEWSRCS | RULE_EXISTING ) ) )
1145         {
1146             list_free( nt );
1147             continue;
1148         }
1149 
1150         swap_settings( &settings_module, &settings_target, rule->module, t );
1151         if ( list_empty( shell ) )
1152         {
1153             /* shell is per-target */
1154             shell = var_get( rule->module, constant_JAMSHELL );
1155         }
1156 
1157         /* If we had 'actions xxx bind vars' we bind the vars now. */
1158         boundvars = make1settings( rule->module, actions->bindlist );
1159         pushsettings( rule->module, boundvars );
1160 
1161         /*
1162          * Build command, starting with all source args.
1163          *
1164          * For actions that allow PIECEMEAL commands, if the constructed command
1165          * string is too long, we retry constructing it with a reduced number of
1166          * source arguments presented.
1167          *
1168          * While reducing slowly takes a bit of compute time to get things just
1169          * right, it is worth it to get as close to maximum allowed command
1170          * string length as possible, because launching the commands we are
1171          * executing is likely to be much more compute intensive.
1172          *
1173          * Note that we loop through at least once, for sourceless actions.
1174          */
1175         {
1176             int const length = list_length( ns );
1177             int start = 0;
1178             int chunk = length;
1179             int cmd_count = 0;
1180             TARGETS * semaphores = NULL;
1181             TARGETS * targets_iter;
1182             int unique_targets;
1183             do
1184             {
1185                 CMD * cmd;
1186                 int cmd_check_result;
1187                 int cmd_error_length;
1188                 int cmd_error_max_length;
1189                 int retry = 0;
1190                 int accept_command = 0;
1191 
1192                 /* Build cmd: cmd_new() takes ownership of its lists. */
1193                 cmd = cmd_new( rule, list_copy( nt ), list_sublist( ns, start,
1194                     chunk ), list_copy( shell ) );
1195 
1196                 cmd_check_result = exec_check( cmd->buf, &cmd->shell,
1197                     &cmd_error_length, &cmd_error_max_length );
1198 
1199                 if ( cmd_check_result == EXEC_CHECK_OK )
1200                 {
1201                     accept_command = 1;
1202                 }
1203                 else if ( cmd_check_result == EXEC_CHECK_NOOP )
1204                 {
1205                     accept_command = 1;
1206                     cmd->noop = 1;
1207                 }
1208                 else if ( ( actions->flags & RULE_PIECEMEAL ) && ( chunk > 1 ) )
1209                 {
1210                     /* Too long but splittable. Reduce chunk size slowly and
1211                      * retry.
1212                      */
1213                     assert( cmd_check_result == EXEC_CHECK_TOO_LONG ||
1214                         cmd_check_result == EXEC_CHECK_LINE_TOO_LONG );
1215                     chunk = chunk * 9 / 10;
1216                     retry = 1;
1217                 }
1218                 else
1219                 {
1220                     /* Too long and not splittable. */
1221                     char const * const error_message = cmd_check_result ==
1222                         EXEC_CHECK_TOO_LONG
1223                             ? "is too long"
1224                             : "contains a line that is too long";
1225                     assert( cmd_check_result == EXEC_CHECK_TOO_LONG ||
1226                         cmd_check_result == EXEC_CHECK_LINE_TOO_LONG );
1227                     out_printf( "%s action %s (%d, max %d):\n", object_str(
1228                         rule->name ), error_message, cmd_error_length,
1229                         cmd_error_max_length );
1230 
1231                     /* Tell the user what did not fit. */
1232                     out_puts( cmd->buf->value );
1233                     exit( EXITBAD );
1234                 }
1235 
1236                 assert( !retry || !accept_command );
1237 
1238                 if ( accept_command )
1239                 {
1240                     /* Chain it up. */
1241                     if ( cmds )
1242                     {
1243                         last_cmd->next = cmdlist_append_cmd( last_cmd->next, cmd );
1244                         last_cmd = cmd;
1245                     }
1246                     else
1247                     {
1248                         cmds = last_cmd = cmd;
1249                     }
1250 
1251                     if ( cmd_count++ == 0 )
1252                     {
1253                         a0->action->first_cmd = cmd;
1254                     }
1255                 }
1256                 else
1257                 {
1258                     cmd_free( cmd );
1259                 }
1260 
1261                 if ( !retry )
1262                     start += chunk;
1263             }
1264             while ( start < length );
1265 
1266             /* Record the end of the actions cmds */
1267             a0->action->last_cmd = last_cmd;
1268 
1269             unique_targets = 0;
1270             for ( targets_iter = a0->action->targets; targets_iter; targets_iter = targets_iter->next )
1271             {
1272                 if ( targets_contains( targets_iter->next, targets_iter->target ) )
1273                     continue;
1274                 /* Add all targets produced by the action to the update list. */
1275                 push_state( &state_stack, targets_iter->target, NULL, T_STATE_MAKE1A );
1276                 ++unique_targets;
1277             }
1278             /* We need to wait until all the targets agree that
1279              * it's okay to run this action.
1280              */
1281             ( ( CMD * )a0->action->first_cmd )->asynccnt = unique_targets;
1282 
1283 #if OPT_SEMAPHORE
1284             /* Collect semaphores */
1285             for ( targets_iter = a0->action->targets; targets_iter; targets_iter = targets_iter->next )
1286             {
1287                 TARGET * sem = targets_iter->target->semaphore;
1288                 if ( sem )
1289                 {
1290                     TARGETS * semiter;
1291                     if ( ! targets_contains( semaphores, sem ) )
1292                         semaphores = targetentry( semaphores, sem );
1293                 }
1294             }
1295             ( ( CMD * )a0->action->first_cmd )->lock = semaphores;
1296             ( ( CMD * )a0->action->last_cmd )->unlock = semaphores;
1297 #endif
1298         }
1299 
1300         /* These were always copied when used. */
1301         list_free( nt );
1302         list_free( ns );
1303 
1304         /* Free variables with values bound by 'actions xxx bind vars'. */
1305         popsettings( rule->module, boundvars );
1306         freesettings( boundvars );
1307     }
1308 
1309     if ( cmds )
1310     {
1311         last_cmd->next = cmdlist_append_target( last_cmd->next, t );
1312     }
1313 
1314     swap_settings( &settings_module, &settings_target, 0, 0 );
1315     return cmds;
1316 }
1317 
1318 
1319 /*
1320  * make1list() - turn a list of targets into a LIST, for $(<) and $(>)
1321  */
1322 
make1list(LIST * l,TARGETS * targets,int flags)1323 static LIST * make1list( LIST * l, TARGETS * targets, int flags )
1324 {
1325     for ( ; targets; targets = targets->next )
1326     {
1327         TARGET * t = targets->target;
1328 
1329         if ( t->binding == T_BIND_UNBOUND )
1330             make1bind( t );
1331 
1332         if ( ( flags & RULE_EXISTING ) && ( flags & RULE_NEWSRCS ) )
1333         {
1334             if ( ( t->binding != T_BIND_EXISTS ) &&
1335                 ( t->fate <= T_FATE_STABLE ) )
1336                 continue;
1337         }
1338         else if ( flags & RULE_EXISTING )
1339         {
1340             if ( t->binding != T_BIND_EXISTS )
1341                 continue;
1342         }
1343         else if ( flags & RULE_NEWSRCS )
1344         {
1345             if ( t->fate <= T_FATE_STABLE )
1346                 continue;
1347         }
1348 
1349         /* Prohibit duplicates for RULE_TOGETHER. */
1350         if ( flags & RULE_TOGETHER )
1351         {
1352             LISTITER iter = list_begin( l );
1353             LISTITER const end = list_end( l );
1354             for ( ; iter != end; iter = list_next( iter ) )
1355                 if ( object_equal( list_item( iter ), t->boundname ) )
1356                     break;
1357             if ( iter != end )
1358                 continue;
1359         }
1360 
1361         /* Build new list. */
1362         l = list_push_back( l, object_copy( t->boundname ) );
1363     }
1364 
1365     return l;
1366 }
1367 
1368 
1369 /*
1370  * make1settings() - for vars with bound values, build up replacement lists
1371  */
1372 
make1settings(struct module_t * module,LIST * vars)1373 static SETTINGS * make1settings( struct module_t * module, LIST * vars )
1374 {
1375     SETTINGS * settings = 0;
1376 
1377     LISTITER vars_iter = list_begin( vars );
1378     LISTITER const vars_end = list_end( vars );
1379     for ( ; vars_iter != vars_end; vars_iter = list_next( vars_iter ) )
1380     {
1381         LIST * const l = var_get( module, list_item( vars_iter ) );
1382         LIST * nl = L0;
1383         LISTITER iter = list_begin( l );
1384         LISTITER const end = list_end( l );
1385 
1386         for ( ; iter != end; iter = list_next( iter ) )
1387         {
1388             TARGET * const t = bindtarget( list_item( iter ) );
1389 
1390             /* Make sure the target is bound. */
1391             if ( t->binding == T_BIND_UNBOUND )
1392                 make1bind( t );
1393 
1394             /* Build a new list. */
1395             nl = list_push_back( nl, object_copy( t->boundname ) );
1396         }
1397 
1398         /* Add to settings chain. */
1399         settings = addsettings( settings, VAR_SET, list_item( vars_iter ), nl );
1400     }
1401 
1402     return settings;
1403 }
1404 
1405 
1406 /*
1407  * make1bind() - bind targets that were not bound during dependency analysis
1408  *
1409  * Spot the kludge! If a target is not in the dependency tree, it did not get
1410  * bound by make0(), so we have to do it here. Ugly.
1411  */
1412 
make1bind(TARGET * t)1413 static void make1bind( TARGET * t )
1414 {
1415     if ( t->flags & T_FLAG_NOTFILE )
1416         return;
1417 
1418     pushsettings( root_module(), t->settings );
1419     object_free( t->boundname );
1420     t->boundname = search( t->name, &t->time, 0, t->flags & T_FLAG_ISFILE );
1421     t->binding = timestamp_empty( &t->time ) ? T_BIND_MISSING : T_BIND_EXISTS;
1422     popsettings( root_module(), t->settings );
1423 }
1424 
1425 
targets_contains(TARGETS * l,TARGET * t)1426 static int targets_contains( TARGETS * l, TARGET * t )
1427 {
1428     for ( ; l; l = l->next )
1429     {
1430         if ( t == l->target )
1431         {
1432             return 1;
1433         }
1434     }
1435     return 0;
1436 }
1437 
targets_equal(TARGETS * l1,TARGETS * l2)1438 static int targets_equal( TARGETS * l1, TARGETS * l2 )
1439 {
1440     for ( ; l1 && l2; l1 = l1->next, l2 = l2->next )
1441     {
1442         if ( l1->target != l2->target )
1443             return 0;
1444     }
1445     return !l1 && !l2;
1446 }
1447 
1448 
1449 #ifdef OPT_SEMAPHORE
1450 
cmd_sem_lock(TARGET * t)1451 static int cmd_sem_lock( TARGET * t )
1452 {
1453     CMD * cmd = (CMD *)t->cmds;
1454     TARGETS * iter;
1455     /* Check whether all the semaphores required for updating
1456      * this target are free.
1457      */
1458     for ( iter = cmd->lock; iter; iter = iter->next )
1459     {
1460         if ( iter->target->asynccnt > 0 )
1461         {
1462             if ( DEBUG_EXECCMD )
1463                 out_printf( "SEM: %s is busy, delaying launch of %s\n",
1464                     object_str( iter->target->name ), object_str( t->name ) );
1465             iter->target->parents = targetentry( iter->target->parents, t );
1466             return 0;
1467         }
1468     }
1469     /* Lock the semaphores. */
1470     for ( iter = cmd->lock; iter; iter = iter->next )
1471     {
1472         ++iter->target->asynccnt;
1473         if ( DEBUG_EXECCMD )
1474             out_printf( "SEM: %s now used by %s\n", object_str( iter->target->name
1475                 ), object_str( t->name ) );
1476     }
1477     /* A cmd only needs to be locked around its execution.
1478      * clearing cmd->lock here makes it safe to call cmd_sem_lock
1479      * twice.
1480      */
1481     cmd->lock = NULL;
1482     return 1;
1483 }
1484 
cmd_sem_unlock(TARGET * t)1485 static void cmd_sem_unlock( TARGET * t )
1486 {
1487     CMD * cmd = ( CMD * )t->cmds;
1488     TARGETS * iter;
1489     /* Release the semaphores. */
1490     for ( iter = cmd->unlock; iter; iter = iter->next )
1491     {
1492         if ( DEBUG_EXECCMD )
1493             out_printf( "SEM: %s is now free\n", object_str(
1494                 iter->target->name ) );
1495         --iter->target->asynccnt;
1496         assert( iter->target->asynccnt <= 0 );
1497     }
1498     for ( iter = cmd->unlock; iter; iter = iter->next )
1499     {
1500         /* Find a waiting target that's ready */
1501         while ( iter->target->parents )
1502         {
1503             TARGETS * first = iter->target->parents;
1504             TARGET * t1 = first->target;
1505 
1506             /* Pop the first waiting CMD */
1507             if ( first->next )
1508                 first->next->tail = first->tail;
1509             iter->target->parents = first->next;
1510             BJAM_FREE( first );
1511 
1512             if ( cmd_sem_lock( t1 ) )
1513             {
1514                 push_state( &state_stack, t1, NULL, T_STATE_MAKE1C );
1515                 break;
1516             }
1517         }
1518     }
1519 }
1520 
1521 #endif
1522