Сборка RPM Нет такого файла или каталога

Я хочу создать простой RPM-файл с множеством небольших файлов.

[root@laptop rpm]# tree
.
├── BUILD
├── BUILDROOT
├── RPMS
├── SOURCES
│   └── some_agent-1.0.tar.gz
├── SPECS
│   ├── kernel.spec
│   └── kernel.spec~
└── SRPMS

6 directories, 3 files
[root@laptop rpm]# 

У меня есть этот файл спецификации:

Summary: some_agent
Name: some_agent
Version: 1.0
Release: 1
License: Apache
Group: application
Source0: %{name}-%{version}.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot
%description
Test 

%prep
%setup -q

%build


%install
rm -rf $RPM_BUILD_ROOT
make root=$RPM_BUILD_ROOT install

%clean
rm -rf $RPM_BUILD_ROOT

%files
%defattr(-,root,root,-)
%doc
agent/*

Но когда я пытаюсь собрать пакет RPM, я получаю такую ​​ошибку:

[root@laptop ~]$ rpmbuild -bb -v ~/rpm/SPECS/kernel.spec
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.RUwFW5
+ umask 022
+ cd /home/rcbandit/rpm/BUILD
+ LANG=C
+ export LANG
+ unset DISPLAY
+ cd /home/rcbandit/rpm/BUILD
+ rm -rf some_agent-1.0
+ /usr/bin/gzip -dc /home/rcbandit/rpm/SOURCES/some_agent-1.0.tar.gz
+ /bin/tar -xf -
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ cd some_agent-1.0
/var/tmp/rpm-tmp.RUwFW5: line 38: cd: some_agent-1.0: No such file or directory
error: Bad exit status from /var/tmp/rpm-tmp.RUwFW5 (%prep)


RPM build errors:
    Bad exit status from /var/tmp/rpm-tmp.RUwFW5 (%prep)
[root@laptop ~]$ ^C

Вы хоть представляете, в чем моя ошибка?

Я скопировал исходный файл, но его почему-то не нашли.


person user1285928    schedule 26.07.2015    source источник
comment
Похоже, что у rpmbuild есть проблемы с изменением каталога на распакованный каталог some_agent, проверьте пути. Может быть, ваши исходники не были сжато должным образом - без каталога some_agent-1.0, только файлы? Попробуйте распаковать его вручную и посмотрите, каков результат.   -  person jaroslawj    schedule 26.07.2015
comment
Нет, распаковка файлов вручную не решает проблему.   -  person user1285928    schedule 26.07.2015
comment
Когда вы распаковываете some_agent-1.0.tar.gz tarball, получается ли у вас каталог с именем some_agent-1.0? Или что-то другое?   -  person larsks    schedule 26.07.2015
comment
да, в какой каталог я должен его распаковать? ИСТОЧНИКИ?   -  person user1285928    schedule 26.07.2015
comment
Теперь сгенерированный RPM пуст. Похоже, я снова что-то упускаю.   -  person user1285928    schedule 27.07.2015
comment
Я вернулся к оригиналу, поскольку был ответ, который (по крайней мере частично) отвечал на этот вопрос уже к тому времени, когда вы изменили вопрос и сделали их ответ недействительным.   -  person Etan Reisner    schedule 31.07.2015


Ответы (2)


%install 
install -m 0755 -d %{buildroot}/opt/agent
cp -a your_milion_files/* %{buildroot}/opt/agent

%files 
/opt/agent

Когда вы укажете% dir, он будет включать только этот каталог и ничего больше. Без прагмы% dir он будет включать этот каталог и ВСЕ в нем. Итак, вы просто скопируете эти файлы в этот каталог в разделе% install.

Редактировать:

Допустим, что some-agent-1.0.tar.gz содержит:

agent/binary/agent.sh
agent/data/data1.dat
agent/data/data2.dat
....
agent/data/data1000.dat
agent/LICENSE

тогда ваши разделы должны быть:

%install
install -m 0755 -d %{buildroot}/%{_bindir}/some-agent
install -m 0755 -d %{buildroot}/%{_datadir}/
cp -a binary/agent.sh %{buildroot}/%{_bindir}/some-agent
cp -a data/* %{buildroot}/%{_datadir}/

%files
%doc LICENSE
%{_bindir}/some-agent
%{_datadir}/some-agent

Вместо последней строки вы можете использовать:

%dir %{_datadir}/some-agent
%{_datadir}/some-agent/*

но очевидно

 %{_datadir}/some-agent

короче и имеют то же значение.

В этом разделе% install вы можете использовать любую команду bash. Так что сделайте там то, что вы обычно делаете в командной строке. Любое расширение оболочки работает, так что используйте это для своего продвижения.

Я использовал некоторые макросы - вы должны использовать их, а не жестко заданный путь. Вы можете получить полный список доступных макросов по

rpm --showrc

И оцените их

rpm --eval '%{_datadir}'

который на недавних RHEL и Fedoras оценивается как

/usr/share

Я также представил небольшую хитрость с файлом LICENSE. Когда он присутствует в самом верхнем каталоге tarfile, вы просто передаете имя макросу% doc, и rpm автоматически помещает его для исправления% docdir.

person msuchy    schedule 30.07.2015
comment
Я не понимаю, что нужно вставить для your_milion_files/*? Может быть, каждый файл или конкретный каталог? - person user1285928; 30.07.2015
comment
В разделе% prepare вы правильно распаковали some-agent-1.0.tar.gz, а в начале раздела% install вы переходите в каталог ./agent/, который должен быть самым верхним каталогом вашего tar. Таким образом, вы в основном копируете эти файлы в нужное место в% {buildroot}. Постараюсь отредактировать свой ответ и привести конкретный пример. - person msuchy; 31.07.2015

Посмотрите журнал процесса сборки. Сначала rpmbuild переходит в каталог BUILD:

+ cd /home/rcbandit/rpm/BUILD

Затем он распаковывает ваш исходный архив:

+ /usr/bin/gzip -dc /home/rcbandit/rpm/SOURCES/some_agent-1.0.tar.gz
+ /bin/tar -xf -

Затем он пытается cd в каталог some_agent-1.0, который предположительно создается путем распаковки исходного архива:

+ cd some_agent-1.0
/var/tmp/rpm-tmp.RUwFW5: line 38: cd: some_agent-1.0: No such file or directory

Это не удается. Это говорит о том, что распаковка архива не создает каталог, который ищет RPM. Обычно это решается с помощью аргумента макроса %setup. Например, если у меня есть архив с именем some_agent-1.0.tar.gz, и он содержит:

an-unexpected-name/
an-unexpected-name/README

Мне нужно указать это с помощью аргумента -n макроса %setup:

%prep
%setup -q -n an-unexpected-name
person larsks    schedule 26.07.2015
comment
@ user1285928 Что вы получите, если распаковать свой some_agent-1.0.tar.gz? rpmbuild предполагает, что он распаковывается в каталог с именем some_agent-1.0, но, судя по выводам, которые вы нам показываете, это не так. Итак, что внутри вашего тарбола? - person nos; 27.07.2015
comment
У меня небольшой прогресс. У меня есть агент каталога в файле tar.gz, который является родительским для многих небольших файлов. Мне удалось собрать RPM, но он пустой. любая идея, что мне не хватает? - person user1285928; 27.07.2015
comment
Ваши файлы .spec создают только пустой каталог в $ RPM_BUILD_ROOT / opt / agent, вам также нужно будет скопировать туда файлы, которые вы хотите установить, и вам, вероятно, также потребуется удалить %dir в вашем разделе %install. - person nos; 27.07.2015
comment
Да, но у меня в пакете более 1000 файлов. Я не могу записать каждое имя файла. Можете ли вы дать мне подробную информацию, что мне нужно отредактировать? - person user1285928; 27.07.2015
comment
Возможно, просто сделайте cp -ap agent/* $RPM_BUILD_ROOT/opt/agent/ Или вместо install -m 0755 -d $RPM_BUILD_ROOT/opt/agent просто скопируйте все дерево каталогов: install -m 0755 -d $RPM_BUILD_ROOT/opt/ и cp -R agent $RPM_BUILD_ROOT/opt/ - person nos; 27.07.2015
comment
Я получаю cp: cannot stat `agent / * ': нет такого файла или каталога - person user1285928; 27.07.2015
comment
Запустите pwd в своем файле спецификации, тогда вы узнаете, какой текущий рабочий каталог находится в разделе% install, и обнаружите, что я сделал ошибку, и это должно быть просто cp -ap * $RPM_BUILD_ROOT/opt/agent/. - person nos; 27.07.2015
comment
Я пытался скопировать все дерево каталогов с помощью cp -ap * $ RPM_BUILD_ROOT / opt / agent /, но получаю + / usr / lib / rpm / redhat / brp-java-repack-jars, и компьютер зависает. Как я могу запустить pwd в файл спецификации, чтобы увидеть его местоположение? - person user1285928; 27.07.2015
comment
Спасибо %setup -q -n an-unexpected-name - это то, что я искал. - person Veda; 18.07.2018