советы
Много лет назад, когда я только начинал пользоваться линуксом, я часто сталкивался с тем, что какой-нибудь нужной или интересной мне программы в моём дистрибутиве не было, или была, но какой-нибудь не той версии.. И тогда надо было собирать её из исходников. Это занятие мне казалось страшным и сложным.
Сейчас такая ситуация случается гораздо реже, благо установка и обновление программ в Debian больше напоминает заказ в ресторане: хочу это, хочу то — подождите — готово! Однако умение собирать программы из исходников рано или поздно пригождается практически любому пользователю свободного программного обеспечения. И сложного в этом ничего нет.
Достаточно один раз в жизни услышать волшебное заклинание: » configure , make , make install «. Дальше я объясню, что это значит.
Сборку программы можно сравнить с выпечкой пирога. Чаще всего, вначале надо взять все необходимые ингридиенты (исходники),
потом смешать их в нужном порядке (подготовить исходники к сборке, ./configure ), а затем залить в форму и поставить в печь (запустить сборку, make ). Спустя некоторое время из печи можно вынимать готовый к употреблению пирог (устанавливать готовую программу, make install ).
Следует отметить, что в данном случае для выпечки необходима кухня и печь. Также и для сборки программы необходимы инструменты разработчика. Обычно это включает в себя как минимум компилятор и сопутствующие ему программы, как например утилита make . Это и есть «печь». Потребуется и место, где можно всем этим заняться — командная строка (терминал) («кухня»). Если у вас есть и кухня, и печь, то можете начинать готовить.
Итак, все свободные программы доступны в виде исходного кода. Это полуфабрикат программы. Из него легко можно собрать саму программу, а можно и использовать для создания какой-нибудь новой программы. По-английски исходный код называется source code.
Шаг 1: берём исходники
Необходимо скачать и распаковать архив с исходным кодом программы. Например, можно скачать программу hello-2.1.1. Обычно исходники следует брать с сайта разработчиков программы.
Распаковать архив можно так:
$ tar zxvf hello-2.1.1.tar.gz
(Не забывайте, что в большинстве случае нажатие клавиши Tab позволяет дополнить имя файла, введя лишь несколько первых символов). При этом содержимое архива будет распаковано в тот же каталог, в котором находится архив.
Перейдите в каталог с исходным кодом:
$ cd hello-2.1.1
Шаг 2: configure (месим тесто)
Прочитайте файлы INSTALL и README , если они есть в архиве исходного кода. В них может содержаться важная информация о том, как устанавливать и использовать программу.
В большинстве случае для подготовки исходников к сборке потребуется выполнить только одну команду:
hello-2.1.1$ ./configure
Она проверит наличие всех необходимых условий (библиотек и других программ) в Вашей системе, и приготовит исходный код к их использованию. Обратите внимание на символы » ./ » в начале команды. Они указывают, что необходимо выполнить команду configure из текущего каталога, то есть команду configure поставляемую вместе с исходным текстом программы, которую мы собираем.
На этом же этапе можно указать и куда именно надо ставить программу. Хотя в большинстве случаев рекомендуется ставить «самосборные» программы в каталог /usr/local , иногда это невозможно. Так, если у пользователя нет прав администратора, например на общественном компьютере, то установить программу можно только в свой домашний каталог. Чтобы установить программу в домашний каталог нужно указать дополнительный параметр команде configure :
hello-2.1.1$ ./configure —prefix=$HOME
Дополнение: на самом деле, я обычно устанавливаю программы с префиксом /usr/local/stow/название-программы , а после установки использую утилиту stow , чтобы поставить символические ссылки на файлы программы в системных каталогах. Использование утилиты stow позволяет мне потом легко удалить установленную программу, не связываясь при этом с более трудоёмкой сборкой пакетов.
Внимательно читайте что пишется на экране при подготовке исходников. Если всё нормально, то закончится она должна чем-нибудь вроде
config.status: creating Makefile
config.status: creating contrib/Makefile
config.status: creating doc/Makefile
config.status: creating intl/Makefile
.
Если же появляются какие-то сообщения об ошибках, значит чего-то на вашей «кухне» для приготовления этой программы видимо не хватает. Чаще всего какой-нибудь библиотеки. Какой — подскажет вывод программы configure
Шаг 3: make (в печь!)
Если предыдущая стадия закончилась нормально, то теперь можно ставить наш полуфабрикат в печь. То есть запускать процесс сборки программы. Обычно он происходит автоматически и управляется командой make :
hello-2.1.1$ make
Для больших программ этот процесс может занимать довольно много времени. Однако наша программа-пример hello должна собраться быстро.
Если сборка закончилась сообщением вроде этого:
make: *** [all] Ошибка 2
то значит, что-то пошло не так, и сборка не получилась. Однако чаще всего сборка заканчивается без ошибок.
Шаг 4: make install (кушать подано!)
Собственно всё. Пирог можно подавать к столу, а собранную программу устанавливать в систему. Делается это так:
hello-2.1.1$ make install
Если на шаге подготовки исходников Вы выбрали вариант установки в домашний каталог (как я), то не забудьте добавить подкаталог ~/bin в переменную PATH :
$ export PATH=$HOME/bin:$PATH
Можете запускать собранную программу:
$ hello
Здравствуй, мир!
Она пишет на экран «Здравствуй, мир!». Всё ОК.
Надеюсь, что эти инструкции будут понятны даже совсем начинающим пользователям линукс. Мне в своё время не хватало таких инструкций 🙂
P.S. Хочу, однако, заметить, что сборка из исходников несёт с собой целый ряд неудобств. Первое и наиболее существенное из них — удалять такую программу гораздо хлопотнее. В случае с hello это можно сделать с помощью команды
hello-2.1.1$ make uninstall
в каталоге с её исходным кодом, но не всегда этот каталог сохраняется в целостности, да и не все авторы программ должным образом готовят исходные тексты к make uninstall
Поэтому лучше пользоваться готовыми пакетами, поставляемые с Вашим дистрибутивом. Так, чтобы установить программу hello в Debian GNU/Linux достаточно всего одной команды:
Как из исходного кода сделать приложение
Вместо (или же в добавок к) включения в репозиторий двоичных пакетов APK из внешних источников, Вы можете собирать их непосредственно из исходного кода.
Таким образом можно проконтролировать, что приложение правильно собирается, соответствует исходному коду и содержит только свободное ПО. К сожалению, часто бывает, что приложение, поставляемое в виде бинарного APK и заявленное как свободное ПО, оказывается с сюрпризом (или несколькими):
- Исходный код (конкретной версии или даже всех имеющихся версий) недоделанный или вообще отсутствует.
- Из исходного кода невозможно собрать предоставленный APK.
- В так называемом исходном коде есть бинарные файлы непонятного происхождения или файлы с проприетарной лицензией.
Поэтому мы предпочитаем включать в основной репозиторий F-Droid приложения, собранные из исходного кода, хотя иногда и делаем исключения по техническим или историческим причинам.
Обратите внимание: во время сборки приложения из исходного кода вы подписываете его вашим собственным ключом (на устройство Android можно установить только подписанное приложение). Если на устройстве установлена предыдущая версия приложения, подписанная другим ключом, ее придется удалить перед установкой текущей версии (т.е. невозможно обновить версию, если ключи отличаются). Такой подход добавляет пользователям хлопот, потому что при удалении приложения теряются все его данные.
Управлять репозиторием для приложения, собранного из исходного кода, нетрудно (схема действий очень похожа на описанную в главе “Простой репозиторий с бинарными файлами”), с небольшими дополнениями:
- Включайте сведения о сборке (из каких коммитов какие версии собирать) в файлы метаданных.
- Выполняйте команду fdroid build для любых еще не собранных приложений.
- Выполняйте команду fdroid publish для упаковки и подписи любых собранных APK.
Директория с данными приложения (fdroiddata)
Для любых задач вам понадобится как минимум одна директория с каталогом данных самого репозитория. Именно в ней выполняют команды fdroid для управления репозиторием. Можно создать ее с нуля, а можно скопировать уже имеющуюся из основного репозитория F-Droid:
git clone https://gitlab.com/fdroid/fdroiddata.git
Для любых задач и корректной работы инструментов управления необходимо добавить основные настройки в конфигурационный файл config.yml (его нужно создать в директории с каталогом данных репозитория). Для этого скопируйте шаблонный файл ./examples/config.yml из проекта fdroidserver в эту директорию и поправьте согласно содержащимся в нем инструкциям.
После этого вам становятся доступны все инструменты, нужно лишь выполнить команду fdroid . Чтобы посмотреть, какие, можно запустить эту команду без опций.
Список доступных для любой команды параметров можно посмотреть, запустив ее с опцией —help .
fdroid update --help
Подробнее об fdroid build
Если запустить команду fdroid build без дополнительных параметров, она соберет все версии приложения, которых еще нет в директории repo (точнее, в директории unsigned ). Вы можете сделать миллион других вещей ( —help вам в помощь при работе с инструментами fdroid ), а ниже — несколько типичых примеров использования команды с пояснениями:
Чтобы собрать отдельно взятую версию какого-либо приложения, можно выполнить команду:
fdroid build org.fdroid.fdroid:16
Эта команда соберет код для 16 версии (versionCode) клиента F-Droid (versionName 0.25). Большинство инструментов распознает аргументы команды как имена пакетов, что позволяет им работать только с обозначенным набором пакетов.
Если сборка прошла без ошибок, то в директории unsigned появятся два файла:
org.fdroid.fdroid_16.apk org.fdroid.fdroid_16_src.tar.gz
Первый файл — это неподписанный файл приложения (APK). Его необходимо подписать отладочным ключом (debug key) и установить на устройство или эмулятор устройства в тестовых целях. Второй файл — это архив с исходным кодом, из которого собран файл приложения.
Если вы собираетесь опубликовать эти файлы, то необходимо выполнить вот эту команду:
fdroid publish
Архив с исходным кодом будет помещен в директорию repo (каталог, который вы отправляете на веб-сервер). Туда же попадет оптимизированная и подписанная версия приложения (файл APK). Оба файла будут удалены из директории unsigned .
Если сборка происходит в тестовых целях, и результаты не предназначены для публикации в репозитории, то можно указать опцию —test , чтобы помещать результирующие файлы не в директорию unsigned , а в директорию tmp . Можно, конечно, просто-напросто удалить эти файлы из unsigned вручную после окончания сборки, но всегда есть риск, что вы забудете это сделать!
Аналогичным образом можно использовать опцию —force (только вместе с опцией —test !) для принудительной сборки отключенных приложений (обычно их не собирают). Так же принудительно можно собрать версии приложений со включенными в них ELF файлами и несвободными библиотеками (см. scanignore и scandelete в разделе Cборки ).
Если приложение не собралось, логи сборки можно посмотреть в директории logs/. Если после просмотра логов просветления не наступило (а такое бывает!), попробуйте собрать приложение старым добрым способом, шаг за шагом: android update project, ndk-build и ant debug.
Следует помнить, что в репозитории с исходным кодом очень часто включают заранее собранные библиотеки. Если вы планируете выложить приложение в основной репозиторий F-Droid, стоит убедиться, что все предварительные сборки выполнены или согласно инструкциям из файла метаданных, или внушающей доверие третьей стороной.
Запуск fdroid build в исходном коде приложения
fdroid build может использовать файл метаданных из исходного кода приложения (а не из папки metadata/, где сложена гора других приложений). Этот файл метаданных (.fdroid.yml) обязательно должен лежать в корне вашего репозитория с исходниками.
При такой схеме действий можно собрать самую свежую версию приложения, используя весь набор инструментов F-Droid. Выполняйте команду:
fdroid build
Если хочется собрать все существующие версии, добавьте —all .
Прямая установка на устройство
Можно объединить сборку и установку на подключенное устройство (или эмулятор) командой fdroid install . Если сделать это без указания конкретных пакетов (их передают в виде аргументов), то в результате вы получите самые свежие (собранные и подписанные) версии всех имеющихся приложений. Скорей всего, это не то, что сердце просит, поэтому установка прервется. Тем не менее, если хочется именно этого, то защиту от невнимательных можно перешагнуть, указав опцию —all . Сейчас проверок работоспособности приложений для этого режима нет, поэтому даже если файлы из подписанной результирующей директории поменялись, вам об этом никто не скажет.
Создание проекта консольного приложения С++
Обычно программист C++ начинает с создания приложения «Hello, world!», которое запускается из командной строки. Это то, что вы создаете в Visual Studio на этом шаге.
Необходимые компоненты
- Установите и запустите на своем компьютере Visual Studio с рабочей нагрузкой Разработка классических приложений на C++. Если установка еще не выполнена, см. статью Установка поддержки C++ в Visual Studio.
Создание проекта приложения
Visual Studio использует проекты, чтобы упорядочить код для приложения, и решения, чтобы упорядочить проекты. Проект содержит все параметры, конфигурации и правила, используемые для сборки приложения. Он управляет связью между всеми файлами проекта и любыми внешними файлами. Чтобы создать приложение, сначала создайте проект и решение.

- В Visual Studio откройте меню «Файл» и выберите «Создать > проект «, чтобы открыть диалоговое окно «Создать проект «. Выберите шаблон Консольное приложение с тегами C++, Windows и Консоль, а затем нажмите кнопку Далее.
Диалоговое окно создания проекта с выбранным шаблоном консольного приложения. Этот шаблон говорит: запуск кода в терминале Windows. По умолчанию выводит hello world. Содержит теги c++, Windows и консоль.

В диалоговом окне Настроить новый проект в поле Имя проекта введите HelloWorld. Выберите Создать, чтобы создать проект.
Диалоговое окно «Настройка нового проекта» с помощью HelloWorld, введенного в поле «Имя проекта».

Visual Studio создаст проект. Вы можете приступать к добавлению и изменению исходного кода. По умолчанию шаблон консольного приложения предоставляет исходный код для приложения Hello World, как показано ниже.
Отображает новый проект. Файл HelloWorld.cpp открыт, отображая код по умолчанию, включенный в этот шаблон. Этот код состоит из #include iostream и функции main(), содержащей строку: std::cout helloworld.sln файл) в проводник.
Если в диалоговом окне Новый проект в списке Установленные нет элемента Visual C++, возможно, в вашей копии Visual Studio не установлена рабочая нагрузка Разработка классических приложений на C++. Установщик можно запустить прямо из диалогового окна Новый проект. Чтобы снова запустить установщик, щелкните ссылку Открыть Visual Studio Installer. Если в диалоговом окне Контроль учетных записей пользователей запрашиваются разрешения, выберите Да. При необходимости обновите установщик. В установщике должна быть выбрана рабочая нагрузка Разработка классических приложений на C++. Нажмите кнопку ОК, чтобы обновить установку Visual Studio.
Если проект с таким именем уже существует, выберите другое имя для проекта. Можно также удалить существующий проект и повторить попытку. Чтобы удалить существующий проект, удалите папку решения (папку, содержащую helloworld.sln файл) в проводник.
Настройка проекта как консольного приложения: проблемы
Если в списке Свойства конфигурации нет элемента Компоновщик, нажмите кнопку Отмена, чтобы закрыть диалоговое окно Страницы свойств. Перед повторной попыткой убедитесь в том, что в обозревателе решений выбран проект HelloWorld. Не выбирайте решение HelloWorld или другой объект в обозревателе решений.
Раскрывающийся список не открывается в поле свойства Подсистема, пока не будет выбрано свойство. Щелкните поле ввода, чтобы выбрать его. Можно также последовательно переходить по элементам управления в диалоговом окне с помощью клавиши TAB, пока не будет выделено поле Подсистема. Щелкните раскрывающийся список или нажмите клавиши ALT+стрелка вниз, чтобы открыть его.
Добавление файла исходного кода: проблемы
Файлу исходного кода можно спокойно присвоить другое имя. Однако не добавляйте в проект несколько файлов с одинаковым кодом.
Если вы добавили в проект файл неправильного типа, например файл заголовка, удалите его и повторите попытку. Чтобы удалить файл, выберите его в обозревателе решений. Затем нажмите клавишу DELETE.
Добавление кода в файл исходного кода: проблемы
Если вы случайно закрыли окно редактора с файлом исходного кода, его можно легко открыть снова. Чтобы сделать это, дважды щелкните файл HelloWorld.cpp в окне обозревателя решений.
Если в редакторе исходного кода какие-либо элементы подчеркнуты красной волнистой линией, проверьте, соответствуют ли их написание, пунктуация и регистр символов используемым в примере. В коде на C++ регистр имеет важное значение.
Компиляция и установка программ из исходников
Не редко необходимые пакеты можно найти только в виде исходных текстов, в данной статье описывается метод установки пакета из исходных текстов.
Распаковка
Программы обычно распространяются в упакованных архивах, это файлы с расширениями
.tar.gz (иногда .tgz) .tar.bz2
Нужно понимать отличие между архиватором и упаковщиком.
Для архивации директорий и файлов используется программа tar; результатом её работы является файл с расширением .tar. Грубо говоря, это копия файловой системы — директорий и файлов с их атрибутами и правами доступа, помещённая в один файл.
Данный файл по размеру будет чуть больше, чем суммарный размер файлов, которые были архивированы. Поэтому (а может и по другой причине) используют упаковщики — программы, которые позволяют уменьшить размер файла без потери данных.
Программа tar умеет распаковывать, поэтому не нужно вызывать gunzip, а можно просто указать программе tar, что файл нужно cначала распаковать. Например, команда
tar -xvf some_app_name>.tar.gz
сразу распакует и разархивирует. Отличие файлов с расширениями
.tar.gz
.tar.bz2
лишь в том, что использовались разные упаковщики, программа tar определяет метод сжатия автоматически и дополнительных опций в данном случае не требуется.
После распаковки необходимо перейти в полученный каталог, все описываемые ниже команды выполняются в каталоге с исходными текстами пакета.
cd имя_пакета>*
Сборка пакета
Для сборки программ в GNU/Linux используется (в основном) программа make, которая запускает инструкции из Makefile, но поскольку дистрибутивов GNU/Linux много, и они все разные, то для того чтобы собрать программу, нужно для каждого дистрибутива отдельно прописывать пути,где какие лежат библиотеки и заголовочные файлы. Программисты не могут изучать каждый дистрибутив и для каждого отдельно создавать Makefile. Поэтому придумали конфигураторы, которые «изучают» систему, и в соответствии с полученными знаниями создают Makefile. Но на конфигураторе они не остановились и придумали конфигураторы конфигураторов
…на этом они остановились ![]()
Для сборки нам нужны компиляторы: они прописаны в зависимостях пакета build-essential, так что достаточно установить его со всеми зависимостями. Ещё нужны autoconf и automake.
Итак, чтобы собрать что-то из исходников, нужно сначала собрать конфигуратор; как собрать конфигуратор, описано в файле configure.in. Для сборки конфигуратора необходимо выполнить
./bootstrap
./autogen.sh
Если таких скриптов в архиве не оказалось, то можно выполнить последовательно следующие команды:
aclocal autoheader automake --gnu --add-missing --copy --foreign autoconf -f -Wall
Все эти команды используют файл configure.in. После выполнения этих команд создастся файл configure. После этого необходимо запустить конфигуратор для проверки наличия всех зависимостей, а также установки дополнительных опций сборки (если возможно) и просмотра результата установки (опционально- может не быть)
./configure
Конфигуратор построит Makefile основываясь на полученных знаниях и файле makefile.am. Можно передать конфигуратору опции, предусмотренные в исходниках программы, которые позволяют включать/отключать те или иные возможности программы, обычно узнать о них можно командой
./configure --help
Также есть набор стандартных опций, вроде
--prefix=
, которая указывает, какой каталог использовать для установки. Для Ubuntu обычно
--prefix=/usr
--prefix=/usr/local
БЕЗ слеша в конце! Теперь можно запустить процесс сборки самой программы командой
make
Для сборки достаточно привелегий обычного пользователя. Окончанием сборки можно считать момент, когда команды в консоли перестанут «беспорядочно» выполняться и не будет слова error. Теперь всё скомпилировано и готово для установки.
Установка
Усилия потраченные на Правильную установку в последствии с лихвой окупятся в случае удаления или обновления устанавливаемого программного обеспечения.
Правильная установка(Вариант №1)
Установка при помощи утилиты checkinstall. Для установки выполните
sudo apt-get install checkinstall
Минус данного способа: checkinstall понимает не все исходники, поскольку автор программы может написать особые скрипты по установке и checkinstall их не поймёт.
Для создания и установки deb-пакета необходимо выполнить
sudo checkinstall
Правильная установка(Вариант №2)
Быстрое создание deb-пакета «вручную».
Основное отличие от предыдущего способа заключается в том, что в данном случае вы создаете пакет вручную и отслеживаете все вносимые изменения. Так же этот способ подойдет вам, если исходники не поддерживают сборку пакета с checkinstall.
Производим установку во временную директорию, где получаем весь набор устанавливаемых файлов:
fakeroot make install DESTDIR=`pwd`/tempinstall
Создадим в «корне пакета» директорию DEBIAN и сложим в DEBIAN/conffiles список всех файлов, которые должны попасть в /etc:
сd tempinstall mkdir DEBIAN find etc | sed "s/^/\//" > DEBIAN/conffiles
После чего создаём файл DEBIAN/control следующего содержания:
Package: имя_пакета Version: 1.2.3 Architecture: amd64/i386/armel/all Maintainer: Можете вписать своё имя, можете дребедень, но если оставить пустым, то dpkg будет ругаться Depends: Тут можно вписать список пакетов через запятую. Priority: optional Description: Тоже надо что-нибудь вписать, чтобы не кидало предупреждения
При необходимости там же можно создать скрипты preinst, postinst, prerm и postrm.
Создаем deb-пакет, для чего выполняем:
dpkg -b tempinstall
Получаем на выходе tempinstall.deb, который и устанавливаем
sudo dpkg -i tempinstall.deb