[OBS 求助 ] 软件 llpp 的打包

大家好,

我现在想在 OBS 上面打包另外一个叫 llpp 的 PDF 阅览程序,但是遇到了困难如下:

  1. llpp 是使用一个叫做 buildall.sh 的脚本进行编译的,其中它似乎需要 wget 下载其他的软件包之后再进行打包。
    这种情况下我是不是要先打包它的 wget 下来的依赖,在打包 llpp?

  2. 我在本地 wget 下 llpp 的依赖包之后再重新制作源码压缩包上传 OBS,发现 OBS 能够成功编译,但是我 zypper in llpp 安装好之后会报"No bytecode file specified." 错误 (OCaml 找不到可执行代码),而我在本地 install 则不会发生这样的错误。造成这样报错的可能原因有哪些?

谢谢大家,尤其是苏姐姐在我之前学习打包过程中的帮助!

  1. 你的源拿来看看才能知道 bytecode 问题出在哪儿。直接空口白话我只能说你后制作的压缩包有问题,有实际比较重要但不影响编译出 RPM(success 状态)的 Warning 你没有修复,或者,你打包时候弄错了路径,比如上游不遵守 FSB 标准把 binary(二进制可执行文件)装到 /usr/share/llpp,然后你给移动到 /usr/bin 导致那个文件找不到原本位于同一级目录下的依赖等。

2 不建议重制作 Source,那样你相当于把一部分工作给 hide 起来了,别人 fork 你的包不知道怎么去更新 Source。

OBS 的编译虚拟机虚拟化程度非常高,是没有网卡的,所以不能联网下载。

但你可以使用 Source1,Source2 这种标记那些网上下载的依赖,然后上传,在 %prep 部分把它们复制到在线下载应该的位置,比如:

%prep
%setup -q
cp -r %{SOURCE1} ./data 
...]

然后去给 buildall.sh 打补丁。把 wget 那行注释掉。比如:

#wget xxx 
tar -xf xxx.tar.bz

另外搜一下如果 OBS 有一些 OCaml 的依赖那就去注释掉依赖的下载,使用 System 的(写到 BuildRequires,可能需要相应的补丁来改依赖查找路径)

总之就是不管你怎么 workaround,你的 SOURCE 必须直接来自上游,不能自己改它们的分发方式,比如明明一个程序包一个数据包你把它们重压到一起,只能改分发格式,比如 gz 改 bz2 压缩。所有的后续处理过程必须在 spec 里进行,所有的代码修改必须用补丁。这样你才没有 hide 东西,别人才能够在你不干的时候继续 fork 了维护。

  1. 它用 buillall.sh 编译,那安装肯定是装 /usr 的,但虚拟机的 /usr 禁止你访问的,所以你要自己在 %install 部分建立比如 %{buildroot}/usr/bin 等文件夹,然后 cp 编译好的东西过去。

Sent from my Galaxy Note 2 using Tapatalk 4 Beta

另外你自己弄出来的软件包,给中文用户用的可以提交到 home:opensuse_zh。基本打包比较厉害的中文开发者都在那里做审核员(当然我最厉害),他们可能会注意到一些我忽略的问题,对你的技术提高和方便用户来说都是有好处的。

Sent from my Galaxy Note 2 using Tapatalk 4 Beta

谢谢苏姐姐!

我之前的帖子有的东西没有说清楚,这里继续说明一下。

  1. 我的 llpp package 的位置是:https://build.opensuse.org/package/show/home:nuklly/llpp,里面有源码压缩包和 spec 文件,源使用的是 http://repo.or.cz/w/llpp.git 中提供的 v16 的压缩包。

  2. llpp 这个程序“似乎”是没有任何运行时依赖的,我在本地执行 buildall.sh,就仅仅是编译出一个可执行文件 llpp,然后可以拷贝到 $PATH 中的任意位置,都可以直接运行。但是在 OBS 上面编译好的 llpp 程序用 zypper in 安装到本地后,在运行时会报错"No bytecode file specified."。
    经过推测我认为应该是我直接拷贝进 llpp 压缩包中的第三方库的文件夹中包含了二进制文件,导致在 OBS 上面编译的时候直接使用了这些在本地编译好的二进制文件而不是重新编译,这样最终链接出来的可执行文件就会有问题不能正常执行。

  3. 下载外部 SOURCE 的问题明白了,我会自己解决,谢谢苏~

过一段时间我尝试一下向 opensuse_zh 提交一下自己的打包吧。

我觉得你的问题可能出在没有手写 Requires: OCaml 这些。于是本机里没自动装。

RPM 的自动查找依赖只能查找编译语言的,简单说就是 C 和 C++ 的依赖,用的是 ldd。perl/python/ruby/pascal/lua/ocaml 这些解释语言和脚本语言都必须手写(不然 Requires 这个 tag 不就没用了嘛)。

你把你用到的那些 ocaml 包装一下再看。要是这个问题自己去一个一个装过来整理依赖写到 spec 去。

和你这情况接近的有 Packman 源里的 MLDonkey,可以去 pmbs.links2linux.org 搜索看人家的 spec 怎么处理运行依赖的。

要是别的问题就得等我装了看了。

Sent from my Galaxy Note 2 using Tapatalk 4 Beta