RPM build 没有那个文件或目录
RPM build No such file or directory
我想创建包含许多小文件的简单 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
你知道我的错误在哪里吗?
我复制了源文件,但不知为何找不到。
查看构建过程的日志。首先,rpmbuild
进入BUILD
目录:
+ cd /home/rcbandit/rpm/BUILD
然后它会解压缩您的源 tarball:
+ /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
我需要用 %setup
宏的 -n
参数指出:
%prep
%setup -q -n an-unexpected-name
%install
install -m 0755 -d %{buildroot}/opt/agent
cp -a your_milion_files/* %{buildroot}/opt/agent
%files
/opt/agent
当您指定 %dir 时,它将只包含该目录,不包含任何其他内容。如果没有 %dir pragma,它将包含该目录和其中的所有内容。
所以你只需将那些文件复制到 %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 命令。那么在那里做你通常在命令行上做的事情。任何 shell 扩展都有效,因此请将其用于您的预付款。
我使用了一些宏 - 你应该使用它们而不是硬编码路径。您可以通过
获取可用宏的完整列表
rpm --showrc
并通过
对其进行评估
rpm --eval '%{_datadir}'
最近的 RHEL 和 Fedoras 评估为
/usr/share
我还介绍了 LICENSE 文件的小技巧。当它出现在 tarfile 的最顶层目录中时,您只需将名称传递给 %doc 宏,rpm 将自动将其放置在正确的 %docdir 中。
我想创建包含许多小文件的简单 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
你知道我的错误在哪里吗?
我复制了源文件,但不知为何找不到。
查看构建过程的日志。首先,rpmbuild
进入BUILD
目录:
+ cd /home/rcbandit/rpm/BUILD
然后它会解压缩您的源 tarball:
+ /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
我需要用 %setup
宏的 -n
参数指出:
%prep
%setup -q -n an-unexpected-name
%install
install -m 0755 -d %{buildroot}/opt/agent
cp -a your_milion_files/* %{buildroot}/opt/agent
%files
/opt/agent
当您指定 %dir 时,它将只包含该目录,不包含任何其他内容。如果没有 %dir pragma,它将包含该目录和其中的所有内容。 所以你只需将那些文件复制到 %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 命令。那么在那里做你通常在命令行上做的事情。任何 shell 扩展都有效,因此请将其用于您的预付款。
我使用了一些宏 - 你应该使用它们而不是硬编码路径。您可以通过
获取可用宏的完整列表rpm --showrc
并通过
对其进行评估rpm --eval '%{_datadir}'
最近的 RHEL 和 Fedoras 评估为
/usr/share
我还介绍了 LICENSE 文件的小技巧。当它出现在 tarfile 的最顶层目录中时,您只需将名称传递给 %doc 宏,rpm 将自动将其放置在正确的 %docdir 中。