foo_binary принимает input.foo и создает output.c в той же директории, что и input? Как вы звоните строителю? Как это? env.FooBuilder ('foo.c', 'foo.foo').
При использовании варианта dir scons ожидает, что выходные данные компоновщика перейдут в вариант_dir / foo.c. Когда это не удается, он думает, что вы удалили файл и воссоздает его при следующей сборке. Могу поспорить, что первая сборка также не удалась, но вторая работает, потому что scons находит «foo.c», который находится в вашем исходном дереве.
Похоже, самый простой способ - заставить foo_binary сгенерировать вывод в исходном каталоге, а затем переместить его. Вы сказали, что пытались это сделать, но, возможно, вы сделали это как отдельный шаг, а не в том же сборщике. В этом случае все было бы запутано в путях. Это должно сделать трюк:
sFooBuilder = Builder(action=[
os.path.join(rBuildPath, 'foo_binary') + ' $SOURCE',
Move('$TARGET.dir', '$TARGET.srcpath')],
suffix = '.c', src_suffix = '.foo' )
Выполняется 2 шага в одном действии построителя:
foo_binary foo.foo
mv foo.c variant_dir
Теперь, когда сборщик делает то, что вы говорите (создайте foo.c в варианте dir), все должно работать как положено.
Другое решение состоит в том, чтобы скопировать входной файл в каталог сборки, но это невозможно при одинаковом имени файла в исходных каталогах и каталогах сборки. SCons немного запутывается и сначала извлекает исходный файл каталога.
Если бы вы использовали разные имена, это было бы выполнимо (foo.foo.in скопировал в foo.foo в варианте dir, а затем преобразовал бы это в foo.c), но это выглядит немного грязно.