我的一般任务是将我软件中的所有库与可执行软件一起放在rpm文件中。我的另一种方法是使用一个bash脚本,它将所有库放在CentOS的指定文件夹中。此外,需要安装外部软件包(如来自yum软件包库的库)的依赖关系(例如yum apt-get install freeglut)。现在我只想使用一个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文件是什么?也许有人能以一种易于理解的方式向我说明我必须为我的问题做些什么。
谢谢大家!
答案 0 :(得分:2)
我喜欢这些指南:
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
宏不会对内部文件进行说明,而不是&#34; sub&#34; %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
命令查询文件/目录的所有权,例如/var/log
目录由Fedora框上的包filesystem
拥有,
~]# rpm -qf /var/log
filesystem-3.2-40.fc26.i686