构建RPM以只安装文件

st-*_*t-h 14 rpm rpm-spec

我需要构建一个RPM,其唯一目的是安装一些字体.我已经阅读了几个关于它的教程,但是每个人似乎都暗示了一些不同的东西,而且我无法找到像这样的非常基本的设置.

是否可以仅引用规范的%files部分中的文件?我尝试过,rpm总是试图找到tmp目录中的文件.我是否需要添加一个特定的构建步骤,将我需要的所有内容复制到tmp目录中?

在构建rpm时,这些文件是否应该进入SOURCE或BUILD目录?我一直在寻找很多不同的信息.有人建议构建一个包含文件的tarball并放在SOURCE目录下,但这看起来有点不对,因为字体文件对我来说不是实际的源文件.

理想情况下,我想将所有字体文件放在一个目录结构中的BUILD文件夹中,如'./usr/share/fonts/',然后在SPEC的%file部分引用它,让RPM发挥其魔力.可能我在这里遗漏或误解了一些东西.

%files部分是否总是希望在tmp目录中找到源文件,或者我的设置有问题?我创建了包含的〜/ .rpmmacros

%_topdir             /Users/user/rpm
Run Code Online (Sandbox Code Playgroud)

这是根构建目录,包含BUILD,RPMS,SOURCES,SPECS和tmp目录.

如果有人能够提供spec文件中最不需要的项目以使其干净利落,我会很高兴.

编辑

按照user3159253的建议,我使用以下spec文件:

Name: test
Version: 1.0.0
Release: 1
Copyright: Copyright info
Group: Applications/System
BuildArch: noarch

%description
Brief description of software package.

%prep

%build

%install
mkdir -p %{buildroot}/usr/share/fonts
cp ./usr/share/fonts/* %buildroot/usr/share/fonts/

%clean

%files
/usr/share/fonts/*
Run Code Online (Sandbox Code Playgroud)

我将字体复制到BUILD/usr/share/fonts /目录中.如果我在rpm中查询文件列表,那么所有字体都在那里.但是,当我安装rpm时,它会抱怨

/usr/share/fonts is needed by test-1.0.0-1.noarch
Run Code Online (Sandbox Code Playgroud)

但是,如果此目录存在与否并不重要,所以我猜rpm正在抱怨此资源未在其数据库中列出.

我已经能够通过将%file部分更改为:

/usr/
/usr/share/
/usr/share/fonts/
/usr/share/fonts/*
Run Code Online (Sandbox Code Playgroud)

但是,我怀疑这是一个好主意.有没有更好的方法来解决这个问题?

use*_*253 7

当您在%files节中列出文件时,这些文件应该位于%{buildroot}目录中.正如Fedora文档所说,因为Fedora 10 buildroot 无法在规范中重新定义,所以是的,你必须在%buildroot中创建一个必需的文件系统层次结构,复制你的字体文件,然后在下面提到它们%files:

...
%install

mkdir -p %{buildroot}/usr/share/fonts
cp /path/to/existing/MyFont.ttf %buildroot/usr/share/fonts/
...

%files
%defattr(0644, root,root)
/usr/share/fonts/*
Run Code Online (Sandbox Code Playgroud)

您的发行版可能有标准字体文件位置的方便宏,它们在安装rpm等时在系统中正确注册,但大多数这些宏都是特定于供应商的.此外,您应该将字体文件复制到SOURCES /子目录,并提到他们Source:(Source<N>:在转速规格)标签(只是举个例子,一个号可以是任何):

Name: myfonts
Summary: my fonts package
...
Source5: MyFont.ttf
...
Run Code Online (Sandbox Code Playgroud)

然后你可以在以下%install部分使用这样的东西:

cp %{SOURCE5} %buildroot/usr/share/fonts/
Run Code Online (Sandbox Code Playgroud)

而不是MyFont.ttf的完整路径.

更新:你错过了依赖关系是正确的:这不是文件系统上的工件(文件,目录等),这是RPM db中的记录(在/ var/lib/rpm中).因此,要解决此问题,您必须使用该数据库.

因此,如果您在生成的RPM包中存在不满意的依赖项,则有两种选择:

  1. 如果您只是想方便地分发几个文件 而不与标准系统设施紧密集成(见下文),那么您可以简单地关闭所有rpm自动依赖性计算.使用AutoReqProv: no完全禁用所有的东西.
  2. 但是,您可能需要构建一个与其他操作系统更好集成的软件包.例如,字体可能需要在适当的系统设施内进行注册,例如fontconfig.不幸的是,不同的Linux rpm发行版对此有不同的呃嗯风俗.实际上,您必须检查在现有字体包中您的分发中如何组织此过程.你可以采取适当的源RPM程序包(检查http://rpmfind.nethttp://rpm.pbone.net RPM搜索引擎),提取其的.spec文件,并研究如何%prein,%postin,%preun%postun规范的部分被组织.显然,字体包通常在其名称中带有-fonts- :)

毕竟,你可以显示的依赖关系和未安装的rpm包的提供rpm --query --requires --package </path/to/file.rpm>rpm --query --provides --package </path/to/file.rpm>.已安装的软件包的deps显示为rpm --query --requires <rpm_name>依此类推.


fur*_*lay 5

作为您编辑的问题的答案,以下可能是您寻求的答案:

Name: test
Version: 1.0.0
Release: 1
Copyright: Copyright info
Group: Applications/System
BuildArch: noarch

%description
Brief description of software package.

%prep

%build

%install
mkdir -p %{buildroot}/
cp -r ./* %buildroot/

%clean

%files
/*
Run Code Online (Sandbox Code Playgroud)

在这里,我们将 BUILD 目录中的每个文件视为包的一部分。这是通过放置/*在下面来完成的%files

希望这能正确解决您的问题。