[Scons-users] Print out messages only if target is building
Bill Deegan
bill at baddogconsulting.com
Wed Aug 1 22:43:12 EDT 2018
On Wed, Aug 1, 2018 at 1:11 PM, Matthew Marinets <
Matthew.Marinets at kardium.com> wrote:
> This sounds like a build-time change.
>
> I generally think of a SCons build in terms of two time-periods:
> SConscript time and build time.
>
> In SConscript time, the scripts behave like normal Python and will not
> build targets. Builders at this stage only format how to build files, but
> don't actually build them.
> In build time, SCons figures out which files it has to build, which among
> those are out-of-date, and builds them. The build actions and order is
> controlled by how you ran the builders in SConscript time.
>
> If you're putting a print statement in around a builder, that's SConscript
> time. It will always run if Python will run that code.
> If you only want the message to display in build time, you need to get it
> into a build action somehow.
>
> How to get a Python print statement into an action? You need to affect the
> Action objects or the strings they're building their actions from. The
> simplest example is probably:
> print("This will print during SConscript time.")
> outputs = env.SomeBuilder(target = target, source = source)
> env.AddPreAction(outputs, action = lambda target, source, env:
> print("This will print during build time."))
>
> The strategy I use for organizing my outputs is to just print a big line
> of dashes at the bottom of my SConstruct files. It's the last line of
> Python code, so anything that gets printed after that line has to be
> printed during build time.
>
> What you probably want to do is modify your builder's action. If it's a
> SCons built-in or is formatted like a SCons built-in, you should be able to
> find the (XX)COM variable in the environment (env.Dump() if you don't know
> what's in your environment). You can then modify this string based on if
> the SDK exists:
>
> Example: changing ALL Program() builders to print an error if SOME_SDK is
> not in the external environment.
> SConscript:
> env = Environment()
> # format env
> # call SConscript()
>
> if not os.environ.get("SOME_SDK"):
> env['LINKCOM'] = "echo Not building $TARGET because
> SOME_SDK is not formatted"
>
> # everything printed after this line in the SCons output is
> printed at build-time
> print("---------------")
>
> If you want to affect only specific calls to a builder (stop Program() in
> one SConscript but not another), you're going to have to run those builders
> with separate environments. At the top of the SConscript, you'd call:
> Import("env")
> env = env.Clone()
> Note that this means that changes to the environment in that SConscript
> will only affect builders / actions in that SConscript.
>
Not entirely true:
env.Program(target,source,....,LINKCOMSTR='my message here')
Should also work.
Another way to go would be to put a Psuedobuilder (see users guide) which
modifies LINKCOMSTR or whatever Action output variable is relevant.
-Bill
>
> -Matthew
>
> -----Original Message-----
> From: Scons-users <scons-users-bounces at scons.org> On Behalf Of Mats
> Wichmann
> Sent: August 1, 2018 11:30
> To: scons-users at scons.org
> Subject: Re: [Scons-users] Print out messages only if target is building
>
> On 08/01/2018 11:03 AM, Bill Deegan wrote:
> > SConscripts are not targets.
> >
> > Can you provide more detail?
> > Do you want some text output when a give program is built? Or a
> > library? or something else?
>
> I understood the question this way, maybe got it wrong:
>
> a bunch of targets defined, each a sample app, including x and y
>
> if I ask for x, y on scons command line, and x cannot build due to
> external reason (missing tools), print a message and skip x
>
> if I ask for y then don't print the message about skipping x since it's
> irrelevant anyway
>
>
> >
> > On Wed, Aug 1, 2018 at 9:28 AM, Mats Wichmann <mats at wichmann.us> wrote:
> >
> >> On 08/01/2018 06:19 AM, Anna Cheremnykh wrote:
> >>> Hi,
> >>>
> >>> I stuck with a problem: I want to print message only when given
> >>> target(Scinscript) is building.
> >>> What we have: several samples, each sample in separate directory
> >>> with separate Sconscript. Some of samples require 3rdparty SDKs and
> >>> environment variables set to these SDKs. But if developer doesn't
> >>> have such env var - sample build should be just skipped without errors.
> >>> So in sconsripts we added something like this:
> >>>
> >>> if not os.getenv('SOME_SDK_ROOT'):
> >>> print('SOME_SDK_ROOT not found, ' + sample_name + ' build
> skipped')
> >>> Return()
> >>>
> >>> I understand that scons read all sconsript files first. And I see
> >>> this message every time even if I build another samples or another
> >>> components. So my question how NOT to print messages if I call
> >>> another target from another Sconscript? Thanks!
> >>>
> >>
> >> I think you can look at COMMAND_LINE_TARGETS and BUILD_TARGETS to
> >> maybe figure something out?
> >>
> >> https://scons.org/doc/3.0.1/HTML/scons-user.html#sect-command-line-ta
> >> rgets
> >>
> >> _______________________________________________
> >> 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
> >
>
> _______________________________________________
> 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/20180801/95f9f008/attachment.html>
More information about the Scons-users
mailing list