Примеры сборки пакетов с исходными текстами на Python, Bash, С++
Для примера сборки пакетов, будут использоваться простые программы на языках C++, Python, Bash. Программы выводят строку Hello World! в терминал.
Информация
Каждый проект можно скачать из GitHub репозитория.
Исходный код
Лицензия
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.bello.sh (Bash)
#!/bin/bash
printf "Hello World\n"pello.py (Python 3)
#!/usr/bin/env python
print("Hello World")cello.cpp (C++)
#include <iostream>
int main() {
std::cout << "Hello, World!" << std::endl;
return 0;
}Подготовка пространства
Создайте дерево каталогов, вручную или командой rpmdev-setuptree.
$ rpmdev-setuptree$ mkdir RPM
$ cd RPM
$ mkdir BUILD RPMS SOURCES SPECS SRPMSОсторожно
Если была использована утилита rpmdev-setuptree, обратите внимание на файл ~/home/.rpmmacros
Далее необходимо подготовить каталоги для каждого из трёх проектов:
$ mkdir bello cello pelloКаждый каталог должен содержать в себе исходный код соответствующей программы, лицензию и Spec-файл.
Информация
Следующие действия идентичны для всех трёх каталогов. В примере использован bello.sh
Инициализация git-репозитория:
$ git initСоздайте файлы bello.sh, bello.spec и LICENSE.
$ touch bello.sh bello.spec LICENSEЗапишите в файл bello.sh код скрипта, а в файл LICENSE - лицензию.
Подсказка
Bash (bello.sh) и Python 3 (pello.py) являются скриптовыми языками, поэтому их файлы должны иметь право на исполнение. Добавьте бит исполняемости:
chmod +x bello.shСоздайте подкаталог .gear, перейдите в него и создайте файл rules:
$ mkdir .gear
$ cd .gear
$ touch rulesИтоговое наполнение каталога
$ ls -a
bello
bello.spec
.gear
.git
LICENSESpec-файл и правила Gear
Описание Makefile для C++
В каталоге cello создайте Makefile (файл инструкций для программы Make, которая собирает/компилирует данный проект):
$ touch MakefileСодержание Makefile:
cello:
gcc -g -o cello cello.c
clean:
rm cello
install:
mkdir -p $(DESTDIR)/usr/bin
install -m 0755 cello $(DESTDIR)/usr/bin/celloПравила Gear
Заполните файл .gear/rules:
tar: .Информация
Строка указывает, что проект будет упакован в tar-архив.
Spec-файл
В заголовке или шапке Spec-файла находятся директивы Name, Version, Release, Summary, License, Group, BuildArch, BuildRequires и Source0. Заполните эти директивы:
Name: bello
Version: 0.1.1
Release: alt1
Summary: Hello World example implemented in Bash
Group: Other
License: GPLv3+
URL: https://github.com/altlinux/alt-packaging-guide/tree/master/example-code
Source0: %{name}-%{version}.tar
Requires: bash
BuildArch: noarchName: pello
Version: 0.1.1
Release: alt1
Summary: Hello World example implemented in Python 3
Group: Other
License: GPLv3+
URL: https://github.com/altlinux/alt-packaging-guide/tree/master/example-code
Source0: %{name}-%{version}.tar
Requires: python3
BuildArch: noarchName: cello
Version: 0.1.1
Release: alt1
Summary: Hello World example implemented in C++
Group: Other
License: GPLv3+
URL: https://github.com/altlinux/alt-packaging-guide/tree/master/example-code
Source0: %{name}-%{version}.tar
BuildRequires: gcc-g++
BuildRequires: makeИнформация
- Стандартная схема
Name-Version-Release, содержащая в себе имя пакета, его версию и релиз сборки; Summaryвключает в себя краткое описание пакета;License— лицензия, под которой выпускается программа ( данном случае - GPLv3);Group— категория, к которой относится пакет. Так как это тестовый пакет для примера, выставим группуOther;BuildRequiresиRequires— пакеты, необходимые для сборки и запуска готового пакет соответственно. Необходимые пакеты:Requires:- Bash:
bash; - Python 3:
python3;
- Bash:
BuildRequires:- C++:
gcc-g++,make;
- C++:
Source0— путь к архиву с исходниками (%name-%version.tar).BuildArch— целевая архитектура (если не указано, то берётся архитектура машины, на которой собран пакет)
Заполните %description и %prep:
%description
The long-tail description for our Hello World Example implemented in Bash.
%prep
%setup -q%description
The long-tail description for our Hello World Example implemented in Python 3.
%prep
%setup -q
# fix python shebang for scripts
grep -R '^#!/usr/bin/\(env[[:space:]]\+\)\?python' . | cut -d: -f1 |
while read f; do
sed -E -i '1 s@^(#![[:space:]]*)%_bindir/(env[[:space:]]+)?python$@\1%__python3@' "$f"
done%description
The long-tail description for our Hello World Example implemented in C++.
%prep
%setup -qПримечание для Python 3
Часть кода после комментария fix python shebang for scripts это набор команд для обновления шибанга (первой строки в исполняемом файле, которая указывает на интерпретатор, с помощью которого следует выполнять скрипт) в Python-скриптах. В частности, он заменяет старый шибанг #!/usr/bin/python на более современный и более гибкий вариант с использованием env #!/usr/bin/env python.
grep -R '^#!/usr/bin/\(env[[:space:]]\+\)\?python' .— ищет строки, начинающиеся с шибанга, где указан путь к интерпретатору. Регулярное выражение проверяет шибанг с использованием env для гибкой настройки пути к интерпретатору Python.cut -d: -f1— используется для обрезания вывода, чтобы получить только имена файлов, содержащих старый шибанг.while read f; do ... done— цикл, выполняющий команды внутри блока do для каждого из найденных файлов.sed -E -i '1 s@^(#![[:space:]]*)%_bindir/(env[[:space:]]+)?python$@\1%__python3@' "$f"— изменение первой строки файла. Регулярное выражение заменяет старый шибанг на новый.
Информация
- В секции
%descriptionнаходится краткое описание программы; - Секция
%prepотвечает за подготовку программы к сборке; - Макрос
%setupраспаковывает исходный код перед компиляцией.
В секции %install описаны инструкции, как установить файлы пакета в систему конечного пользователя:
%install
mkdir -p %buildroot%_bindir
install -m 0755 %name %buildroot%_bindir/%name%install
mkdir -p %buildroot%_bindir
mkdir -p %buildroot%_libexecdir/%name
cat > %buildroot%_bindir/%name <<-EOF
#!/bin/bash
/usr/bin/python3 %_libexecdir%name/__pycache__/%name.cpython-$(echo %__python3_version | sed 's/\.//').pyc
EOF
chmod 0755 %buildroot%_bindir/%name
install -m 0644 %name.py %buildroot%_libexecdir/%name/%build
%make
%install
%makeinstall_stdВместо того, чтобы писать пути установки файлов вручную, будем использовать предопределённые макросы:
%buildroot%_bindir будет раскрываться в путь /usr/bin. По этому пути будет создан каталог с именем пакета, в который будет помещён файл скрипт с правами доступа 755.
Примечание для Python 3
Здесь создаются две директории в %buildroot, которая представляет собой временный корень файловой системы для сборки пакета: %_bindir и %_libexecdir/%name.
Примечание для C++
В секции %build происходит сборка исходного кода. Так как в проекте используется Make, в секции будет указан макрос %make
В секции %files описано, какие файлы и каталоги с соответствующими атрибутами должны быть скопированы из дерева сборки в rpm-пакет, а затем копироваться в целевую систему при установке этого пакета. Все три файла из пакета будут распакованы по путям, описанным в секции %install:
%files
%doc LICENSE
%_bindir/%name%files
%doc LICENSE
%dir %_libexecdir/%name/
%_bindir/%name
%_libexecdir/%name/%name.py
%_libexecdir/%name/__pycache__/*.py*Секция %changelog — описаны изменения внесённые в ПО, патчи, изменения методологии сборки
%changelog
* Mon date name <email@adress.com> 0.1-alt1
- First bello package%changelog
* Date name <email@address.com> 0.1.1-alt1
- First pello package%changelog
* Date Name <mail@address.org> 1.0-alt1
- First cello packageПолные Spec-файлы
Name: bello
Version: 0.1.1
Release: alt1
Summary: Hello World example implemented in Bash
Group: Other
License: GPLv3+
URL: https://github.com/altlinux/alt-packaging-guide/tree/master/example-code
Source0: %{name}-%{version}.tar
Requires: bash
BuildArch: noarch
%description
The long-tail description for our Hello World Example implemented in Bash.
%prep
%setup -q
%install
mkdir -p %buildroot%_bindir
install -m 0755 %name %buildroot%_bindir/%name
%files
%doc LICENSE
%_bindir/%name
%changelog
* Mon date name <email@adress.com> 0.1-alt1
- First bello packageName: pello
Version: 0.1.1
Release: alt1
Summary: Hello World example implemented in Python 3
Group: Other
License: GPLv3+
URL: https://github.com/altlinux/alt-packaging-guide/tree/master/example-code
Source0: %{name}-%{version}.tar
Requires: python3
BuildArch: noarch
%description
The long-tail description for our Hello World Example implemented in Python 3.
%prep
%setup -q
# fix python shebang for scripts
grep -R '^#!/usr/bin/\(env[[:space:]]\+\)\?python' . | cut -d: -f1 |
while read f; do
sed -E -i '1 s@^(#![[:space:]]*)%_bindir/(env[[:space:]]+)?python$@\1%__python3@' "$f"
done
%install
mkdir -p %buildroot%_bindir
mkdir -p %buildroot%_libexecdir/%name
cat > %buildroot%_bindir/%name <<-EOF
#!/bin/bash
/usr/bin/python3 %_libexecdir%name/__pycache__/%name.cpython-$(echo %__python3_version | sed 's/\.//').pyc
EOF
chmod 0755 %buildroot%_bindir/%name
install -m 0644 %name.py %buildroot%_libexecdir/%name/
%files
%doc LICENSE
%dir %_libexecdir/%name/
%_bindir/%name
%_libexecdir/%name/%name.py
%_libexecdir/%name/__pycache__/*.py*
%changelog
* Date name <email@address.com> 0.1.1-alt1
- First pello packageName: cello
Version: 0.1.1
Release: alt1
Summary: Hello World example implemented in C++
Group: Other
License: GPLv3+
URL: https://github.com/altlinux/alt-packaging-guide/tree/master/example-code
Source0: %{name}-%{version}.tar
BuildRequires: gcc-g++
BuildRequires: make
%description
The long-tail description for our Hello World Example implemented in C++.
%prep
%setup -q
%build
%make
%install
%makeinstall_std
%files
%doc LICENSE
%_bindir/%name
%changelog
* Date Name <mail@address.org> 1.0-alt1
- First cello packageСборка пакета
Перейдите в основную директорию репозитория и добавьте файлы в отслеживание git-репозитория:
$ git add bello.sh bello.spec LICENSE .gear/rules$ git add pello.py pello.spec LICENSE .gear/rules$ git add сello.cpp Makefile cello.spec LICENSE .gear/rules$ git commit -m "First commit"Gear
Запустите сборку с помощью Gear:
$ gear-rpm -baЕсли сборка прошла успешно, собранный пакет будет находиться в ~/RPM/RPMS/noarch
Gear + Hasher
Запустите сборку с помощью Gear и Hasher:
$ gear-hsh --no-sisyphus-check --commit -vЕсли сборка прошла успешно, собранный пакет будет находиться в ~/hasher/repo/x86_64/RPMS.hasher
Информация
В зависимости от языка, имя пакета будет bello-0.1-alt1.noarch.rpm, pello-0.1-alt1.noarch.rpm или cello-0.1-alt1.noarch.rpm