[Scons-users] Controlling display of a builder

Carnë Draug carandraug+dev at gmail.com
Thu Nov 5 17:03:22 EST 2015


On 2 November 2015 at 21:45, Plunket, Tom
<tom.plunket at aristocrat-inc.com> wrote:
> My reading of the OP suggests an answer something like what I am doing for a
> couple of my site_tools pipelines in their generate() functions:
>
> def generate(env, **kw):
>     action = Action(audioBuild, 'Creating OGG audio ${TARGETS.file}')
>     builder = Builder(action = action)
>     env.Append(BUILDERS = { 'Audio': builder })
>
> This writes the text that I specify out for the user rather than the
> generated text.
>
> ‘audioBuild’ is a Python function that’s getting called; presumably the OP
> could just put his lambda object in place of that.

Thank you.  This is exactly what I was looking for.  I just could not
find the documentation for Action() because it is not in the user guide.
It keeps saying 'See the section "Action Objects"' which does not actually
exist in the document.  Now I found it deep in the man page).

For future reference, here's the code that I am using now:

    import subprocess
    env = Environment()

    def no_shell_command(target, source, env):
      ## To be used as action to Command().  This has the advantage that
      ## there's no shell involved, saving us from having to escape quotes,
      ## spaces, wildcards, and whatsnot.
      return subprocess.call(env['action'])
    def no_shell_command_strfunc(target, source, env):
      ## Even if possibly wrong, it's nice to display something
      args = env['action']
      return "$ " + args[0] + " ".join(["'%s'" % (arg) for arg in args[1:]])

    action = Action(no_shell_command, strfunction=no_shell_command_strfunc)
    env.Append(BUILDERS={'NoShellCommand' : Builder(action=action)})

    env.NoShellCommand(
      source = "...",
      target = "...",
      action = [list, of, args],
    )


And also for future reference, changing SPAWN does not work for this.
The reasons are:

  1) SPAWN gets called once for each element in action but the whole point
    was to use a list to create a single command. Therefore one can't use
    action (one still needs to set it though, so it becomes a dummy unused
    variable).
  2) since it's not possible to pass the options via action, one needs to
    pass via a random named attribute but they do not appear in the env
    passed to SPAWN as they do when action is a function.

See this example how ARGS is not accessible from spawn_func():

    env = Environment()

    def spawn_func(sh, escape, cmd, args, env):
      print sh
      print escape
      print cmd
      print args
      print env

    raw_data = env.Command(
      target = "pop",
      source = "foo.pl",
      action = "foobar", # we really need something, and it can't be empty
      ARGS = ["lol", "bar", "qux"],
      SPAWN = spawn_func,
    )

Anyway, it is now solved by creating an Action() with a second argument.

Thannk you,
Carnë


More information about the Scons-users mailing list