nuklly
(nuklly)
2013年06月30日 15:11
1
各位好,
我最近在学习 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
来更新图标缓存。
这样的话就会造成文件重复,请问正确的做法应该是什么呢?
*.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
如果不安装到 /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()
nuklly
(nuklly)
2013年07月1日 01:15
3
已经成功 Build 并且 Published,谢谢苏姐姐!