LINUX.ORG.RU
решено ФорумAdmin

Создание rpm-пакета, содержащего простые файлы

 , ,


1

0

Нужно собрать rpm-пакет, содержащий всего один скрипт на баше. Именно rpm-пакет, таково требование. Как я могу это сделать? Я совершенно не понимаю, как оформить .spec-файл и выполнить такую, казалось бы, простую задачу. Прошу помощи.

Ответ на: комментарий от slaykovsky

Окей, давайте попробую иначе. Я создал дерево каталогов в домашней директории пользователя, в rpmbuild/BUILDROOT закинул нужный файл: ~/rpmbuild/BUILDROOT/opt/script.sh

Мой .spec-файл:

Name:           my-script
Version:        1.0
Release:        1%
Summary:        My Script
License:        LGPLv3+ with exceptions
BuildRoot:      %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
%files
%defattr(-,root,root,-)
/opt/script.sh

HeroFromEarth ()
Ответ на: комментарий от HeroFromEarth

А кто файл то установит? Смотреть на Source в заголовке и секцию %install.

dinn ★★★★★ ()
Ответ на: комментарий от HeroFromEarth

%files перечисляет то что уже лежит в нужных местах, сама по себе эта секция ничего не делает.

Перед ней надо сделать секцию %install в которой собственно файл из исходников подкладывается в нужное место. Банальным cp, например.

https://fedoraproject.org/wiki/How_to_create_an_RPM_package#.25install_section

alpha ★★★★★ ()
Ответ на: комментарий от Nurmukh

Большое спасибо за наводку! В данный момент файл выглядит так:

Name:           myScript
Version:        1.0
Release:        1
Summary:        My Script
License:        LGPLv3+ with exceptions

Source0:        script.sh

BuildArch:      x86_64

BuildRoot:      %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)

%prep
%setup -q -c -T

%install
install -pm 755 %{SOURCE0} /opt/

%clean
rm -rf $RPM_BUILD_ROOT

Файл при этом копируется в /opt/ в системе, в которой я запускаю rpmbuild (к слову, запускаю так: rpmbuild -bb myScript.spec ), но .rpm-пакет не создаётся. Что я делаю не так?

HeroFromEarth ()
Ответ на: комментарий от HeroFromEarth

Ты забыл %files.

Идеологически RPM - инструмент для «укрощения» make install, уже написанного разработчиком софтины. Сначала надо установить программу как разработчик задумал (%install), потом выбрать нужные файлы из установленных и положить их в пакет(ы) (%files).

anonymous ()
Ответ на: комментарий от HeroFromEarth

upd

Name:           myScript
Version:        1.0
Release:        1
Summary:        My Script
License:        LGPLv3+ with exceptions

Source0:        script.sh

BuildArch:      x86_64

BuildRoot:      %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)

%prep
%setup -q -c -T

%install
install -pm 755 %{SOURCE0} %{buildroot}/opt/

%files
/opt/%{SOURCE0}

%clean
rm -rf $RPM_BUILD_ROOT

типа того

anonymous ()
Ответ на: комментарий от HeroFromEarth

Во-первых, %setup в твоем случае не нужен вообще, оставь %prep пустым. Во-вторых, не install -pm 755 %{SOURCE0} /opt/, а install -pm 755 %{SOURCE0} %{buildroot}/opt/. В-третьих, верни секцию %files. В-четвертых, установи rpmdevtools и выполни rpmdev-setuptree, если еще не делал — после этого rpmbuild будет складывать создаваемые rpm'ки в ~/rpmbuild/RPMS. Ну и по мелочи — в строке Release напиши 1%{?dist} вместо 1% и заведи %changelog.

dexpl ★★★★★ ()
Последнее исправление: dexpl (всего исправлений: 1)

Благодарю всех за терпение и советы. Сейчас имею файл:

Name:           myScript
Version:        1.0
Release:        1
Summary:        My Script
License:        LGPLv3+ with exceptions

Source0:        script.sh

BuildArch:      noarch

BuildRoot:      %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)


%description
Hello World

%install
install -pm 755 %{SOURCE0} %{buildroot}/opt/

%files
/opt/%{SOURCE0}

%clean
rm -rf $RPM_BUILD_ROOT

%changelog
* Wed Sep 21 2016 <user>
- Add script.sh

В SOURCE лежит сам скрипт, .spec-файл в SPECS. Директории BUILD и BUILDROOT пустые. Вывод после запуска rpmbuild:

Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.lWoHE3
+ umask 022
+ cd /root/rpmbuild/BUILD
+ '[' /root/rpmbuild/BUILDROOT/myScript-1.0-1.x86_64 '!=' / ']'
+ rm -rf /root/rpmbuild/BUILDROOT/myScript-1.0-1.x86_64
++ dirname /root/rpmbuild/BUILDROOT/myScript-1.0-1.x86_64
+ mkdir -p /root/rpmbuild/BUILDROOT
+ mkdir /root/rpmbuild/BUILDROOT/myScript-1.0-1.x86_64
+ install -pm 755 /root/rpmbuild/SOURCES/script.sh /root/rpmbuild/BUILDROOT/myScript-1.0-1.x86_64/opt/
install: target '/root/rpmbuild/BUILDROOT/myScript-1.0-1.x86_64/opt/' is not a directory: No such file or directory
error: Bad exit status from /var/tmp/rpm-tmp.lWoHE3 (%install)

Создавать вручную файлы в BUILDROOT/myScript... бесполезно, директория трётся при запуске rpmbuild (5 строка). Что я сделал не так? Чего не хватает?

HeroFromEarth ()
Ответ на: комментарий от debugger

rpmlint ошибок не выдаёт, только предупреждения а-ля «отсутствует секция %prep»

HeroFromEarth ()
Ответ на: комментарий от HeroFromEarth

rpm не знает про /opt (потому что /opt нужен для избежания бардака при неиспользовании рпм). Устанавливай сразу в %{_bindir}

anonymous ()
Ответ на: комментарий от arto

Абсолютно точно. RPM-пакет создался и спасибо Вам большое :) Остался, надеюсь, последний вопрос: на конечной машине, на которой я ставлю этот пакет, он разворачивает скрипт в /opt/home/user/rpmbuild/SOURCES/script.sh, что не есть хорошо и чего я совсем не ожидаю от него. Как это исправить?

HeroFromEarth ()
Ответ на: комментарий от anonymous

Нужно поставить в /opt/dir1/dir2/... , таково требование. Здесь я для краткости убираю лишнее. Для меня главное - понять суть того, как это делать и что нужно учитывать, для того чтобы при необходимости не писать сюда «помогите мне нужно добавить туда ещё один файлик» :)

HeroFromEarth ()
Ответ на: комментарий от anonymous

Конкретнее, увы, не могу. Вот то, что имею в итоге:

Name:           myScript
Version:        1.0
Release:        1
Summary:        My Script
License:        LGPLv3+ with exceptions

Source0:        script.sh

BuildArch:      noarch

BuildRoot:      %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)


%description
Smth like Hello World

%install
install -D -pm 755 %{SOURCE0} %{buildroot}/opt/%{SOURCE0}

%files
/opt/%{SOURCE0}

%clean
rm -rf $RPM_BUILD_ROOT

%changelog
* Wed Sep 21 2016 <user>
- Add script.sh

При сборке из-под рута получаю на конечной системе файл /opt/root/rpmbuild/SOURCES/script.sh

HeroFromEarth ()
Ответ на: комментарий от German_1984
Name:           myScript
Version:        1.0
Release:        1
Summary:        My Script
License:        -

Source0:        script.sh

BuildArch:      noarch

BuildRoot:      %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)


%description
Smth like Hello World

%install
install -D -pm 755 %{SOURCE0} %{buildroot}/opt/script.sh

%files
/opt/*

%clean
rm -rf $RPM_BUILD_ROOT

%changelog
* Wed Sep 21 2016 <user>
- Add script.sh

И собираем:

rpmbuild -bb ./myScript.spec

В результате в папке ~/rpmbuild/RPMS/noarch/ появляется .rpm-пакет.

HeroFromEarth ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.