2013-08-02 2 views
2

Я пытаюсь заставить SCons проверить git repo, что мне нужно (и, надеюсь, сохранить этот репо в актуальном состоянии). Проблема в том, что я должен сказать, какие файлы содержит репозиторий git для его использования в сборке, и если я это сделаю, SCons создаст репо, прежде чем он попытается клонировать его.Скажите SCons не авто-создавать каталоги?

Например, сказать, что я хочу, чтобы клонировать GStreamer, и использовать create-uninstalled-setup.sh скрипт (это не то, что я на самом деле делает, но это гораздо проще/быстрее скрипт, который Экспонаты та же проблема):

Command(['gstreamer/.git', 'gstreamer/scripts/create-uninstalled-setup.sh'], 
    None, 'git clone git://anongit.freedesktop.org/git/gstreamer/gstreamer') 
Command('~/gst/git', 'gstreamer/scripts/create-uninstalled-setup.sh', 
    'gstreamer/scripts/create-uninstalled-setup.sh') 

Но это не удается, потому что SCons создает GStreamer/скрипты, прежде чем он пытается клонировать GStreamer:

$ SCons
Scons: Чтение SConscript файлов ...
SCons: сделано чтение SCons cript файлы.
SCons: Строительные цели ...
мерзавец клон мерзавец: //anongit.freedesktop.org/git/gstreamer/gstreamer
фатальные: путь назначения «GStreamer» уже существует и не пустой каталог.
scons: *** [gstreamer/.git] Ошибка 128
сб: здание завершено из-за ошибок.
$ Ls GStreamer/
скрипты

Если я скажу первую команду, что она создает папку "GStreamer", он создает цикл зависимости:

Command(['gstreamer', 'gstreamer/scripts/create-uninstalled-setup.sh'], 
    None, 'git clone git://anongit.freedesktop.org/git/gstreamer/gstreamer') 
Command('~/gst/git', 'gstreamer/scripts/create-uninstalled-setup.sh', 
    'gstreamer/scripts/create-uninstalled-setup.sh') 

$ SCons
SCons : Чтение файлов SConscript ...
scons: сделано чтение файлов SConscript.
scons: Цели здания ...
scons: сделано цели здания.

SCons: *** Найдено цикл зависимостей (ы):
GStreamer/скрипты -> GStreamer/скрипты/create-uninstalled-setup.sh -> GStreamer/скрипты
GStreamer/скрипты/создать-деинсталлировать-установки .sh -> GStreamer/скрипты -> GStreamer/скрипты> /create-uninstalled-setup.sh

Файл "/usr/lib/scons/SCons/Taskmaster.py", строка 1019, в субботнике

Если я не сообщаю первой команде, что она создает «create-uninstalled-setup.sh», она запутывается, потому что ее не существует:

Command(['gstreamer'], 
    None, 'git clone git://anongit.freedesktop.org/git/gstreamer/gstreamer') 
Command('~/gst/git', 'gstreamer/scripts/create-uninstalled-setup.sh', 
    'gstreamer/scripts/create-uninstalled-setup.sh') 

$ SCons
SCons: Чтение SConscript файлов ...
Scons: сделано чтение SConscript файлов.
scons: Building objects ...
scons: *** [~/gst/git] Источник `gstreamer/scripts/create-uninstalled-setup.sh 'не найден, нужен целевой ~ ~/gst/git' ,
подсвечники: здание завершено из-за ошибок.

В качестве обходного пути, я могу rm -rf папку, прежде чем я клон, но это явно не идеал:

Command(['gstreamer/.git', 'gstreamer/scripts/create-uninstalled-setup.sh'], None, 
    'rm -rf gstreamer && git clone git://anongit.freedesktop.org/git/gstreamer/gstreamer') 
Command('~/gst/git', 'gstreamer/scripts/create-uninstalled-setup.sh', 
    'gstreamer/scripts/create-uninstalled-setup.sh') 

Есть ли лучший способ обработки этого?

ответ

1

Поскольку нет способа сообщить git, что каталог действительно пуст (хотя он имеет пустые поддиры), и мы не можем понять, как сообщить SCons, чтобы не создавать собственные поддиректории, вы могли бы создать свою собственную зависимость чек и колл git clone с функцией SCons Execute(), которая выполняется перед выполнением любой проверки встроенной зависимости SCons следующим образом:

import os.path 

setup_file = 'gstreamer/scripts/create-uninstalled-setup.sh' 
if not os.path.exists(setup_file) 
    Execute('git clone git://anongit.freedesktop.org/git/gstreamer/gstreamer') 

Command('~/gst/git', setup_file, setup_file) 
-1

что происходит и что, как представляется, проблема в том, что при подготовке построить цели все каталог до него создается, если он не существует. Это похоже на создание узла каталогов, который по умолчанию выполняется путем создания каталога.

Это значит, что при первой попытке создайте каталог gstreamer, создав директорию. Причина, по которой ваша вторая попытка не срабатывает, я действительно не знаю. И третья причина в том, что у вас просто нет правила для построения gstreamer/scripts/create-uninstalled-setup.sh.

Решение, как представляется, определить правило, которое собирает каталог gstreamer:

Command(Dir("gstreamer"), [], "git clone git://anongit.freedesktop.org/git/gstreamer/gstreamer") 

то правило для создания gstreamer/scripts/create-uninstalled-setup.sh. В идеале я хотел бы включить его в приведенное выше правило, но он, похоже, не работает. Однако, так как он будет создан, когда каталог gstreamer создаются по указанному выше правилу нужно только фиктивному правилу (нет зависимостей, никаких дальнейших действий - подготовка строить будет делать свою работу):

Command("gstreamer/scripts/create-uninstalled-setup.sh", [], []) 

Недостатком такого подхода является то, что для каждого источника, найденного в git, необходимо было бы прямо указать scons об этом, по крайней мере, я не нашел способа сделать это автоматически. Если это проблема для вас, вам нужно будет убедиться, что вы клонируете git, когда считывается файл SConstruct (т. Е. Используйте функцию Execute, как в ответе Брэди).

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