Фреймворк для создания и управления сторонними библиотеками - PullRequest
1 голос
/ 07 августа 2010

Я работаю над кроссплатформенным проектом, в котором используется большое количество сторонних библиотек (сейчас их 22, и я рассчитываю, что это число значительно увеличится). Мой проект основан на CMake и поддерживает каталог ThirdParty / как:

ThirdParty / $ Имя_библиотеки / включить /
ThirdParty / $ Имя_библиотеки / Библиотека / $ Платформа / $ buildtype /

Мой CMakeLists.txt имеет логику для определения соответствующих значений для $ platform (mac-i386, mac-ia64, win32-i386 и т. Д.) И $ buildtype (отладка / выпуск).

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

Это было бы легко автоматизировать, если бы сторонние библиотеки сами основывались на CMake, но они используют все, от CMake до autoconf, до пользовательских решений для созданных вручную Make-файлов. Между ними нет никакой согласованности, и все они требуют, чтобы различные прыжки были проложены в отношении построения платформы (особенно в отношении 32- и 64-разрядных сборок).

Существуют ли какие-либо инструменты (или расширения CMake), которые облегчили бы управление? Есть ли хоть какая-то разумная точка соприкосновения, например, между CMake и autoconf?

Идеальное решение - дать мне единственную команду для сборки всего, что требует перестройки для данной платформы (кросс-компиляция не нужна, поскольку у меня есть доступ ко всем необходимым платформам), но все, что постепенно облегчает мою жизнь, будет оценили.

1 Ответ

1 голос
/ 08 августа 2010

Для этого вы можете использовать ExternalProject .

Создание пользовательских целей для создания проектов во внешних деревьях.Функция «ExternalProject_Add» создает пользовательскую цель для загрузки, обновления / исправления, настройки, сборки, установки и тестирования шагов внешнего проекта.

Если у вас уже есть источник в файловой иерархии вашего проекта, затем вы можете использовать что-то вроде этого (для zlib):

include(ExternalProject)
ExternalProject_Add(zlib URL ${CMAKE_CURRENT_SOURCE_DIR}/zlib-1.2.4/
    CONFIGURE_COMMAND cd <SOURCE_DIR> && ./configure --prefix=${CMAKE_CURRENT_BINARY_DIR}/zlib-build
    BUILD_IN_SOURCE 1
    BUILD_COMMAND make)

Это скопирует исходный код zlib из вашего исходного дерева в дерево сборки, запустите шаг настройки (после того, как cd'ing скопирует вкаталог), затем запустите make в настроенном каталоге.Наконец, встроенная версия zlib устанавливается в текущий каталог сборки, в подкаталог zlib-build.

Вы можете настроить шаги настройки, настройки и сборки так, как вам нравится - zlib 1.2.4 дляВ примере не нравится, когда «configure» запускается без источника.

Для пользовательской настройки вы можете пропустить шаг CONFIGURE и просто запустить команду сборки (например).Для этого требуется последняя версия CMake (2.8 +).

...