2013-10-24 2 views
3

Я работаю над внедрением системы сборки, использующей scons для нескольких крупных программных проектов. Существует структура каталогов, которая отделяет код для отдельных библиотек и программ от их собственных каталогов. С нашей существующей системой make я могу сделать «make clean» в одном каталоге программ, и он будет очищать только файлы, связанные с источником в этом каталоге. Однако, если я делаю «scons -c», он распознает, что программа зависит от множества библиотек, которые находятся в каталогах сестры (или кузена), и очищает все файлы для них. Это не то, что я хочу, так как мне нужно перестроить все эти библиотеки, которые могут занять несколько минут.Как предотвратить сборы от уборки родительских и родственных каталогов?

Я попытался сыграть с командой «NoClean()», но не получил работу, как мне нужно. Учитывая размер базы кода и сложность структуры каталогов, я не могу реалистично иметь строку NoClean() для каждого файла в каждой библиотеке.

Есть ли какой-либо способ сообщить scons игнорировать любые зависимости выше текущего каталога при выполнении чистых (то есть scons -c)?

ответ

1

Я хотел бы иметь хороший ответ на это сам.

Единственное решение, которое я могу предложить сейчас, это то, что вы получаете Noclean. Так что в вашей библиотеке, вы должны иметь что-то вроде этого

lib_objs = SharedObject(source_list) 
mylib = SharedLibrary('libname', lib_objs) 

Так для этого мы хотим, чтобы защитить библиотеку и источники из очищаемой.

NoClean([mylib, lib_objs]) 

Обратите внимание, что я должен был разделить здание объектных файлов из библиотеки, потому что я хочу, чтобы иметь возможность передать их NoClean, а также.

+0

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

+1

Просто, чтобы закрыть цикл, я смог получить поведение, которое я хотел, используя предложение Avatar33. То, что мне нужно было добавить, - это проверка того, является ли каждый исходный каталог либо каталогом запуска, либо потомком. \t CurrentDir = env.Dir ('') srcnode() abspath \t если не CurrentDir.startswith (env.GetLaunchDir()):.. \t \t env.NoClean ([myobjs, MyLib, установлен]) Это правильно очищает только текущий каталог и его потомков.Если я делаю «scons -c» из самого верхнего каталога, все дерево исходных текстов очищается. – user2916971

+0

Хорошая идея по управлению очисткой через каталоги. Я хочу, чтобы у Скотса был вариант для этого. Это не помогает в моем случае использования, когда я хочу иногда очищать все результаты тестирования устройства, и они разбросаны по всему проекту, привязанные к цели «test». Но очистка «теста» распространяется на все, от чего зависят тесты, вплоть до исходных файлов C++ –

1

Попробуйте использовать целевое имя при чистке.

scons -c aTargetName 

Вы можете использовать функцию SCons Alias() упростить целевое имя и также сгруппировать несколько целевых имен в один псевдоним.

При таком подходе вы должны добавить псевдоним в каждом соответствующем подкаталоге, что не обязательно плохо :)

+0

Насколько я могу судить, это совсем не помогает. Скон по-прежнему удаляет все зависимости цели или псевдонима. – Avatar33

+0

Да, я вижу, что это тоже все. Я считаю, что когда вы указываете конкретную цель, scons автоматически добавляет все свои зависимости. – user2916971

+0

Это хорошая точка в том, что также очищаются зависимости. То, что это будет делать, это уменьшить объем очищаемого. – Brady

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