2010-09-14 2 views
2

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

Одна из проблем, с которыми он сталкивается, заключается в решении зависимостей между исходными пакетами C++. В системе каждый исходный пакет встроен в DLL в Windows или совместно используемую библиотеку в Linux.

Предположим, что пакет A содержит зависимости от пакетов B и C. B и C указаны в SConscript пакета A. Это отлично. DLL для пакета A также будет связана с DLL для B и C. Это также прекрасно, поскольку любые зависимости связей, которые B и C имеют, уже были разрешены, когда эти библиотеки DLL были созданы.

Усложнение поставляется с пакетами, которые имеют связанные с ними модульные тесты. Здесь мы должны знать полную, рекурсивно расширяется, список зависимостей библиотеки, по двум основным причинам:

  1. Построение модульного тестирования включает в себя создание сценария, который устанавливает PATH и вызывает исполняемый файл. Запись должна быть добавлена ​​в PATH для каждой зависимости от времени выполнения.
  2. Для связывания исполняемого файла единичного теста в Linux требуется полный расширенный список зависимостей библиотек. Это отличается от Windows, где модель связывания DLL означает, что косвенные зависимости уже учтены.

Мы не хотим явно указывать полностью расширенный список зависимостей, потому что это слишком многословная и проблема обслуживания.

Текущая система, которая по-прежнему не работает, требует от нас только указания прямых зависимостей в пакете SConscripts, но устраняет косвенные зависимости через код Python в SConstruct. Этот код открывает и анализирует файлы SConscript и создает карту зависимостей из извлеченной таким образом информации. Этот подход кажется неправильным. Интуитивно я чувствую, что должен быть способ сделать это более естественно, используя собственные возможности SCons, но я недостаточно знаком с SCons, чтобы иметь возможность предложить лучший способ. Есть ли лучший способ и что это?

+0

Вы проверили выход, например. 'scons --tree = производный'? – Dummy00001

+0

Это средство отладки для браслетов, если я правильно понимаю. Я не уверен, как это поможет с этой проблемой. Пожалуйста, дайте мне знать, если я что-то упустил. – Bob

ответ

1

Это хак, но я просто держать переменную в моей среде верхнего уровня, который экспортируется во все мои SConscripts, и каждый раз, когда один из SConscripts нуждается в новую библиотеку, я просто делаю это:

env.Append(TOPLEVEL_LIBS = ['somelib']) 

Таким образом, env ['TOPLEVEL_LIBS'] содержит все необходимые библиотеки и доступен из любого SConscript.

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