Builder 的其他特定源和目标
Additional, specific source and target for a Builder
我是 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
添加了额外的目标和源。但是,我找不到如何区分主要 source/target 和需要使用特定选项传递的特殊 source/target - 我不能使用 $TARGETS
和 $SOURCES
上面的例子。我可能会使用 generator 并索引到 source
和 target
,但这看起来有点老套。我有更好的方法吗?
根据您的描述,您应该同时使用发射器和发生器,正如您在问题末尾所说的那样。 "main" source/target 将是 source/target 列表中的第一个元素。这对我来说并不难,但我可能只是习惯了...
有工作示例的答案总是更好...
这是执行您描述的操作的 SConstruct。我不确定你打算如何从 input.foo
计算 some.foo
和 some.bar
,所以在这个例子中我从 [=14] 计算 input.bar
和 input.baz
=],然后将 output.dir
附加到目标列表。
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')
当 运行 在 linux...
>> touch input.bar input.baz input.foo
>> echo "#\!/bin/sh" > script && chmod +x script
>> tree
.
├── input.bar
├── input.baz
├── input.foo
├── SConstruct
└── script
0 directories, 5 files
>> scons --version
SCons by Steven Knight et al.:
script: v2.3.4, 2014/09/27 12:51:43, by garyo on lubuntu
engine: v2.3.4, 2014/09/27 12:51:43, by garyo on lubuntu
engine path: ['/usr/lib/scons/SCons']
Copyright (c) 2001 - 2014 The SCons Foundation
>> scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
./script --special-in input.bar --special-in input.baz output.foo output.dir
scons: done building targets.
所有 dependencies/targets 都将得到维护,如果您需要像这样将一个构建器的输出提供给另一个构建器。
如果这不能回答您的问题,请说明您还想做什么。
我是 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
添加了额外的目标和源。但是,我找不到如何区分主要 source/target 和需要使用特定选项传递的特殊 source/target - 我不能使用 $TARGETS
和 $SOURCES
上面的例子。我可能会使用 generator 并索引到 source
和 target
,但这看起来有点老套。我有更好的方法吗?
根据您的描述,您应该同时使用发射器和发生器,正如您在问题末尾所说的那样。 "main" source/target 将是 source/target 列表中的第一个元素。这对我来说并不难,但我可能只是习惯了...
有工作示例的答案总是更好...
这是执行您描述的操作的 SConstruct。我不确定你打算如何从 input.foo
计算 some.foo
和 some.bar
,所以在这个例子中我从 [=14] 计算 input.bar
和 input.baz
=],然后将 output.dir
附加到目标列表。
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')
当 运行 在 linux...
>> touch input.bar input.baz input.foo
>> echo "#\!/bin/sh" > script && chmod +x script
>> tree
.
├── input.bar
├── input.baz
├── input.foo
├── SConstruct
└── script
0 directories, 5 files
>> scons --version
SCons by Steven Knight et al.:
script: v2.3.4, 2014/09/27 12:51:43, by garyo on lubuntu
engine: v2.3.4, 2014/09/27 12:51:43, by garyo on lubuntu
engine path: ['/usr/lib/scons/SCons']
Copyright (c) 2001 - 2014 The SCons Foundation
>> scons
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
./script --special-in input.bar --special-in input.baz output.foo output.dir
scons: done building targets.
所有 dependencies/targets 都将得到维护,如果您需要像这样将一个构建器的输出提供给另一个构建器。
如果这不能回答您的问题,请说明您还想做什么。