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.