scons builder/emitter генерирует неявную нежелательную зависимость

Я использую 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, который затем остается где-то в кеше, даже если он удаляется из списка целей эмиттером.


person hasan    schedule 22.02.2018    source источник


Ответы (1)


Изменить:

Я проверил источники, и то, что вы пытаетесь достичь, невозможно с помощью Emitter. Указанные цели и источники Builder всегда будут сначала преобразованы в SCons Node внутри. Вот откуда взялся таинственный file.out (или file).

Только после этого шага эмиттер вызывается и дает вам возможность расширить список эмитируемых узлов.

В настоящее время я вижу только один способ: указать конечное имя цели (new_file) непосредственно как target в вызове Builder. В вашем эмиттере вы можете добавить дополнительные целевые узлы, если это необходимо, но первая цель всегда будет неявной зависимостью, извините.


Для справки, далее следует мой старый и неправильный ответ:

Удалить

suffix = ".out",

строка из определения вашего Builder. Он требует, чтобы выходной файл заканчивался суффиксом .out, что явно не то, что вам нужно в данном случае.

person dirkbaechle    schedule 22.02.2018
comment
Это все равно создаст нежелательный узел file (без префикса). - person hasan; 22.02.2018