我的一般任务是把我软件中的所有库和可执行软件放在一个RPM文件中。我的另一种方法是使用bash脚本,它将所有库放在centos中指定的文件夹中。此外,还需要安装来自Yum包库的外部包(如Yum apt get install freelut)的依赖项。现在我只想使用一个RPM文件,它可以为我做所有的事情,复制正确文件夹中的库,添加Yum文件,并且我可以在没有任何问题的情况下启动可执行文件。
我在CentOS中读到了创建RPM文件的内容,我的第一次尝试是创建spec文件。从https://stackoverflow.com/a/1165200/7105824我发现了一个最小的例子:
Summary: A very simple toy bin rpm package
Name: toybinprog
Version: 1.0
Release: 1
License: GPL+
Group: Development/Tools
SOURCE0 : %{name}-%{version}.tar.gz
URL: http://toybinprog.company.com/
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
%description
%{summary}
%prep
%setup -q
%build
# Empty section.
%install
rm -rf %{buildroot}
mkdir -p %{buildroot}
# in builddir
cp -a * %{buildroot}
%clean
rm -rf %{buildroot}
%files
%defattr(-,root,root,-)
%config(noreplace) %{_sysconfdir}/%{name}/%{name}.conf
%{_bindir}/*
%changelog
* Thu Apr 24 2009 Elia Pinto <devzero2000@rpm5.org> 1.0-1
- First Build
在宏%文件中,我可以把所有文件都放进去。是否也可以将包含库内容的文件夹放在其中,而不是将所有100个库都放在额外的文件夹中?下一个问题是我不明白,macrro%source0在做什么。我要放在这里的tar文件是什么?也许有人能用一种简单易懂的方式让我明白我要为我的问题做些什么。
谢谢大家!
最佳答案
我喜欢这里的指导方针:
https://rpm-packaging-guide.github.io/Source0
是指在准备包生成时rpmbuild
将要查找的第一个源文件。%SOURCE
指令是到源的映射。您可以在其他部分中调用%SOURCE0
来引用它。%prep
准备生成设置并创建一个RPM_BUILD_ROOT
目录。%setup -q
解开当前目录中的tarball。从你的例子来看,它的名字应该是toybinprog-1.0.tar.gz
。
在%build
部分,您的源tarball已经被提取,因此您输入的任何命令,例如,make
都将在提取的目录中执行。%install
部分告诉rpmbuild
如何在目标系统上安装包在生成过程中拥有或生成的文件(您要安装的)。在大多数情况下,您希望在目标系统上安装二进制文件、库,并将头文件和静态库保存在单独的%{name}-devel
子包中。
类似于%files
指令,有一个类似的目录宏,名为%dir
。用法相似。以下是一些指导原则:
http://ftp.rpm.org/max-rpm/s1-rpm-inside-files-list-directives.html%dir
宏不考虑内部文件,而是%file指令的“子”宏。举个例子,
%files
%license LICENSE
%dir /usr/lib/%{name}/
%{_bindir}/%{name}
/usr/lib/%{name}/%{name}.py*
上面,用
%{name}
表示的包将拥有两个东西%{name.py*}
内部文件目录
/usr/lib/%{name}/
如果您的包
/usr/lib/%{name}
是要写入指定%{name}
的主包,那么%dir
应该拥有它。通常,不会指定包的目录所有权,如果是由多个包编写的,并且在安装包的过程中,%{name}
已经由系统中的其他包创建。可以使用
%dir
命令查询文件/目录的所有权,例如rpm
目录由fedora box上的包/var/log
拥有, ~]# rpm -qf /var/log
filesystem-3.2-40.fc26.i686