Команда make позволяет задействовать одноименную утилиту, предназначенную для компиляции программного обеспечения из исходных кодов. Данная команда востребована главным образом программистами и системными администраторами, но может оказаться полезной и для обычных пользователей, желающих собрать то или иное программное обеспечение из исходных кодов вместо установки бинарных пакетов. Рассматриваемая утилита использует файлы описания целей сборки под названием Makefile и автоматически создает список файлов исходного кода, которые должны быть скомпилированы, экономя тем самым время программистов, постоянно модифицирующих исходный код своих продуктов. Поддерживаются любые компиляторы, которые могут запускаться с помощью терминала, причем в рамках файлов описания целей сборки могут описываться цели, предназначенные для установки ПО (обычно называются «install») и очистки окружения сборки (обычно называются «clean»). Нередко файлы Makefile генерируются автоматически, причем в таких случаях перед компиляцией ПО необходимо исполнять сценарий командной оболочки configure.sh, осуществляющий их генерацию и настройку сборочного окружения.
Linux: сборка пакетов из исходников
Базовый синтаксис команды выглядит следующим образом:
$ make [параметры] [цель] .
Команда принимает названия целей в качестве аргументов, причем в случае отсутствия названия цели считается, что нужно использовать цель «all», обычно включающую все остальные цели. Для описания целей используются специальные файлы с именами Makefile, причем данные файлы имеют достаточно строгий синтаксис (к примеру, в них запрещается смешивать символы табуляции и пробела). Что касается параметров, то наиболее важными являются параметр -f для указания нестандартного имени файла описания целей, параметр -C для смены директории перед сборкой ПО, параметр -d для вывода отладочных сообщений, параметр -e для изменения переменных окружения, а также параметр -B для безусловной сборки всех целей.
Примеры использования
В качестве примера будет использоваться примитивная программа на языке C, выводящая сообщение «It works!». Она будет состоять из трех файлов исходного кода и файла с описанием целей сборки. Файл с описанием целей сборки создан вручную и не требует предварительной конфигурации.
Содержимое файла main.c:
int main(int argc, char **argv)
{
core();
return 0;
}
Содержимое файла core.h:
#ifndef _CORE_H_
#define _CORE_H_
Содержимое файла core.c:
void core(void)
{
printf(«It works!n»);
}
Содержимое файла Makefile:
GCC = gcc -g -Wall
OBJ = core.o main.o
test: $(OBJ)
$(GCC) $(LDFLAGS) $(OBJ) -o test
clean:
rm -f *.o
rm -f test
Сборка программы из исходных кодов
Для сборки программы достаточно выполнить команду make без каких-либо параметров:
$ make
gcc -g -Wall -c core.c -o core.o
gcc -g -Wall -c main.c -o main.o
gcc -g -Wall core.o main.o -o test
Компиляция и установка программ из исходников в Linux. htop, make, configure
$ ./test
It works!
Очевидно, что программа была собрана и корректно функционирует.
Сборка программы с отладкой системы сборки
Если вы желаете отладить систему сборки, вы можете использовать параметр -d команды make:
$ make -d
GNU Make 4.3
Эта программа собрана для x86_64-pc-linux-gnu
Copyright (C) 1988-2020 Free Software Foundation, Inc.
Лицензия GPLv3+: GNU GPL версии 3 или новее
Это свободное программное обеспечение: вы можете свободно изменять его и
распространять. НЕТ НИКАКИХ ГАРАНТИЙ вне пределов, допустимых законом.
Чтение make-файлов.
Чтение make-файла «Makefile».
Обновление make-файлов.
Обработка целевого файла «Makefile».
Поиск неявного правила для «Makefile».
Попытка применения правила с образцом «Makefile».
Попытка применения неявной зависимости «Makefile.o».
Попытка применения правила с образцом «Makefile».
Попытка применения неявной зависимости «Makefile.c».
.
Целевой файл «test» успешно пересоздан.
Обновление целей, от которых зависит целевой файл «all», завершено.
Необходимо пересобрать цель «all».
Целевой файл «all» успешно пересоздан.
$ ./test
It works!
Программа также успешно собрана и корректно функционирует, но в данном случае выводится огромный объем отладочной информации, относящейся к работе утилиты make.
Сборка отдельных целей
Для сборки отдельной цели следует передать названием этой цели команде make. В нашем случае подходящей целью является цель с названием «test»:
$ make test
gcc -g -Wall -c core.c -o core.o
gcc -g -Wall -c main.c -o main.o
gcc -g -Wall core.o main.o -o test
$ ./test
It works!
И снова программа успешно собрана, причем в нашем случае цель «all» автоматически подразумевает сборку цели «test», поэтому никаких отличий с использованием команды make без параметров не будет наблюдаться.
Для очистки рабочего окружения следует инициировать сборку цели «clean»:
$ make clean
rm -f *.o
rm -f test
В результате будут удалены объектные файлы и результирующий исполняемый файл программы.
Сборка программы в заданной директории
Для сборки программы в заданной директории следует использовать параметр -C и путь к этой директории. Для демонстрации перейдем в директорию на уровень выше и попробуем пересобрать программу.
$ cd ..
$ make -C ./test/
make: вход в каталог «/home/alex/code/test»
gcc -g -Wall -c core.c -o core.o
gcc -g -Wall -c main.c -o main.o
gcc -g -Wall core.o main.o -o test
make: выход из каталога «/home/alex/code/test»
$ ./test/test
It works!
Разумеется, и в этом случае программа была успешно собрана.
Сборка программы с нестандартным именем файла описания целей сборки
Если программа поставляется с файлом описания целей сборки с нестандартным именем (обычно разработчики используют различные суффиксы для добавления поддержки различных компиляторов или платформ), вы можете использовать параметр -f и передать утилите make имя этого файла. В качестве примера переименуем файл Makefile в Makefile.gcc:
$ mv Makefile Makefile.gcc
$ make
make: *** Не заданы цели и не найден make-файл. Останов.
И в этом случае сборка не будет представлять каких-либо сложностей:
$ make -f Makefile.gcc
gcc -g -Wall -c core.c -o core.o
gcc -g -Wall -c main.c -o main.o
gcc -g -Wall core.o main.o -o test
$ ./test
It works!
Таким образом вы можете использовать несколько файлов описания целей сборки в рамках одного проекта.
Источник: linux-faq.ru
Блог начинающего линуксоида.
Бывают ситуации, когда вам нужна самая свежая версия программы, но её нет в репозитории вашего дистрибутива. Или эту программу вообще туда не добавляют по каким-то причинам. Вариантов получить эту программу тут несколько, один из них — собрать программу из исходного кода, непосредственно под ваш дистрибутив. Разумеется речь идёт о программах с открытым исходным кодом 🙂
Сборка (компиляция) программы — это превращение её исходного кода, написанного на каком-нибудь компилируемом языке программирования (например C++), который понятен программисту, в бинарный код (последовательность нулей и единиц), который понятен центральному процессору компьютера. Не все языки программирования являются компилируемыми.
Например код на языке Python, можно запускать сразу, без перевода его в бинарный код (хотя и это возможно). Для сборки программы, желательно иметь достаточно мощный, и желательно многоядерный процессор. Ни в коем случае не компилируйте программы на ноутбуках! Это крайне негативно скажется на продолжительности их жизни (они не рассчитаны на такие нагрузки, если конечно у вас не игровой ноутбук).
В сборке программы из исходного кода нет ничего сложного. Главное помнить одно правило: в пакетном дистрибутиве ни в коем случае нельзя использовать метод make install. Иначе в будущем получите большую такую кучу проблем. Когда поймёте, что хотели удалить программу (поставленную таким образом), а пакетный менеджер о ней не знает.
А сама программа состоит из нескольких сотен файлов, разбросанных по разным каталогам. Страшно? Поэтому в пакетных дистрибутивах, программу нужно собирать в, собственно, пакет. Тогда её можно будет без проблем удалить, в случае чего. Я написал это потому что многие руководства по компиляции программ в Linux, которые мне попадались, описывают именно make install. Удалить программу, установленную таким образом можно только в двух случаях:
- если у вас остался архив с её кодом (тогда можно выполнить make uninstall);
- если исходный код программы поддерживает это.
Отмечу, что не каждую программу можно собрать одним и тем же способом. Поэтому всегда нужно читать инструкцию по сборке, которая есть в архиве с исходным кодом. Бывает что разработчик положил туда скрипт, который при запуске делает всё сам (собирает и устанавливает, но мы помним про make install), или для сборки может не подойти make, а нужна другая система сборки. Также для сборки программы, необходимо будет установить нужные для неё сборочные зависимости (это пакеты с префиксом -dev). Для того чтобы быстро собрать программу в пакет, дабы иметь возможность без проблем её установить или удалить, существует утилита, под названием checkinstall. Она позволит создать родной для системы пакет (deb или rpm), что позволит использовать штатный пакетный менеджер для её установки/удаления
Для сборки программ в GNU/Linux используется (в основном) программа make, которая запускает инструкции из Makefile, но поскольку дистрибутивов GNU/Linux много, и они все разные, то для того чтобы собрать программу, нужно для каждого дистрибутива отдельно прописывать пути, где какие лежат библиотеки и заголовочные файлы. Программисты не могут изучать каждый дистрибутив и для каждого отдельно создавать Makefile.
Поэтому придумали конфигураторы, которые «изучают» систему, и в соответствии с полученными знаниями создают Makefile. Для сборки нам нужны компиляторы: они прописаны в зависимостях пакета build-essential, так что достаточно установить его со всеми зависимостями. Ещё нужны autoconf и automake. Если программа написана на Qt, то обычно она собирается либо командой qmake (естественно она должна быть установлена), либо путём открытия файла проекта в какой-нибудь IDE (обычно Qt Creator) и сборки в ней.
Сперва нужно подготовить систему. Для этого установим необходимый набор инструментов:
sudo apt install build-essential gcc devscripts git fakeroot automake autoconf
Получить исходный код можно разными способами. Скачать из интернета (например с сайта разработчика), склонировать репозиторий с исходным кодом и так далее. В первом случае, в общем-то, всё ясно. Во втором: предположим, что программа лежит в git-репозитории (на GitHub, например). Мы можем как зайти в этот репозиторий и скачать оттуда архив с кодом
так и скопировать весь репозиторий себе (как это делают разработчики). Для примера возьмём программу mgba. Это эмулятор игровой консоли Nintendo GameBoy. Адрес репозитория здесь. Копируем его себе:
git clone https://github.com/mgba-emu/mgba.git
В домашнем каталоге у вас появится директория с его исходным кодом. На той же странице программы, есть инструкция по сборке.
Внимательно читаем. Открываем терминал и переходим в каталог с исходным кодом:
И собираем программу:
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr ..
make
sudo checkinstall -D
Будут запрошены кое-какие данные (имя пакета, версия и так далее. Желательно заполнить все поля). После сборки, в директории выше (то есть в mgba), появится deb-пакет с программой. Теперь его можно просто установить двойным кликом или командой sudo dpkg -i имяпакета.deb . Если во время сборки у вас начали появляться сообщения об ошибках — внимательно их читайте. Возможно не хватает каких-либо сборочных зависимостей.
Возьмём немного другой пример, в котором используется конфигуратор. В таком случае, в директории с исходным кодом, располагаются скрипты: autogen.sh, configure и подобные. Autogen.sh генерирует скрипт configure, с помощью которого уже можно сконфигурировать программу перед сборкой (да да, конфигуратор конфигуратора). Как всегда не забываем читать инструкцию по сборке той или иной программы. Предположим, что в архиве есть скрипт autogen.sh . Выполним его:
После выполнения, должен появиться файл configure. Чтобы посмотреть с какими параметрами можно собрать программу, введите:
Просмотрите все доступные параметры. Обычно, это могут быть поддержки различных плагинов, сборка с альтернативным интерфейсом, даже сборка под другую процессорную архитектуру. Допустим программа использует интерфейс, написанный на GTK+ 2, но имеет альтернативный на GTK+ 3. Тогда конфигурация программы будет выглядеть так:
Всё подробно будет описано в инструкции. Есть некоторый набор стандартный опций (после ввода ./configure —help, они пишутся вначале), таких как указание пути для установки:
После запуска configure и успешного конфигурирования кода, можно запустить сборку:
Вот и всё. Как видите, здесь нет ничего сложного. Хотя, не стану скрывать, бывает так, что разработчик не озаботился качественной инструкцией по сборке. Но такое бывает редко. Хочу также обратить ваше внимание на следующее: прибегайте к сборке программы из исходников только в крайнем случае.
Если вы используете Ubuntu LTS, то посмотрите (при помощи гугла), нет ли необходимой вам программы (или свежей версии) в более свежем выпуске Ubuntu. Или возможно есть PPA-репозиторий, где всегда есть свежие версии этой программы. В Debian с этим сложнее, но зачастую можно взять более свежую версию программы из ветки testing или даже unstable, и она нормально установится и будет работать.
И только убедившись, что больше вариантов нет — прибегайте к компиляции. В следующий раз я напишу о профессиональном способе сборки deb-пакетов, каким пользуюсь я (и другие разработчики, собирающие пакеты для Debian-based систем). Если что-то упустил — пишите в комментариях.
Источник: linuxoidblog.blogspot.com
Linux как собрать программу из исходников
Скорее всего в tar.gz/tar.bz2 лежит не программа, а ее исходники (иногда исходники с собранной программой). Прежде чем ее ставить, нам необходимо ее собрать. Для этого нужно выполнить (не бросайтесь сразу это делать):
Если после любого из пунктов возникли сообщения об ошибках, значит не все вышло так, как хотелось. Можно попробовать `./configure —help` для вывода опций настройки и попробовать использовать некоторые из них.
Поскольку при таком способе установки информация о том, что ставилось и куда, остается только в памяти админа (которая частенько еще какая временная :), лучше для контроля этого процесса использовать checkinstall — http://checkinstall.izto.org, или похожие программы (почему выше и мы говорили не выполнять команды сразу). После того, как вы ее установите (прочитав документацию) и настроите ее конфиг, на этапе установки программного обеспечения вместо sudo make install будете писать sudo checkinstall.
Checkinstall соберет «настоящий» пакет для указанной (tgz, rpm и deb в зависимости от настроек), установит его в систему и поместит в указанный в конфигурационном файле каталог (удобно для централизованного обновления нескольких машин). Удаление установленных таким образом программ осуществляется стандартными средствами дистрибутива, например, removepkg для Slackware. Также будет полезным прочитать о том, как уменьшить размер бинарных файлов. Если вы пренебрегли нашим советом и собрали и поставили программу не используя специальных утилит (или своего менеджера пакетов), тогда нужно заново распаковать исходники (ведь вы после сборки наверняка удалили папку, в которой собирали программу), сконфигурировать ее с теми же параметрами (напрягайте память), но вместо make install сделать make uninstall . Если повезет, то все удалится.
A: Это неоднозначный вопрос. Дело в том, что если вы просто собрали программу с помощью
то все зависит лишь от того, позаботился ли автор об удалении. Для того, чтобы удалить программу, нужно зайти в каталог ее исходников, из которого она собиралась, и сделать make uninstall. Если каталог не сохранился, распакуйте исходники, сделайте ./configure с теми же параметрами, с которыми собирали программу, и выполните make uninstall . А чтобы не полагаться на приличия автора, рекомендуется посмотреть предыдущий вопрос, Внимание: в rpm-based дистрибутивах собирайте программы из srpm или с использованием spec-файлов (для создания rpm). Не превращайте свою систему в помойку из программ.
По умолчанию программы собираются с отладочной информацией. Это, соответственно, увеличивает их размер, но на быстродействие и занимаемую оперативную память не влияет. Можно собрать программу без отладочной информации, указав
./configure —disable-debug
Удалить секции с отладочной информацией из уже собранной программы можно командой
Посмотреть, что вышло можно командой
она напишет — stripped или not stripped. Можно сделать более правильно:
find . | xargs file | grep «executable» | grep ELF | cut -f 1 -d : | xargs strip —strip-unneeded find . | xargs file | grep «shared object» | grep ELF | cut -f 1 -d : | xargs strip —strip-unneeded
Чтобы не делать изменения в рабочих макросах, создается файл /etc/rpm/macros , лучше в него все прописать:
%debug_package % %_missing_doc_files_terminate_build 0 %_unpackaged_files_terminate_build 0 %__os_install_post /usr/lib/rpm/redhat/brp-compress /usr/lib/rpm/redhat/brp-strip % /usr/lib/rpm/redhat/brp-strip-shared % /usr/lib/rpm/redhat/brp-strip-static-archive % /usr/lib/rpm/redhat/brp-strip-comment-note % % % В будущем при смене версии rpm, не придется ничего править в самих макросах из rpm.
Для сборки нужны заголовочные файлы(headers). Во многих дистрибутивах библиотеки(программы) поделены на два пакета — xxx и xxx-devel(rh-based) и xxx-dev(debian). Соответственно нужно поставить xxx-devel (xxx-dev). Примечание — в пакетах Slackware всё вместе (ну, кроме xfree86-devel).
Для redhat < 8.0, ASP Linux < 9 и Mandrake —
Для redhat > 8.0, Fedora Core и ASP Linux = 9 —
Для Alt Linux:
Если вместо ожидаемого результата, на экран выводится список параметров командной строки, нужно установить rpm-devel. Ну а если все получилось, то пакеты будут лежать в /usr/src/название_дистрибутива/BUILD/название_архитектуры_процессора, например
/usr/src/redhat/BUILD/i386.
Читайте статью — фактически это пошаговое руководство. http://gazette.lrn.ru/lg81/vikas.html
Поскольку у меня (jackill) Fedora Core, то рассматривать мы будем именно ядра Fedora Core. Для других дистрибутивов чуть-чуть будут отличаться пути в /usr/src и, возможно, названия spec-файлов.