如何防止dpkg-buildpackage在构建Debian软件包时修改/debian目录的修改日期?

我已经建立了一个工作的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文件的不同校验和。
进一步的调查显示,每次通过debian构建工具链调用dpkg-buildpackage时,package_1.0.debian.tar.gz文件的校验和确实是不同的。原因是它会改变Debian软件包的/debian子目录的修改时间。不幸的是,tar程序将修改时间包含在生成的存档中,导致每次运行工具链时都会得到不同的校验和。
所以,我的问题是:在构建Debian软件包时,如何防止dpkg-buildpackage修改/debian目录的修改日期?
如果我能做到这一点,文件 package_1.0.debian.tar.gzpackage_1.0.dsc 的校验和将保持不变,我就可以轻松地上传到 reprepro
3个回答

我和你的情况并不完全一样,但希望我的回答可以指向你需要的方向。
目前我不使用pbuilder,而是在amd64和i386上使用多个chroot环境来构建软件包。我在chroot之外使用debuild -S生成.dsc文件,然后将适当的文件复制到chroot环境中。我意识到这不是最好的方法。
在第一个chroot环境中,我运行dpkg-buildpackage -b命令来构建二进制软件包。在第二个chroot环境中,我运行dpkg-buildpackage -B命令,只构建与架构相关的软件包,即那些不重复的软件包。
当我使用reprepro将软件包推送到我的仓库时,来自第一个chroot环境(i386)的针对“all”目标的.debs文件会被复制到所有体系结构,同时i386的.debs文件也会被复制到i386目录下。当我从第二个chroot环境(amd64)推送软件包时,剩余的与架构相关的.deb文件或者amd64的.deb文件会被复制到相应目录下。

你可以尝试覆盖tar命令,并在其中添加--mtime=some_fixed_time参数。

据我所知,你实际上无法这样做。

Debian打包系统将"debian"目录既用作长期存储软件包元数据的地方,也用作在构建过程中临时存储各种构建产物的地方。已经进行了大量工作,使得二进制软件包的构建具有可重现性,但我还没有听说过类似的源代码软件包的努力。

解决你的错误的正确方法是只构建一次源代码软件包和所有架构相关的二进制软件包。然后对于第二个架构,你应该只构建与架构相关的二进制软件包。对于pbuilder,你需要使用"--binary-arch"选项。