Система сборки с рекурсивным агрегированием зависимостей - PullRequest
1 голос
/ 17 мая 2010

Недавно я начал настраивать свою собственную библиотеку и проекты с использованием кроссплатформенной системы сборки (генерирует файлы make, решения / проекты Visual Studio и т. Д. По запросу), и я столкнулся с проблемой, которая, вероятно, уже решена.

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

(Ради аргументов давайте предположим, что мы имеем дело исключительно со статическими библиотеками.)

  • TopLevelApp.exe
    • dependency_A
      • dependency_A-1
      • dependency_A-2
    • dependency_B
      • dependency_B-1

Таким образом, в этом примере TopLevelApp нужно будет связать зависимость_А, зависимость_А-1, зависимость_А-2 и т. Д. И то же самое для B. Я думаю, что ответственность за запоминание всего этого вручную в целевом приложении довольно неоптимальная. Существует также проблема обеспечения того, чтобы одна и та же версия зависимости использовалась во всех целях (при условии, что некоторые цели зависят от одних и тех же вещей, например, повышение).

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

Система сборки, на которую я смотрел, - premake premake4 , которая не справляется с этим (насколько я могу судить). Кто-нибудь знает о системе сборки, которая справляется с этим? а если нет, то почему бы и нет?

1 Ответ

1 голос
/ 17 мая 2010

Типичный способ, которым это обрабатывается, заключается в том, что библиотека, от которой вы зависите, сообщает вам, что, в свою очередь, требуется и с какими версиями она связана. Один из способов сделать это - pkg-config . Например, если вы вызовете pkg-config name_of_package --cflags, он выведет необходимые флаги, которые должны включать флаги, необходимые для добавления заголовков косвенных зависимостей. Аналогично, pkg-config name_of_package --ldflags выведет необходимые флаги компоновщика, которые включают эту конкретную библиотеку, а также ее зависимости. Что касается системы сборки, я рекомендую использовать CMake . В CMake зависимости обнаруживаются через вызов FIND_PACKAGE (name_of_package), который, в свою очередь, определяет переменную name_of_package_FOUND как 1, если пакет был найден, а также - если он был найден - определяет name_of_package_LIBRARIES и name_of_package_INCLUDE_DIRS для библиотек и путей заголовков для этого пакета, а также для библиотек и заголовков его зависимостей. Тем не менее, механизм FIND_PACKAGE работает через подключаемые модули, написанные третьими лицами, и поэтому, хотя система должна устанавливать переменные _LIBRARIES и _INCLUDE_DIRS так, чтобы зависимости зависимостей включались рекурсивно, не все модули делают это правильно в последний раз, когда я проверял.

...