C ++ Buildsystem с возможностью заранее компилировать зависимости - PullRequest
6 голосов
/ 01 декабря 2009

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

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

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


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

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

Ответы [ 7 ]

7 голосов
/ 05 декабря 2009

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

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

5 голосов
/ 01 декабря 2009

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

  • Страница GNU Autotools предоставляет лучшую документацию по системе в целом, но она довольно многословна.
  • В Википедии есть страница , которая объясняет, как все работает. Autoconf настраивает проект на основе платформы, на которой вы собираетесь скомпилировать, Automake создает Make-файлы для вашего проекта, а Libtool обрабатывает библиотеки.
  • Пример Makefile.am и пример 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 install , библиотека будет установлена ​​в папку lib , которую, как определил скрипт конфигурации, она должна использовать.

Удачи!

2 голосов
/ 02 декабря 2009

На моем рабочем месте (мы строим встраиваемые системы для защиты электропитания) мы использовали 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 может быть вызван изолированно, но что файл верхнего уровня все еще может правильно построить все. Технически нам не нужны файлы sub CMakeLists.txt, но это радует разработчиков. Было бы очень больно, если бы нам всем пришлось редактировать один монолитный файл сборки в корне проекта.

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

2 голосов
/ 01 декабря 2009

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

Что вы имеете в виду настроить?

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

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

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

2 голосов
/ 01 декабря 2009

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

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

1 голос
/ 01 декабря 2009

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

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

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

0 голосов
/ 10 января 2013

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

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

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

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

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

...