C ++ Buildsystem с возможностью предварительной компиляции зависимостей

StackOverflow https://stackoverflow.com/questions/1827705

Вопрос

Я нахожусь в процессе настройки среды сборки для игрового проекта на c ++.Нашим главным требованием является способность создавать не только наш игровой код, но и его зависимости (Ogre3D, Cegui, boost и т.д.).Кроме того, мы хотели бы иметь возможность работать как на Linux, так и на Windows, поскольку наша команда разработчиков состоит из пользователей, использующих разные операционные системы.

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

Вопрос в том, существует ли осуществимый способ автоматической настройки зависимостей.Как разработчик Java, я знаю о Maven, но какие инструменты существуют в мире c ++?


Обновить: Спасибо за приятные ответы и ссылки.В течение следующих нескольких дней я опробую некоторые инструменты, чтобы увидеть, что соответствует нашим требованиям, начиная с CMake.До сих пор я действительно пользовался autotools, и как бы мне ни нравилась документация (автобук очень полезен для чтения), я боюсь, что autotools изначально не предназначены для использования в Windows.

Кто-то из вас предложил позволить какой-нибудь IDE управлять зависимостями.Мы состоим из людей, использующих все возможные технологии для написания кода - от чистого Vim до полноценного Eclipse CDT или Visual Studio.Именно здесь CMake позволяет использовать некоторую гибкость благодаря своей способности генерировать собственные файлы проекта.

Это было полезно?

Решение

В последней версии CMake 2.8 появился новый Внешний проект модуль.Это позволяет загружать / извлекать код, настраивать и создавать его как часть вашего основного дерева сборки.Это также должно позволять устанавливать зависимости.

На моей работе (группа обработки медицинских изображений) мы используем CMake для создания всех наших собственных библиотек и приложений.У нас есть собственный инструмент для отслеживания всех зависимостей между проектами (определенных в базе данных XML).Большинство сторонних библиотек (таких как Boost, Qt, VTK, ITK и т.д.) Создаются один раз для каждой поддерживаемой нами системы (MSWin32, MSWin64, Linux32 и т.д.) и передаются в виде zip-файлов в системе контроля версий.Затем CMake извлекет и настроит правильный zip-файл в зависимости от того, над какой системой работает разработчик.

Другие советы

Я использую GNU Autotools (Autoconf, Automake, Libtool) в течение последних нескольких месяцев в нескольких проектах, в которых я принимал участие, и я думаю, что это работает прекрасно.По правде говоря, требуется немного времени, чтобы привыкнуть к синтаксису, но я успешно использовал его в проекте, который требует распространения скриптов python, библиотек C и приложения на C ++.Я дам вам несколько ссылок, которые помогли мне, когда я впервые задал аналогичный вопрос здесь.

  • Страница GNU Autotools предоставляет лучшую документацию по системе в целом, но она довольно подробная.
  • В Википедии есть страница что объясняет, как все работает.Autoconf настраивает проект на основе платформы, на которой вы собираетесь компилировать, Automake создает Make-файлы для вашего проекта, а Libtool обрабатывает библиотеки.
  • A Makefile.am пример и a configure.ac пример это должно помочь вам начать работу.

Еще несколько ссылок:

  1. http://www.lrde.epita.fr /~adl/autotools.html
  2. http://www.developingprogrammers.com/index.php/2006/01/05/autotools-tutorial/
  3. http://sources.redhat.com/autobook/

Единственное, в чем я не уверен, - это в каком-либо типе Windows-оболочки для GNU Autotools.Я знаю, что вы можете использовать его внутри Cygwin, но что касается фактического распространения файлов и зависимостей на платформах Windows, вам, вероятно, лучше использовать установщик Windows MSI (или что-то, что может упаковать ваш проект внутри Visual Studio).

Если вы хотите распространять зависимости, вы можете настроить их в другом подкаталоге, например, libzip - файл, с конкретным файлом Makefile.запись am, которая будет создавать эту библиотеку.Когда вы выполняете сделать установку библиотека будет установлена на библиотека папка, которую сценарий настройки определил, что она должна использовать.

Удачи вам!

Существует несколько интересных замен make, которые автоматически отслеживают неявные зависимости (из файлов заголовков), являются кроссплатформенными и могут работать с сгенерированными файлами (напримеропределения шейдеров).Два примера, с которыми я привык работать, следующие Лепешки и Варенье/БЖам.

Я не знаю кроссплатформенного способа заставить * make автоматически отслеживать зависимости.Лучшее, что вы можете сделать, это использовать какой-нибудь скрипт, который сканирует исходные файлы (или это делает компилятор C ++) и находит #includes (условная компиляция усложняет это) и генерирует часть makefile.Но вам нужно было бы вызывать этот скрипт всякий раз, когда что-то могло измениться.

Вопрос в том, существует ли осуществимый способ автоматической настройки зависимостей.

Что вы имеете в виду под настройкой?

Как вы сказали, CMake скомпилирует все, как только зависимости будут установлены на машинах.Вы просто ищете способ упаковать источник зависимости?Как только все исходные тексты будут готовы, CMake и инструмент сборки (gcc, nmake, MSVS и т.д.) - это все, что вам нужно.

Редактировать:Обратите внимание, что в CMake есть команда file, которая может быть использована для загрузки файлов, если они необходимы: file(DOWNLOAD url file [TIMEOUT timeout] [STATUS status] [LOG log])

Правка 2: Пакет это еще один инструмент от ребят из CMake, который можно использовать для упаковки файлов и тому подобного для распространения на различных платформах.Он может создавать NSI для Windows и файлы .deb или .tgz для * nix.

На моем рабочем месте (мы создаем встроенные системы для защиты электропитания) мы использовали CMake для решения проблемы.Наша настройка позволяет запускать cmake из разных мест.

/
CMakeLists.txt "install precompiled dependencies and build project"
   project/
      CMakeLists.txt "build the project managing dependencies of subsystems"
      subsystem1/
         CMakeLists.txt "build subsystem 1 assume dependecies are already met"
      subsystem2/
         CMakeLists.txt "build subsystem 2 assume dependecies are already met"

Хитрость заключается в том, чтобы убедиться, что каждый файл CMakeLists.txt может вызываться изолированно, но что файл верхнего уровня по-прежнему может создавать все правильно.Технически нам не нужны вложенные файлы CMakeLists.txt но это радует разработчиков.Было бы абсолютной проблемой, если бы нам всем пришлось редактировать один монолитный файл сборки в корне проекта.

Я не настраивал систему (я помогал, но это не мое детище).Автор сказал, что в системе сборки boost cmake было несколько действительно хороших элементов, которые помогли ему создать все это гладко.

Во многих системах * nix для этого используется какой-либо менеджер пакетов или система сборки.Наиболее распространенный вариант с исходными текстами - GNU Autotools, который, как я слышал, является источником крайней печали.Однако с помощью нескольких скриптов и онлайн-хранилища для ваших deps вы можете настроить что-то подобное следующим образом:

  • В файле Makefile вашего проекта создайте цель (необязательно с вложенными целями), которая охватывает ваши зависимости.
  • В пределах целевого объекта для каждой зависимости сначала проверьте, есть ли источник dep в проекте (в * nix вы можете использовать touch для этого, но вы могли бы быть более тщательными)
  • Если dep отсутствует, вы можете использовать curl, и т.д. , чтобы загрузить dep
  • Во всех случаях попросите целевые объекты dep выполнить рекурсивный вызов make (make; make install; make clean; и т.д.) в Makefile (или другой файл сценария настройки / сборки) зависимости.Если dep уже собран и установлен, make вернется довольно быстро.

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

Прямо сейчас я работаю над инструментом, способным автоматически устанавливать все зависимости приложения на C / C ++ с точным требованием к версии :

  • компилятор
  • библиотеки
  • инструменты (cmake, autotools)

Прямо сейчас это работает для моего приложения.(Установка UnitTest ++, Boost, Wt, sqlite, cmake - все в правильном порядке)

Инструмент, названный «C ++ Version Manager» (вдохновленный превосходным ruby version manager), написан на bash и размещен на github : https://github.com/Offirmo/cvm

Любые советы и предложения приветствуются.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top