]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/tools/build/src/engine/make1.c
Add patch for failing prerm scripts
[ceph.git] / ceph / src / boost / tools / build / src / engine / make1.c
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
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
132 static void free_state( state * const pState )
133 {
134 pState->prev = state_freelist;
135 state_freelist = pState;
136 }
137
138
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
150 static state * current_state( stack * const pStack )
151 {
152 return pStack->stack;
153 }
154
155
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
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
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
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
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 triggerred
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
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
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
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
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
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. */
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
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
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 = 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 = 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 LIST * cmd_targets = L0;
1181 LIST * cmd_shell = L0;
1182 TARGETS * semaphores = NULL;
1183 TARGETS * targets_iter;
1184 int unique_targets;
1185 do
1186 {
1187 CMD * cmd;
1188 int cmd_check_result;
1189 int cmd_error_length;
1190 int cmd_error_max_length;
1191 int retry = 0;
1192 int accept_command = 0;
1193
1194 /* Build cmd: cmd_new() takes ownership of its lists. */
1195 if ( list_empty( cmd_targets ) ) cmd_targets = list_copy( nt );
1196 if ( list_empty( cmd_shell ) ) cmd_shell = list_copy( shell );
1197 cmd = cmd_new( rule, cmd_targets, list_sublist( ns, start,
1198 chunk ), cmd_shell );
1199
1200 cmd_check_result = exec_check( cmd->buf, &cmd->shell,
1201 &cmd_error_length, &cmd_error_max_length );
1202
1203 if ( cmd_check_result == EXEC_CHECK_OK )
1204 {
1205 accept_command = 1;
1206 }
1207 else if ( cmd_check_result == EXEC_CHECK_NOOP )
1208 {
1209 accept_command = 1;
1210 cmd->noop = 1;
1211 }
1212 else if ( ( actions->flags & RULE_PIECEMEAL ) && ( chunk > 1 ) )
1213 {
1214 /* Too long but splittable. Reduce chunk size slowly and
1215 * retry.
1216 */
1217 assert( cmd_check_result == EXEC_CHECK_TOO_LONG ||
1218 cmd_check_result == EXEC_CHECK_LINE_TOO_LONG );
1219 chunk = chunk * 9 / 10;
1220 retry = 1;
1221 }
1222 else
1223 {
1224 /* Too long and not splittable. */
1225 char const * const error_message = cmd_check_result ==
1226 EXEC_CHECK_TOO_LONG
1227 ? "is too long"
1228 : "contains a line that is too long";
1229 assert( cmd_check_result == EXEC_CHECK_TOO_LONG ||
1230 cmd_check_result == EXEC_CHECK_LINE_TOO_LONG );
1231 out_printf( "%s action %s (%d, max %d):\n", object_str(
1232 rule->name ), error_message, cmd_error_length,
1233 cmd_error_max_length );
1234
1235 /* Tell the user what did not fit. */
1236 out_puts( cmd->buf->value );
1237 exit( EXITBAD );
1238 }
1239
1240 assert( !retry || !accept_command );
1241
1242 if ( accept_command )
1243 {
1244 /* Chain it up. */
1245 if ( cmds )
1246 {
1247 last_cmd->next = cmdlist_append_cmd( last_cmd->next, cmd );
1248 last_cmd = cmd;
1249 }
1250 else
1251 {
1252 cmds = last_cmd = cmd;
1253 }
1254
1255 if ( cmd_count++ == 0 )
1256 {
1257 a0->action->first_cmd = cmd;
1258 }
1259
1260 /* Mark lists we need recreated for the next command since
1261 * they got consumed by the cmd object.
1262 */
1263 cmd_targets = L0;
1264 cmd_shell = L0;
1265 }
1266 else
1267 {
1268 /* We can reuse targets & shell lists for the next command
1269 * if we do not let them die with this cmd object.
1270 */
1271 cmd_release_targets_and_shell( cmd );
1272 cmd_free( cmd );
1273 }
1274
1275 if ( !retry )
1276 start += chunk;
1277 }
1278 while ( start < length );
1279
1280 /* Record the end of the actions cmds */
1281 a0->action->last_cmd = last_cmd;
1282
1283 unique_targets = 0;
1284 for ( targets_iter = a0->action->targets; targets_iter; targets_iter = targets_iter->next )
1285 {
1286 if ( targets_contains( targets_iter->next, targets_iter->target ) )
1287 continue;
1288 /* Add all targets produced by the action to the update list. */
1289 push_state( &state_stack, targets_iter->target, NULL, T_STATE_MAKE1A );
1290 ++unique_targets;
1291 }
1292 /* We need to wait until all the targets agree that
1293 * it's okay to run this action.
1294 */
1295 ( ( CMD * )a0->action->first_cmd )->asynccnt = unique_targets;
1296
1297 #if OPT_SEMAPHORE
1298 /* Collect semaphores */
1299 for ( targets_iter = a0->action->targets; targets_iter; targets_iter = targets_iter->next )
1300 {
1301 TARGET * sem = targets_iter->target->semaphore;
1302 if ( sem )
1303 {
1304 TARGETS * semiter;
1305 if ( ! targets_contains( semaphores, sem ) )
1306 semaphores = targetentry( semaphores, sem );
1307 }
1308 }
1309 ( ( CMD * )a0->action->first_cmd )->lock = semaphores;
1310 ( ( CMD * )a0->action->last_cmd )->unlock = semaphores;
1311 #endif
1312 }
1313
1314 /* These were always copied when used. */
1315 list_free( nt );
1316 list_free( ns );
1317
1318 /* Free variables with values bound by 'actions xxx bind vars'. */
1319 popsettings( rule->module, boundvars );
1320 freesettings( boundvars );
1321 }
1322
1323 if ( cmds )
1324 {
1325 last_cmd->next = cmdlist_append_target( last_cmd->next, t );
1326 }
1327
1328 swap_settings( &settings_module, &settings_target, 0, 0 );
1329 return cmds;
1330 }
1331
1332
1333 /*
1334 * make1list() - turn a list of targets into a LIST, for $(<) and $(>)
1335 */
1336
1337 static LIST * make1list( LIST * l, TARGETS * targets, int flags )
1338 {
1339 for ( ; targets; targets = targets->next )
1340 {
1341 TARGET * t = targets->target;
1342
1343 if ( t->binding == T_BIND_UNBOUND )
1344 make1bind( t );
1345
1346 if ( ( flags & RULE_EXISTING ) && ( flags & RULE_NEWSRCS ) )
1347 {
1348 if ( ( t->binding != T_BIND_EXISTS ) &&
1349 ( t->fate <= T_FATE_STABLE ) )
1350 continue;
1351 }
1352 else if ( flags & RULE_EXISTING )
1353 {
1354 if ( t->binding != T_BIND_EXISTS )
1355 continue;
1356 }
1357 else if ( flags & RULE_NEWSRCS )
1358 {
1359 if ( t->fate <= T_FATE_STABLE )
1360 continue;
1361 }
1362
1363 /* Prohibit duplicates for RULE_TOGETHER. */
1364 if ( flags & RULE_TOGETHER )
1365 {
1366 LISTITER iter = list_begin( l );
1367 LISTITER const end = list_end( l );
1368 for ( ; iter != end; iter = list_next( iter ) )
1369 if ( object_equal( list_item( iter ), t->boundname ) )
1370 break;
1371 if ( iter != end )
1372 continue;
1373 }
1374
1375 /* Build new list. */
1376 l = list_push_back( l, object_copy( t->boundname ) );
1377 }
1378
1379 return l;
1380 }
1381
1382
1383 /*
1384 * make1settings() - for vars with bound values, build up replacement lists
1385 */
1386
1387 static SETTINGS * make1settings( struct module_t * module, LIST * vars )
1388 {
1389 SETTINGS * settings = 0;
1390
1391 LISTITER vars_iter = list_begin( vars );
1392 LISTITER const vars_end = list_end( vars );
1393 for ( ; vars_iter != vars_end; vars_iter = list_next( vars_iter ) )
1394 {
1395 LIST * const l = var_get( module, list_item( vars_iter ) );
1396 LIST * nl = L0;
1397 LISTITER iter = list_begin( l );
1398 LISTITER const end = list_end( l );
1399
1400 for ( ; iter != end; iter = list_next( iter ) )
1401 {
1402 TARGET * const t = bindtarget( list_item( iter ) );
1403
1404 /* Make sure the target is bound. */
1405 if ( t->binding == T_BIND_UNBOUND )
1406 make1bind( t );
1407
1408 /* Build a new list. */
1409 nl = list_push_back( nl, object_copy( t->boundname ) );
1410 }
1411
1412 /* Add to settings chain. */
1413 settings = addsettings( settings, VAR_SET, list_item( vars_iter ), nl );
1414 }
1415
1416 return settings;
1417 }
1418
1419
1420 /*
1421 * make1bind() - bind targets that were not bound during dependency analysis
1422 *
1423 * Spot the kludge! If a target is not in the dependency tree, it did not get
1424 * bound by make0(), so we have to do it here. Ugly.
1425 */
1426
1427 static void make1bind( TARGET * t )
1428 {
1429 if ( t->flags & T_FLAG_NOTFILE )
1430 return;
1431
1432 pushsettings( root_module(), t->settings );
1433 object_free( t->boundname );
1434 t->boundname = search( t->name, &t->time, 0, t->flags & T_FLAG_ISFILE );
1435 t->binding = timestamp_empty( &t->time ) ? T_BIND_MISSING : T_BIND_EXISTS;
1436 popsettings( root_module(), t->settings );
1437 }
1438
1439
1440 static int targets_contains( TARGETS * l, TARGET * t )
1441 {
1442 for ( ; l; l = l->next )
1443 {
1444 if ( t == l->target )
1445 {
1446 return 1;
1447 }
1448 }
1449 return 0;
1450 }
1451
1452 static int targets_equal( TARGETS * l1, TARGETS * l2 )
1453 {
1454 for ( ; l1 && l2; l1 = l1->next, l2 = l2->next )
1455 {
1456 if ( l1->target != l2->target )
1457 return 0;
1458 }
1459 return !l1 && !l2;
1460 }
1461
1462
1463 #ifdef OPT_SEMAPHORE
1464
1465 static int cmd_sem_lock( TARGET * t )
1466 {
1467 CMD * cmd = (CMD *)t->cmds;
1468 TARGETS * iter;
1469 /* Check whether all the semaphores required for updating
1470 * this target are free.
1471 */
1472 for ( iter = cmd->lock; iter; iter = iter->next )
1473 {
1474 if ( iter->target->asynccnt > 0 )
1475 {
1476 if ( DEBUG_EXECCMD )
1477 out_printf( "SEM: %s is busy, delaying launch of %s\n",
1478 object_str( iter->target->name ), object_str( t->name ) );
1479 iter->target->parents = targetentry( iter->target->parents, t );
1480 return 0;
1481 }
1482 }
1483 /* Lock the semaphores. */
1484 for ( iter = cmd->lock; iter; iter = iter->next )
1485 {
1486 ++iter->target->asynccnt;
1487 if ( DEBUG_EXECCMD )
1488 out_printf( "SEM: %s now used by %s\n", object_str( iter->target->name
1489 ), object_str( t->name ) );
1490 }
1491 /* A cmd only needs to be locked around its execution.
1492 * clearing cmd->lock here makes it safe to call cmd_sem_lock
1493 * twice.
1494 */
1495 cmd->lock = NULL;
1496 return 1;
1497 }
1498
1499 static void cmd_sem_unlock( TARGET * t )
1500 {
1501 CMD * cmd = ( CMD * )t->cmds;
1502 TARGETS * iter;
1503 /* Release the semaphores. */
1504 for ( iter = cmd->unlock; iter; iter = iter->next )
1505 {
1506 if ( DEBUG_EXECCMD )
1507 out_printf( "SEM: %s is now free\n", object_str(
1508 iter->target->name ) );
1509 --iter->target->asynccnt;
1510 assert( iter->target->asynccnt <= 0 );
1511 }
1512 for ( iter = cmd->unlock; iter; iter = iter->next )
1513 {
1514 /* Find a waiting target that's ready */
1515 while ( iter->target->parents )
1516 {
1517 TARGETS * first = iter->target->parents;
1518 TARGET * t1 = first->target;
1519
1520 /* Pop the first waiting CMD */
1521 if ( first->next )
1522 first->next->tail = first->tail;
1523 iter->target->parents = first->next;
1524 BJAM_FREE( first );
1525
1526 if ( cmd_sem_lock( t1 ) )
1527 {
1528 push_state( &state_stack, t1, NULL, T_STATE_MAKE1C );
1529 break;
1530 }
1531 }
1532 }
1533 }
1534
1535 #endif