2010-03-18 3 views
3

У меня есть файловая система, содержащая каталоги «builds», каждый из которых содержит файл «build-info.xml». Однако некоторые из построений произошли до того, как скрипт сборки сгенерировал «build-info.xml», поэтому в этом случае у меня есть несколько нетривиальный SCons SConstruct, который используется для создания скелета build-info.xml, чтобы его можно было использовать как зависимость для дальнейших правил.SCons не очищает все файлы

т.е .: для каждого каталога:

  • если наращивание info.xml уже существует, ничего не делать. Что еще более важно, не удаляйте его на «scons -clean».
  • , если build-info.xml не существует, сгенерируйте скелет один вместо - build-info.xml не имеет зависимости от каких-либо других файлов - скелет по существу является минимальным значением по умолчанию.
  • во время -clean, удалите build-info.xml, если это было сгенерировано, в противном случае оставьте это.

My SConstruct выглядит примерно так:

def generate_actions_BuildInfoXML(source, target, env, for_signature): 
    cmd = "python '%s/bin/create-build-info-xml.py' --version $VERSION --path . --output ${TARGET.file}" % (Dir('#').abspath,) 
    return cmd 

bld = Builder(generator = generate_actions_BuildInfoXML, chdir = 1) 
env.Append(BUILDERS = { "BuildInfoXML" : bld }) 

... 

# VERSION = some arbitrary string, not important here 
# path = filesystem path, set elsewhere 
build_info_xml = "%s/build-info.xml" % (path,) 
if not os.path.exists(build_info_xml): 
    env.BuildInfoXML(build_info_xml, None, VERSION = build) 

Моя проблема заключается в том, что 'SCons --clean' не удаляет сгенерированные сборки-info.xml файлов.

Я играл с env.Clean (t, build_info_xml) внутри 'if', но мне не удалось заставить это работать - в основном потому, что я не мог понять, что назначить 't' - я хочу сгенерировать build-info.xml будет очищаться безоговорочно, а не на основе очистки другой цели, и я не смог заставить это работать.

Если я попробовал простой env.Clean (None, "build_info_xml") после, но вне 'if', я обнаружил, что SCons очистит каждый файл build-info.xml, включая те, которые не были сгенерированы. Нехорошо.

Что я хотел бы знать, так это то, как SCons определяет, какие файлы следует очищать, а какие нет. Есть ли что-то смешное в том, как я использовал функцию генератора, которая не позволяет SCons записывать эту цель в качестве кандидата Clean?

+0

В дополнение к этому - с приведенным выше правилом, scons --tree = status не показывает «явный Builder» для build-info.xml. Он показывает E (существует) и C (текущий), но не B (явный построитель).Это единственный файл без B, поэтому, возможно, именно поэтому SCons не очищает его. Итак, почему env.BuildInfoXML не квалифицируется как «явный строитель»? – meowsqueak

+0

На самом деле, если я вручную очистил всю среду и запустил «scons --tree = status path/to/something/that/depends/on/build-info.xml», я получаю «B» для build-info.xml , и SCons строит его в соответствии с приведенным выше Правилом. Но я думаю, что тот факт, что правило имеет «Нет» в качестве зависимости, означает, что он не добавлен в список «Чистый» ... – meowsqueak

ответ

7

ОК, я думаю, что я разработал то, что происходит. Я сделал неверное предположение, что SCons записывает те файлы, которые он создает (в качестве целей), а затем использует этот записанный список во время последующего «чистого». Это, конечно, не имеет смысла.

Что действительно делает SCons, повторное выполнение всех правил зависимостей и создание нового дерева зависимостей. Он использует это, чтобы определить, какие файлы нужно очистить. Поскольку у меня было это условие os.path.exists(), это означает, что build-info.xml никогда не добавлялся в список Clean, потому что он всегда существовал в то время - очистка выполняется.

Оказывается, что env.Clean() был работает должным образом, в том, что было бы удалить все эти файлы, просто потому, что нет никакого способа для SCons при работе во второй раз (с --clean) знать что конкретный файл build-info.xml был создан, а не уже присутствует.

Способом обойти это было бы создание файла часового рядом с этими сгенерированными файлами. Но пока, мое новое понимание Чистого поведения Скоттов будет достаточно.

+0

Это хорошее описание поведения. Благодаря! –

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