SCons не чистит все файлы - PullRequest
       25

SCons не чистит все файлы

3 голосов
/ 19 марта 2010

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

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

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

Мой 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 не удаляет сгенерированные файлы build-info.xml.

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

Если бы я попробовал простой env.Clean (нет, «build_info_xml») после, но за пределами «если», я обнаружил, что SCons будет очищать каждый файл build-info.xml, включая те, которые не были сгенерированы. Не очень хорошо.

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

1 Ответ

7 голосов
/ 19 марта 2010

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

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

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

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

...