====== пакет ПО ======
//Пакет ПО// - это архив, содержащий ПО (файлы, конфиги, библиотеки и тп) и инструкции/метаданные для его установки, обновления и удаления. Распространены несколько форматов пакетов: [[deb_pkg|DEB]] и [[rpm_pkg|RPM]].
//Бинарный пакет ПО// - пакет, содержащий не исхдные коды и инструкии для их сборки, а уже готовый билд.
//Исходные пакеты// (//src-пакет//) - пакет, содержащий исходные коды и инструкции по сборке и установке программы.
//Метапакеты// - пакеты, которые сами по себе не содержат программ, но служат для установки других пакетов или зависимостей.
Помимо классических пакетов ПО есть более современные технологии упаковки ПО:
* **Flatpak**: Позволяет запускать приложения в изолированных контейнерах, что обеспечивает большую безопасность и совместимость между различными дистрибутивами.
* **Snap**: Разработан компанией Canonical, Snap также использует контейнеризацию для обеспечения изоляции приложений и их зависимостей, что позволяет легко устанавливать и обновлять программы.
* **AppImage**: Это формат, который позволяет запускать приложения без необходимости установки. AppImage упаковывает все необходимые зависимости в один файл, что делает его переносимым и удобным для использования на различных системах.
===== О назначениях директорий =====
(в контексте префиксов (PREFIX))
(в соответствии с "Filesystem Hierarchy Standard" (см ''man 7 hier''))
* ''/bin'' — это бинарники (т. е. испоняемые файлы), важные для работы системы на ранних стадиях загрузки.
* ''/sbin'' — это то же самое с тем отличием, что эти бинарники обычно может запускать только root.
* ''/lib'' — бинарные файлы библиотек, нужные для программ из ''/bin'' и ''/sbin''
* ''/usr'' — "//вторая иерархия файлов//", т. е. это как бы "ещё один ''/''"
* ''/usr/bin'' — то же, что ''/bin'', но на этот раз это бинарники, некритичные для загрузки
* ''/usr/sbin'' — то же, что ''/sbin'', но опять-таки, некритичные для загрузки
* ''/usr/lib'' — бинарные файлы библиотек, которые не нужны для программ из ''/bin'' и ''/sbin''
* ''/usr/include'' — хедеры библиотек
* ''/usr/local'' — "//третья иерархия файлов//", она опять содержит ''/usr/local/bin'', ''/usr/local/sbin'', ''/usr/local/lib'' и ''/usr/local/include'', на этот раз эти каталоги предназначены для «локального администратора». Что это значит? Это значит, что (в случае дистрибутивов GNU/Linux с пакетным менеджером) каталоги, о которых речь шла до этого, находятся под контролем пакетного менеджера. А вот каталоги внутри ''/usr/local'' находятся в распоряжении «локального администратора», т. е. вас. Если вы хотите поставить что-то из соурcов, в обход менеджера пакетов, то можно поставить туда.
Подробнее об иерархиях файлов (префиксах) далее.
==== Подробнее о прификсах ====
Префикс ''/''\\
Вряд ли когда-нибудь вам придётся его выбирать. Он используется для программ, критичных для ранних стадий загрузки ОС (т. е. критичные элементы для загрузки находятся в ''/bin'', ''/lib'' и т. д.) (впрочем, даже если вам нужно установить программу в ''/'', её сперва устанавливают в /usr, т. е. собирают и устанавливают с префиксом ''/usr'', а потом перемещают необходимое в ''/'' \[т. е. перемещают из /usr/bin в /bin, скажем], во всяком случае именно так поступают авторы Linux From Scratch 7.10 с пакетом, скажем, bash).
Префикс ''/usr''\\
Стандартный префикс, используемый обычно для программ, установленных через менеджер пакетов. То есть если вы установили программу через менеджер пакетов, она ведёт себя так, словно она собрана и установлена на вашей системе с префиксом ''/usr''. Самому устанавливать пакеты с префиксом ''/usr'' нельзя.
Префикс ''/usr/local''\\
Отличный префикс для установки туда программ самостоятельно. Хорош тем, что ''/usr/local/bin'' есть в дефолтном PATH (во всяком случае в дебиане). То есть сразу после установки программы вы сможете просто запускать программу по названию. Потому что бинарник лежит в ''/usr/local/bin'', а ''/usr/local/bin'' есть в PATH.
Префиксы, соответствующие домашним каталогам (''/home/username'')\\
Советую в случае, когда хочется поставить «только для себя», т. е. только для одного юзера. Или когда нет прав root.
При любой установке пакетов в один префикс (что почти неизбежно), там все программы лежат смешанно. Вот допустим, вы установили библиотеку "foo", а потом библиотеку "bar". Обе в этот prefix. Тогда дерево может выглядеть так (в совсем упрощённом виде):
/usr/local/include/foo.h
/usr/local/include/bar.h
/usr/local/lib/libfoo.so
/usr/local/lib/libbar.so
Всё смешано. Нет единой папки, которая бы содержала «всё, связанное с foo» и другой папки, которая бы содержала «всё, связанное с bar». (GoboLinux решает эту проблему)
Префиксы вида ''/opt/XXX''. Папку /opt предполагается использовать следующим образом: в ней нужно создавать подкаталоги, называть их названиями пакетов и использовать эти подкаталоги как префиксы. При таком подходе указанная выше проблема сваливания в кучу (если считать это проблемой) исчезает. Каждый пакет будет установлен в свой каталог. Приведённый выше пример с "foo" и "bar" будет выглядеть так (я бы посоветовал в названии подкаталогов в ''/opt'' указывать ещё и номер версии):
/opt/foo-1.0/include/foo.h
/opt/foo-1.0/lib/libfoo.so
/opt/bar-2.0/include/bar.h
/opt/bar-2.0/lib/libbar.so
Недостаток у такого решения тоже есть. Вам придётся самому добавлять все эти бесчисленные каталоги ''/opt/foo-1.0/bin'' (для каждого пакета) в PATH
/*
%%
## Создание простого пакета
(https://habr.com/ru/articles/321468/)
Сборка будет при помощи [Make](Make.md). Хотя можно использовать и более высокоуровневые программы, генерирующий конфиги для make, такие как [Cmake](Cmake.md) и autotools, но для примера использую только make.
Исходный текст программы:
''''''c
// hello.c
#include
int main (void){
printf ("Hello, world!\n");
return 0;
}
''''''
и Makefile:
''''''makefile
# это и есть prefix (о нём ниже)
# В качестве дефолтного префикса у нас указан /usr/local
# (пользователь сможет его переопределить)
PREFIX=/usr/local
#компилятор, в данном случаи это cc. cc - анда для запуска компилятора по умолчанию в данной системе.
CC=cc
#флаги компиляции
CFLAGS=
all: hello
hello: hello.c
$(CC) $(CFLAGS) -o hello hello.c
install: all
mkdir -p $(PREFIX)/bin
#install - почти как cp, но использовать стоит install
install hello $(PREFIX)/bin/№
''''''
Допустим, пользователь скачал пакет. Далее его нужно собрать (тоесть скомпилировать бинарники) и установить (скопировать бинарники в место окончательного хранения в системе).
> [!tip]
> То есть смотрите. Вы залогинены под юзером user. Ваш домашний каталог ''/home/user''. Вы скачали пакет, распаковали его, скажем в ''/home/user/Desktop/foo''. Далее вы его собрали. Собрали в этой же папке, ''/home/user/Desktop/foo''. Либо, если речь идёт об out of tree build, вы создали ещё одну папку ''/home/user/Desktop/foo-build'' и собрали в ней. Теперь, после сборки вы решаете установить её в ''/usr/local''. Вот тут уже вам нужны права root. Вы при помощи sudo устанавливаете эту программу в ''/usr/local''.
Теперь по поводу prefix. Когда вы устанавливаете какой-нибудь пакет, вы должны указать ему так называемый prefix, т. е. каталог, в который всё будет установлено. В этом каталоге будет создан подкаталог bin, в него будет установлены бинарники, будет создан подкаталог lib, туда будут установлены бинарные файлы библиотек, и т. д.
То есть, например, вы устанавливаете пакет, указывая ему prefix ''/usr/local''. Тогда бинарники пойдут в ''/usr/local/bin'', бинарные файлы библиотек — в ''/usr/local/lib'' и так далее.
Пример makefile для cpp кода:
''''''makefile
PREFIX=/usr/local
CXX=c++
CXXFLAGS=
all: hello
hello: hello.cpp
$(CXX) $(CXXFLAGS) -o hello hello.cpp
install: all
mkdir -p $(PREFIX)/bin
install hello $(PREFIX)/bin/
''''''
___
*/