scons: как извлечь архивы в зависимости от меток времени

Мой проект использует внешние пакеты. Эти пакеты распространяются в tarball, и их содержимое извлекается при обновлении tarballs.

Например, я использую Boost. Соответствующий внешний пакет - boost.tar.bz2. Этот пакет содержит заголовочные файлы и библиотеки. Что я хотел бы сделать, так это автоматически извлекать содержимое этого архива с помощью scons при обновлении тарбола.

Я могу добиться этого с помощью Makefile, используя "файл метки времени". Когда tarball новее, чем файл метки времени, архив автоматически извлекается:

all: external-packages

external-packages: boost xml2

boost: .boost-timestamp

xml2: .xml2-timestamp

.boost-timestamp: boost.tar.bz2
    @echo updating boost externals
    @tar xjf boost.tar.bz2
    @touch .boost-timestamp


.xml2-timestamp: xml2.tar.bz2
    @echo updating xml2 externals
    @tar xjf xml2.tar.bz2
    @touch .xml2-timestamp

clean:
    rm -rf .*-timestamp boost xml2

Как я могу добиться того же с помощью scons?

1 ответ

Я думаю, что вам лучше всего взглянуть на строителя Untar.

После того, как вы добавите добавление функции builder / emitter в вашу папку site_scons, ваш файл scons может выглядеть так:

env = Environment()
env..Append(BUILDERS = {'UnTar' : unTarBuilder})

external_package = "packages/boost.tar.bz2"
archive = env.UnTar(source=external_package) 

Однако вы должны заметить, что Untar Builder не переносит каталоги в эмиттер и, следовательно, не удаляет их на clean

Смысл этого компоновщика в том, что он является эмиттером, который гарантирует, что SCons знает, что он может создавать заголовки, поэтому всякий раз, когда что-то зависит от них (кто-то их включает), он запускает компоновщик untar всякий раз, когда изменяется файл tar.

Другие вопросы по тегам