Компиляция 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