Примеры сборки пакетов с исходными текстами на 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
LICENSE
Spec-файл и правила 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: noarch
Name: 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
Name: 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 package
Name: 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 package
Name: 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