У меня есть файловая система, содержащая каталоги «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?
В дополнение к этому - с приведенным выше правилом, scons --tree = status не показывает «явный Builder» для build-info.xml. Он показывает E (существует) и C (текущий), но не B (явный построитель).Это единственный файл без B, поэтому, возможно, именно поэтому SCons не очищает его. Итак, почему env.BuildInfoXML не квалифицируется как «явный строитель»? – meowsqueak
На самом деле, если я вручную очистил всю среду и запустил «scons --tree = status path/to/something/that/depends/on/build-info.xml», я получаю «B» для build-info.xml , и SCons строит его в соответствии с приведенным выше Правилом. Но я думаю, что тот факт, что правило имеет «Нет» в качестве зависимости, означает, что он не добавлен в список «Чистый» ... – meowsqueak