2013-05-14 3 views
7

Я хотел бы, чтобы SCons создавал для меня исходные файлы в моем каталоге src/, а затем создавал их как любой другой исходный файл в моем каталоге сборки build/variantX.Генерация кода SCons и VariantDir

Это мой SCons файл:

import SCons 

def my_builder(env, target, source): 
    # do stuff 
    pass 

env = Environment() 
env.VariantDir('build/variant1/', 'src', duplicate=0) 
env.Command('src/foobar.cc', 'src/foobar.input', action=my_builder) 
env.Program('bin/test', [ 
    'build/variant1/foobar.cc', 
    'build/variant1/test.cc', 
    ]) 

This ошибки со следующим сообщением:

Источник src/foobar.cc не найден, необходимо прицельной build/variant1/foobar.o

, которые я не думаю, правильно, учитывая, что я действительно предоставляю команду для сборки src/foobar.cc.

Теперь я попробовал несколько обходных путей:

  • , если я заменю build/variant1/foobar.cc в программе с src/foobar.cc, он работает, но, очевидно, foobar.o получает создан в src/, а не build/variant1

  • , если я заменю src/foobar.cc в команде с build/variant1/foobar.cc, он действительно работает, но я хотел бы, чтобы код был сгенерирован в src/; (И потому, что такие вещи, как относительные пути в включают каталоги не будут работать, если duplicate=1)

  • если duplicate=1, я получаю подобное сообщение об ошибке, но на этот раз упоминая подкаталог варианта:

    Источник build/variant1/foobar.cc не найден , необходимо целями build/variant1/foobar.o

есть ли способ обойти это? Это ограничение/ошибка в SCons, или есть фундаментальное недоразумение на моей стороне?

+0

Вы когда-нибудь находили ответ на эту проблему? Я сталкиваюсь с чем-то очень похожим. – jfritz42

ответ

2

Я хотел бы предложить создать явную зависимость между Command() и программы() звонки следующим образом:

target1 = env.Command('src/foobar.cc', 'src/foobar.input', action=my_builder) 
target2 = env.Program('bin/test', [ 
         'build/variant1/foobar.cc', 
         'build/variant1/test.cc', 
         ]) 
Depends(target2, target1) 
# This should work too 
# Depends(target2, "src/foobar.cc") 

Или вы могли бы указать цель из Command() как часть источника программы () следующим образом:

target1 = env.Command('src/foobar.cc', 'src/foobar.input', action=my_builder) 
env.Program('bin/test', [ 
      target1, 
      'build/variant1/test.cc', 
      ]) 

Я нету испытал это, так Im не уверен, как он будет работать в сочетании с вызовом VariantDir()

Here является сома Дополнительная информация о генерации исходного кода с помощью SCons.

+0

Привет, Брейди, спасибо за вашу помощь. Ваша первая идея была действительно приятной, но она, похоже, не имеет никакого эффекта. Вторая, по-видимому, практически такая же, как и в моем первом обходном пути: она работает, но она строит ее в исходном каталоге, а не в варианте. Ссылка выглядит интересной, сейчас я ее переживаю. – UncleZeiv

+0

@UncleZeiv Im действительно удивил, что функция Depends() не работает. Вместо этого попробуйте использовать фактическое имя файла, я обновлю ответ. – Brady

+0

'--tree = all' говорит мне, что это приводит к' bin/test' в зависимости от «правильного» 'src/foobar.cc' (тот, который, в свою очередь, зависит от' src/foobar.input'), но 'build/variant1/foobar.o' по-прежнему зависит от« болтающегося »' src/foobar.cc', который ничем не зависит от чего-либо и (открытого вовлечения с исходным кодом scons) даже не кажется любой строитель прилагается к нему. Я действительно начинаю думать, что это ошибка Scons. – UncleZeiv

0

Я знаю, что это было какое-то время, но я ударил по той же стене. С небольшими изменениями в «тест» и раствор (смотрите ниже) код:

import SCons 

env = Environment() 
env.VariantDir('build/variant1/', 'src', duplicate=0) 
env.Command('src/foobar.cc', 'src/foobar.input', action="cp src/foobar.input src/foobar.cc", shell=True) 
env.Depends("build/variant1/foobar.cc", "src/foobar.cc") 
env.Program('bin/test', [ 
'build/variant1/foobar.cc', 
]) 

Добавленного «env.Depends» на «variantdir-источнике» до «генерируемого-источника» является ключом. Не знаю, зачем это нужно. Я бы назвал это ошибкой, но я думаю, что ее признакам (на основе полученных отзывов об ошибках ..)

Cheers,

Смежные вопросы