[ 已解决 ][OBS 新手求助 ] 关于 FQTerm 的打包

各位好,

我最近在学习 OBS 的使用,打算打包一个 FQTerm 练练手,打包好了以后就可以用它上 BBS 了。
在最后的 RPMLint 检验中,OBS 爆出如下问题:
1.

这里显示 FQTerm 源代码包中有几个文件上了黑名单,但是我在 Package Blacklist 里面没有找到 FQTerm 这个包。
请问这是因为”openSUSE 觉得这几个文件的位置不对“,还是因为”openSUSE 不允许这几个文件名的文件存在“?
应该如何处理?还是说这个软件根本没办法打包吗?我在其他发行版和 windows 下都能正常使用的,很习惯了。

在我参考的 spec 文件 ( build.opensuse.org/package/view_file?expand=1&file=fqterm.spec&package=fqterm&project=home%3Azhonghuaren ) 中,它是将
/usr/share/FQTerm
下面的图标复制到了
/usr/share/Icons/hicolor
下面,然后调用
gtk-update-icon-cache
来更新图标缓存。
这样的话就会造成文件重复,请问正确的做法应该是什么呢?

  1. *.orig 是专有的后缀,意思是制作补丁文件时候的原始文件,例:

diff -urN filename.c.orig filename.c > fix_xxx.patch

所以它属于软件打包者的「工作文件」的一种,是不应该被带到用户最终的系统里的。

所以正常的做法应该是移除:

find %{buildroot} -name “*.orig” -print -delete

但是我看了下 fqterm 的,它似乎是说:这是配置文件(cfg)的原始版本(original),取的是字面意思。

所以我们可以改名,比如改成 fqterm.cfg.example

%setup
...]
rename .orig .example res/userconf/*.orig

在 fqterm 文件夹下 grep -r “.orig” ./ 一下,会发现:

./src/common/fqterm_path.cpp:  if (!checkFile(getPath(RESOURCE) + "userconf/fqterm.cfg.orig", 
./src/common/fqterm_path.cpp:  if (!checkFile(getPath(RESOURCE) + "userconf/address.cfg.orig", 
./src/common/fqterm_path.cpp:  if (!checkFile(getPath(RESOURCE) + "userconf/language.cfg.orig", 

所以你还要相应调整下源代码,让它识别你改过的 .example

%setup
...]
sed -i "s/orig/example/" src/common/fqterm_path.cpp
  1. 如果不安装到 /usr/share/icons/hicolor/x/apps/fqterm.png 这种地方的话,.desktop 文件会找不到图标。所以它用了复制,于是就会出现 file duplicate。

正确的做法是 BuildRequires: fdupes,然后在 %install 的最末端:

%fdupes %{buildroot}

这样会在打包时,把这些重复的文件用软链接 (symlink) 的方式存储,节省传输流量,但在用户的最终硬盘上,依然会释放为真实文件而不是软链接。

PS: 装到 /usr/share/icons 的图标不用刷新缓存,如果一定要的话,可以参考 /etc/rpm/macros.hicolor:

%post 
...]
%icon_theme_cache_post() 

%postun
...]
%icon_theme_cache_postun()

已经成功 Build 并且 Published,谢谢苏姐姐!