Я использую scons 2.5.1. Я хочу создать построитель с эмиттером, который меняет целевое имя, например:
def modify_targets(target, source, env):
target[0] = 'new_target'
return target, source
bld = Builder(action = 'echo $TARGETS - $SOURCES',
suffix = ".out",
src_suffix = '.input',
emitter = modify_targets)
env = Environment(BUILDERS = {'Foo' : bld})
env.Foo('file')
Тогда дерево зависимостей выглядит так:
$ scons -Q --tree=all,status
echo new_target - file.input
new_target - file.input
E = exists
R = exists in repository only
b = implicit builder
B = explicit builder
S = side effect
P = precious
A = always build
C = current
N = no clean
H = no cache
[E b ]+-.
[E C ] +-SConstruct
[E C ] +-file.input
[ ] +-file.out
[ B ] +-new_target
[E C ] +-file.input
[E C ] +-/bin/echo
Есть неявный file.out
, который должен быть удален эмиттером. Это вызывает проблемы в случае, когда мне нужно создать зависимость от каталога (например, каталог является источником). Затем Сконс жалуется на Implicit dependency 'somedir/file.out' not found, needed by target 'xyz'
. Этот файл никогда не будет существовать. Как я могу заставить Builder не создавать неявную зависимость?
Обновление: кажется, что Builder сначала создает SCons.Node.FS.Entry
, который затем остается где-то в кеше, даже если он удаляется из списка целей эмиттером.