我已经设置了一个工作工具链,pbuilder
用于在 Ubuntu 中构建 Debian 软件包i386
和amd64
各种软件包。我用它reprepro
来管理我自己的私人 apt 存储库,dupload
并将 、 、 和 文件上传.changes
到.dsc
其中.deb
。所有这些都有据可查,而且很有效。.orig.tar.gz
.debian.tar.gz
但我无法将i386
一个软件包的版本与amd64
同一个软件包的版本一起上传。Reprepro 发出以下抱怨:
File "pool/main/p/package/package_1.0.dsc" is already registered with different checksums!
i368
生成包和二进制包的源码amd64
一模一样,没有被我修改过,怎么会存在校验和不一样的情况呢?
经过调查,发现.dsc
文件的校验和差异是因为它包含该文件的不同校验和package_1.0.debian.tar.gz
。
进一步的调查显示,该package_1.0.debian.tar.gz
文件每次dpkg-buildpackage
被 debian build 工具链调用时确实有不同的校验和。原因是它更改了/debian
Debian 软件包子目录的修改时间。tar
不幸的是,该程序将修改时间包含在生成的存档中,导致每次运行工具链时都会产生不同的校验和。
所以,我的问题是:如何防止在构建 Debian 包时dpkg-buildpackage
修改目录的修改日期?/debian
如果我能做到这一点,文件的校验package_1.0.debian.tar.gz
和package_1.0.dsc
将保持不变,我可以轻松地上传到reprepro
。
答案1
我的情况和你不完全相同,但希望我的回答能够指出你的需要。
我目前使用多个 chroot 来构建和pbuilder
上的软件包,而不是使用。我使用在 chroot 之外生成 .dsc ,然后将相应的文件复制到 chroot。我意识到这不是最好的方法。amd64
i386
debuild -S
在第一个 chroot 中,我运行dpkg-buildpackage -b
来构建二进制包。在第二个 chroot 中,我运行dpkg-buildpackage -B
,仅构建与体系结构相关的包 - 即那些没有重复的包。
当我使用reprepro
将软件包推送到我的 repo 时,来自第一个 chroot (i386) 的 .debs 目标为“all”,以及i386
复制到的 debs 将被复制到所有体系结构i386
。当我从第二个 chroot (amd64) 推送软件包时,其余体系结构相关的 debs 或amd64
将被复制。
答案2
您可以尝试覆盖 tar 命令并向--mtime=some_fixed_time
其中添加参数。
答案3
据我所知你确实不能。
Debian 打包系统使用“debian”目录作为长期存储软件包元数据的地方,以及在构建过程中临时存储各种构建工件的地方。已经进行了大量工作来使二进制软件包的构建可重复,但我还没有听说任何针对源软件包的类似努力。
解决您错误的正确方法是仅构建源包和 arch 所有二进制包一次。然后对于第二个体系结构,您应该仅构建依赖于体系结构的二进制包。对于 pbuilder,您需要“--binary-arch”选项。