SCons: Строитель с не указанным $ TARGET создает вывод строителя в src dir вместо варианта dir - PullRequest
3 голосов
/ 14 ноября 2010

У меня есть конструктор, который выглядит следующим образом:

sFooBuilder = Builder( action = os.path.join(rBuildPath, 'foo_binary') + ' $SOURCE',        
                        suffix = '.c',
                        src_suffix = '.foo'
        )

Поскольку бинарный файл, на который я опираюсь, не принимает аргумент $ TARGET и выдает ошибку выполнения, в противном случае я указываю только аргумент $ SOURCE.Что происходит, так это то, что выходной файл двоичного файла помещается в каталог src вместо варианта dir.Однако SCons ожидает выходной файл в варианте dir.

Каждый раз, когда вы вызываете scons, указанная выше цель сборки выполняется из-за следующего:

scons: building `variant_dir/foo.c' because it doesn't exist

И просто для копирования файлак варианту dir с помощью Command Builder тоже не работает

scons: warning: Two different environments were specified for target foo.c,
        but they appear to have the same action: foo_binary $SOURCE
File "sconscript", 
scons: *** Multiple ways to build the same target were specified for: foo.c  foo.foo'] and from ['foo.c'])
File "/sconscript",

Мои вопросы, если это ожидаемое поведение?
Есть ли какие-либо предложения (помимо исправления используемого двоичного файла), как решить такие проблемы?случай?К сожалению, я не смог найти никакой документации, которая касается описанного выше случая.

Заранее спасибо!

1 Ответ

2 голосов
/ 15 ноября 2010

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), но это выглядит немного грязно.

...