[Scons-users] SCONS -j12, console output is disordered

Gary Granger granger at ucar.edu
Thu Jan 4 12:32:54 EST 2024


For whatever it's worth, I had an example to provide, but then after 
looking at it I decided it needed some work.  So now it's a little more 
self-contained, and I think it's a reasonable example of a SPAWN 
override.  We use it to save full test output into log files while 
filtering the console output to the more meaningful lines.  I expect it 
could be modified easily to cache the output from a single command and 
write the output to the console all at once.  Perhaps that would avoid 
your interleaved output problem.  Our implementation can be seen here:

https://github.com/NCAR/eol_scons/blob/master/eol_scons/spawner.py

Good luck,
Gary

On 12/25/23 13:36, Bill Deegan wrote:
> Please respond to the individual message, not the digest of messages.
>
> You can find information on SPAWN here:
> https://scons.org/doc/production/HTML/scons-man.html#cv-SPAWN
>
> I'm not aware of any easy to find examples, but you should be able to 
> figure it out based on the manpage 
> <https://scons.org/doc/production/HTML/scons-man.html#cv-SPAWN> 
> contents: (copied here)
>
>     A command interpreter function that will be called to execute
>     command line strings. The function must accept five arguments:
>
>     def spawn(shell, escape, cmd, args, env):
>
>     |shell|is a string naming the shell program to use,|escape|is a
>     function that can be called to escape shell special characters in
>     the command line,|cmd|is the path to the command to be
>     executed,|args|holds the arguments to the command and|env|is a
>     dictionary of environment variables defining the execution
>     environment in which the command should be executed.
>
> Here's some related stack overflow questions:
>     https://stackoverflow.com/questions/11139519/scons-save-redirect-gcc-textual-output-warnings
>
> Please let us know if you come up with a good solution.
>
> -Bill
>
> On Sun, Dec 24, 2023 at 11:51 PM Yu,Zhiwei (YFI,Shanghai,CN) via 
> Scons-users <scons-users at scons.org> wrote:
>
>     Hi Guys,
>
>             Thanks Mats, Duane and Bill, Thanks for your replay.
>
>             I find something new. My compiler is IAR, and default, IAR
>     will output warning and error messages to stderr, normal message
>     will be put into stdout.
>             So, if there are warnings in my code, normal msg and
>     warning will be intertwined in words.
>             Luckily, Param --only_stdout can make IAR output stream to
>     stdout.
>
>             But I have a new problem. The warnings msg is output by
>     multi lines. So they are intertwined in line. For example:
>                     file0 warnings line 0
>                     file0 warnings line 1
>                     file1 normal msg line 0
>                     file0 warnings line 2
>                     file0 warnings line 3
>             Actually, I want the lines is:
>                     file0 warnings line 0
>                     file0 warnings line 1
>                     file0 warnings line 2
>                     file0 warnings line 3
>                     file1 normal msg line 0
>
>             I try to add mutex for print(), but no effection.
>             Maybe, I should set env['SPAWN'], but I don't know how to
>     use it.
>
>             I have two questions:
>             Where can I find a sample about env['SPAWN']?
>             How can I print msg when scons building complete?
>
>
>     Best Regards!
>
>     Software Engineer
>     ------------------------------------
>     zhiwei_yu at yanfeng.com
>
>
>
>     -----邮件原件-----
>     发件人: Scons-users <scons-users-bounces at scons.org> 代表
>     scons-users-request at scons.org
>     发送时间: 2023年12月24日 3:29
>     收件人: scons-users at scons.org
>     主题: Scons-users Digest, Vol 147, Issue 2
>
>     CAUTION: This email originated from outside of the organization.
>     DO NOT click links or open attachments unless you recognize the
>     sender and know the content is safe.
>
>
>     Send Scons-users mailing list submissions to
>     scons-users at scons.org
>
>     To subscribe or unsubscribe via the World Wide Web, visit
>     https://pairlist4.pair.net/mailman/listinfo/scons-users
>     or, via email, send a message with subject or body 'help' to
>     scons-users-request at scons.org
>
>     You can reach the person managing the list at
>     scons-users-owner at scons.org
>
>     When replying, please edit your Subject line so it is more
>     specific than "Re: Contents of Scons-users digest..."
>
>
>     Today's Topics:
>
>        1. Re: SCONS -j12, console output is disordered (Duane Ellis)
>        2. Re: SCONS -j12, console output is disordered (Mats Wichmann)
>
>
>     ----------------------------------------------------------------------
>
>     Message: 1
>     Date: Sat, 23 Dec 2023 18:33:20 +0000
>     From: Duane Ellis <duane at duaneellis.com>
>     To: SCons users mailing list <scons-users at scons.org>
>     Subject: Re: [Scons-users] SCONS -j12, console output is disordered
>     Message-ID:
>            
>     <PH0PR05MB84789EC7A7CE775049F19AD3CA9BA at PH0PR05MB8478.namprd05.prod.outlook.com>
>
>     Content-Type: text/plain; charset="utf-8"
>
>     SCONS could ?
>                     Capture the output of each sub process in the
>     standard way.
>                     Ie: use ?POPEN()? and COMMUNICATE with the sub
>     process.
>                        Thus the subprocess output goes to SCONS and
>     SCONS collects it in a buffer.
>                         You might want to put a timeout on all sub
>     processes, ie: 5 minutes?
>                         In case they output an error and want sometype
>     of input from the human to continue
>
>                     Then once the subprocess has completed, (Exit
>     success or Exit Error)
>                    The responsible runner thread would:
>                           Lock the console (mutex) so other SCONS
>     threads cannot use it.
>                           output stdout and stderr of the sub process
>                           Unlock the console so other SCONS threads
>     can use it.
>
>     From: Scons-users <scons-users-bounces at scons.org> on behalf of
>     Mats Wichmann <mats at wichmann.us>
>     Date: Saturday, December 23, 2023 at 8:51 AM
>     To: scons-users at scons.org <scons-users at scons.org>
>     Subject: Re: [Scons-users] SCONS -j12, console output is
>     disordered On 12/23/23 08:39, Yu,Zhiwei (YFI,Shanghai,CN) via
>     Scons-users wrote:
>     > Hi Guys?
>     >
>     > ??????I add -j12 param, then the console output is disordered.
>     > ??????I wonder that the reason is python's print function is not
>     > thread-safe or atomic operation, right?
>     > ??????How could I fix the problem when I use SCONS.
>
>     There are two sources of output:
>
>     (1) scons-generated (by default, the command line, modifiable by
>     setting the various COMSTR variables, or setting up a
>     PRINT_CMD_LINE_FUNC).
>     This text should not have any particular interleave problems.
>     (2) command-issued output.  This you can't do much about, because
>     SCons isn't really designed for that.  As jobs are classified as
>     ready to run, they're put on the queue; meanwhile when a job
>     runner slot opens up, it's assigned a job from the queue. Those
>     are run as subprocesses, and run independently; SCons doesn't
>     collect their output or any other information besides the exit
>     status.  So you're just seeing the effect of having 12 job runner
>     slots all firing off jobs as they become available - if those
>     generate their own output that can well interleave.
>
>     To not have interleaved command output, you'd need to convince
>     SCons to collect the output of the subprocesses rather than going
>     to the default stdout/stderr.  That is possible, but beyond the
>     scope of a first answer.
>
>     _______________________________________________
>     Scons-users mailing list
>     Scons-users at scons.org
>     https://pairlist4.pair.net/mailman/listinfo/scons-users
>     -------------- next part --------------
>     An HTML attachment was scrubbed...
>     URL:
>     <https://pairlist4.pair.net/pipermail/scons-users/attachments/20231223/4c7188b9/attachment-0001.htm>
>
>     ------------------------------
>
>     Message: 2
>     Date: Sat, 23 Dec 2023 12:29:06 -0700
>     From: Mats Wichmann <mats at wichmann.us>
>     To: scons-users at scons.org
>     Subject: Re: [Scons-users] SCONS -j12, console output is disordered
>     Message-ID: <2ec58418-041d-43b1-9e0a-90a9506c174c at wichmann.us>
>     Content-Type: text/plain; charset=UTF-8; format=flowed
>
>     On 12/23/23 11:33, Duane Ellis wrote:
>     > SCONS could ?
>     >
>     >  ??????????????? Capture the output of each sub process in the
>     standard way.
>     >
>     >  ??????????????? Ie: use ?POPEN()? and COMMUNICATE with the sub
>     process.
>     >
>     >  ???????????????????Thus the subprocess output goes to SCONS and
>     SCONS
>     > collects it in a buffer.
>
>     Yes, it could.  It even does so now in one very specific situation
>     - while evaluating a Configure context. However, even playing the
>     game with pushing in the value of the PSPAWN construction variable
>     in place of the SPAWN variable which is what the configure code
>     does is not a full solution, as scons would actually have to be
>     prepared to gather and do something with the output, which it
>     currently isn't.
>
>     >
>     >  ??????????????????? You might want to put a timeout on all sub
>     > processes, ie: 5 minutes?
>     >
>     >  ??????????????????? In case they output an error and want
>     sometype of
>     > input from the human to continue
>     >
>     >  ??????????????? Then once the subprocess has completed, (Exit
>     success
>     > or Exit Error)
>     >
>     >  ?????????????? The responsible runner thread would:
>     >
>     >  ????????????????????? Lock the console (mutex) so other SCONS
>     threads
>     > cannot use it.
>     >
>     >  ????????????????????? output stdout and stderr of the sub process
>     >
>     >  ????????????????????? Unlock the console so other SCONS threads
>     can use it.
>
>     This is the method the test runner uses - queues tests, has a pool
>     of runners to run them, and when one finished it takes a lock
>     before writing the collected output. But that's a different
>     usecase... the test runner *knows* it needs to collect output,
>     while SCons itself really isn't structured that way. Using logging
>     could also do this, as it handles locking between threads
>     internally (there's an experimental version of the test runner
>     that does that).
>
>     It *can* be done, but would require some effort.
>
>
>     ------------------------------
>
>     Subject: Digest Footer
>
>     _______________________________________________
>     Scons-users mailing list
>     Scons-users at scons.org
>     https://pairlist4.pair.net/mailman/listinfo/scons-users
>
>
>     ------------------------------
>
>     End of Scons-users Digest, Vol 147, Issue 2
>     *******************************************
>     _______________________________________________
>     Scons-users mailing list
>     Scons-users at scons.org
>     https://pairlist4.pair.net/mailman/listinfo/scons-users
>
>
> _______________________________________________
> Scons-users mailing list
> Scons-users at scons.org
> https://pairlist4.pair.net/mailman/listinfo/scons-users
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://pairlist4.pair.net/pipermail/scons-users/attachments/20240104/3c58e881/attachment-0001.htm>


More information about the Scons-users mailing list