Компиляция Open-Source C/C++ приложений
Зачем мне это?
Ведь можно было бы просто взять бинарный пакет и радоваться жизни.
Однако эта информация полезна:
- В приложении могут быть ошибки. А вам НУ ОЧЕНЬ надо использовать данное приложение. В результате, обладая знанием и навыком, можно внести исправление и решить текущую проблему.
- Вы начинаете новый проект и хотите построить разумную систему сборки вашего приложения.
- ….
Начнём с простого :)
Как выглядит процесс сборки из исходных кодов:
- Получить доступ к исходным кодам и скачать себе.
- GitHub, публичный хостинг Git-репозиториев, из которых можно делать clone. Для работы необходим
git. - В “стародавние” времена у каждого уважающего себя проекта был сайт, на котором публиковались архивы с исходным кодом. И их можно было скачать.
- В любом нормальном дистрибутиве для каждого пакета есть также пакет с исходным кодом, из которого данный бинарный пакет был собран.
- GitHub, публичный хостинг Git-репозиториев, из которых можно делать clone. Для работы необходим
- Узнать каким образом это ПО собирается.
readme,README.md, …. - файлы содержат общую информацию о проекте. Зачастую там можно найти информацию про сборку.- Альтернативные:
get-started.md, каталогdoc/, файлINSTALL - Поискать информацию о сборке на официальном сайте проекта. Другое место - база знаний, она же wiki.
- Свободный поиск.
- Собрать, следуя инструкции. И пытаться решить проблемы, которые не были отражены в инструкции.
Рассмотрим пример сборки на чистом Make
Соберём из исходных кодов http://ne.di.unimi.it/
Оно является текстовым редактором :)
- поставить git
- прочитать
INSTALL.md - поставить make с помощью мета-пакета build-essential
- выполнить команду
makeизINSTALL.md - поймать ошибку по отсутсвующему файлу
makeinfo - найти пакет, в котором есть исполняемый файл
makeinfo,texinfo - поймать ошибку об отстсвующем файле
curses.hот комплиятора GCC - находим пакет libncruses-dev, в котором содержатся нужные файлы, ставим его
- разделяем
make build installнаmake buildиsudo make install
Какие проблемы сборки на Make мы увидели?
- Мы должны были сами понять чего не хватает для сборки.
- Мы получали ошибки о том, что чего-то не хватает только во время выполнения этого шага, а не заранее.
-
Нам очень повезло, что зависимости лежат именно там, где они прописаны в Makefile. При компиляции можно (и нужно) указать каталоги, в которых происходит поиск заголовочных файлов и файлов-библиотек. В разных дистрибутивах они могут находиться в разных местах.
- Надо было уметь пользоваться инструментами для поиска пакетов-зависимостей
GNU Autotools
Для смягчения проблем первых трёх проблем придумали более сложные системы сборки.
С помощью Autotools разработчик описывает список зависимостей, которые нужны для сборки его приложения. А пользователь перед компиляцией запускает специальный скрипт, который проверят, что все зависимости установлены и настраивает Makefile на их использование.
- Мы узнаем, что нет нужных компонент на этапе конфигурирования
- Пользователь получает информацию о проблеме не в формате ошибки вызова инструмента
В качестве примера приложения, которое использует GNU Autotools рассмотрим LFTP, https://lftp.yar.ru/, клиента для FTP и SFTP.
- Качаем с помощью wget исходные коды
- Распаковываем файл
- Читаем файл
INSTALL - Выполняем скрипт
configure - Скрипт упал на отсутствующей библиотеке readline
- Ставим заголовочные файлы, libreadline-dev
- Запускаем скрипт заново
- Жалуется на pkg-config и заголовочные файлы libgnutls. Ставим их
- Запускаем скрипт заново
- Ставим zlib1g-dev пакет
- Запускаем скрипт заново
- Запускаем компиляцию
make -j3 - Ставим приложение с помощью
sudo make install
./configure
make
sudo make install