Builder的其他特定源和目标

时间:2015-05-27 15:28:34

标签: scons

我是Scons的新手,我正在试图弄清楚我是否可以将它用于我的用例。我有一个脚本,其主要动作是获取单个输入并在给定目录中生成多个输出文件。但是,它还需要一个额外的输入和一个额外的输出,如

script --special-in some.foo --special-in some.bar input.foo output.dir/

可以从输入文件名(此处为some.*)计算input.foo个文件的名称。并且一条规则生成的some.*文件被其他规则使用。

documentation我发现可以像

中那样创建自定义构建器
bld = Builder(action = 'foobuild $TARGETS - $SOURCES',
              suffix = '.foo',
              src_suffix = '.input',
              emitter = modify_targets)

其中emitter添加了额外的目标和来源。但是,我无法找到如何区分主要源/目标与需要使用特定选项传递的特殊源 - 我不能使用$TARGETS$SOURCES,如上所述例。我可能会使用generator并将索引编入sourcetarget,但这看起来有点笨拙。我有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

根据您的描述,您应该同时使用发射器和发生器,就像您在问题结束时所述。 “主”源/目标将是源/目标列表中的第一个元素。这对我来说似乎不太讨厌,但我可能只是习惯了......

通过一个有效的例子,答案总是更好......

这是SConstruct执行您描述的操作。我不确定您计划如何从some.foo计算some.barinput.foo,因此在此示例中,我从{{1}计算input.barinput.baz只需将input.foo附加到目标列表中即可。

output.dir

在linux上运行时......

import os

def my_generator(source, target, env, for_signature):
    command = './script '
    command += ' '.join(['--special-in %s' % str(i) for i in source[1:]])
    command += ' '
    command += ' '.join([str(t) for t in target])
    return command

def my_emitter(target, source, env):
    source += ['%s%s' % (os.path.splitext(
        str(source[0]))[0], ext) for ext in ['.bar', '.baz']]
    target += ['output.dir']
    return target, source

bld = Builder(generator=my_generator,
              emitter=my_emitter)

env = Environment(BUILDERS={'Foo':bld})
env.Foo('output.foo', 'input.foo')

如果您需要将此类构建器的输出提供给另一个构建器,则将保留所有依赖项/目标。

如果这不能回答你的问题,请澄清你还想做什么。