что вызывает scons для создания файлов, когда у меня есть пользовательский конструктор? - PullRequest
6 голосов
/ 09 октября 2010

Я схожу с ума, пытаясь контролировать, когда файлы создаются в scons.У меня есть очень простой пример дерева сборки (см. Ниже) со сборщиком Poem, который просто берет файл .txt и преобразует его в нижний регистр в соответствующий файл .eectxt.

В моих файлах SConstruct и SConscript я объявляю зависимости 3 файлов .txt.

Но я не могу понять, что помещает их в сборку по умолчанию!

sconstest/
    SConstruct
    tiger.txt
    src/
        SConscript
        hope.txt
        jabberwocky.txt

, где файлы * .txt - это стихи, а мои SConstruct и SConscript выглядят так:

SConstruct:

env = Environment();

def eecummings(target, source, env):
  if (len(target) == 1 and len(source) == 1):
    with open(str(source[0]), 'r') as fin:
        with open(str(target[0]), 'w') as fout:
            for line in fin:
                fout.write(line.lower());
  return None

env['BUILDERS']['Poem'] = Builder(action=eecummings, suffix='.eectxt', src_suffix='.txt');

Export('env');
poems = SConscript('src/SConscript');
tigerPoem = env.Poem('tiger.txt');

src / SConscript:

Import('env');

input = ['jabberwocky.txt', 'hope.txt'];
output = [env.Poem(x) for x in input];
Return('output');

Что я хочу сделать, это объявить зависимость файлов .eectxt от соответствующих файлов .txt, но не вызывает их сборку, если я явно не помещу их вDefault() встроить в файл SConstruct, или я запрашиваю их явно в командной строке.

Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 05 апреля 2012

По умолчанию каталог зависит от всех файлов и / или целей, которые в нем находятся.Итак:

scons

Затем создаст все цели в текущем каталоге.

0 голосов
/ 09 октября 2010

Я понял, как делать то, что я хочу, но я все еще не понимаю, почему мне нужно делать это таким образом.Принятие первого достойного ответа, который его объясняет.

Вот что работает, если я добавлю следующее в корневой файл SConstruct:

env.Ignore('.', tigerPoem);
env.Ignore('src', poems);
env.Alias('poems', [tigerPoem]+poems);

Это игнорирует 3 стиха из цели по умолчанию,а затем добавляет их в качестве целей с псевдонимами «стихи», поэтому, если я запускаю scons, он ничего не создает, но если я запускаю scons poems, он создает файлы.

Почему это работает?Почему вызов env.Poem(...) добавляет что-то к целям по умолчанию?

...