[jamming] command line targets build linear
Craig Allsop
cjamallsop at gmail.com
Fri Aug 10 01:09:19 PDT 2007
Hi Matt,
There is no problem with this, jam will not install anything before it
is built - see the Install rule. But, currently it may build A B & C
before installing A B & C, what I'm saying is that it should install A
whilst it is building B - there are no dependencies between the two
and concurrent execution is fine. In fact you can test this yourself.
Just add this to your root jamfile:
Depends mytest : all install ;
Now run jam -j2 mytest
Uninstalling and cleaning are not dependent so will have no problem
running at the same time.
Craig.
On 8/10/07, matthew conte <matt at baisoku.org> wrote:
> I find the current functionality useful. I regularly issue:
>
> $ jam all install
>
> and
>
> $ jam uninstall clean
>
> Building these targets concurrently would be undesirable.
>
> --Matt.
>
> Craig Allsop wrote:
> > Hi Christopher/Jammers,
> >
> > I'm using jam -j25 with Incredibuild and have discovered a small
> > problem when running such a large number of jobs concurrently.
> >
> > When you build a list of targets specified on the command line, jam
> > will build them one after another in linear fashion. That is, it will
> > wait until each target is completely done before progressing to the
> > next one. This stalls job issues when using a large -j.
> >
> > My solution to this would be to modify make() and create a hidden node
> > with the list of command line targets as dependents and then launch
> > one make0() on the hidden node. See diff below:
> >
> > Craig.
> >
> >
> > ==== //uc/main/src/tools/jam/make.c#4 - d:\dev\uc\main\src\tools\jam\make.c ====
> > ***************
> > *** 125,141 ****
> > int i;
> > COUNTS counts[1];
> > int status = 0; /* 1 if anything fails */
> >
> > time( &clock1 );
> >
> > memset( (char *)counts, 0, sizeof( *counts ) );
> >
> > for( i = 0; i < n_targets; i++ )
> > {
> > ! TARGET *t = bindtarget( targets[i] );
> >
> > ! make0( t, 0, 0, counts, anyhow );
> > ! }
> >
> > if( DEBUG_MAKE )
> > {
> > --- 125,143 ----
> > int i;
> > COUNTS counts[1];
> > int status = 0; /* 1 if anything fails */
> > + TARGET *t;
> >
> > time( &clock1 );
> >
> > memset( (char *)counts, 0, sizeof( *counts ) );
> >
> > + t = bindtarget( "<jam>command-line" );
> > for( i = 0; i < n_targets; i++ )
> > {
> > ! t->depends = targetentry( t->depends, bindtarget( targets[i] ) );
> > ! }
> >
> > ! make0( t, 0, 0, counts, anyhow );
> >
> > if( DEBUG_MAKE )
> > {
> > ***************
> > *** 153,160 ****
> >
> > status = counts->cantfind || counts->cantmake;
> >
> > ! for( i = 0; i < n_targets; i++ )
> > ! status |= make1( bindtarget( targets[i] ) );
> >
> > return status;
> > }
> > --- 155,161 ----
> >
> > status = counts->cantfind || counts->cantmake;
> >
> > ! status |= make1( t );
> >
> > return status;
> > }
> >
> >
> > p.s. sorry about the dupe mail.
> > _______________________________________________
> > jamming mailing list - jamming at perforce.com
> > http://maillist.perforce.com/mailman/listinfo/jamming
> >
> _______________________________________________
> jamming mailing list - jamming at perforce.com
> http://maillist.perforce.com/mailman/listinfo/jamming
>
More information about the jamming
mailing list