可重现构建/状态

来自 ArchWiki

Arch Linux 正在持续重建 coreextra 软件包,并有一个 状态页面。此页面包含不良软件包的状态以及需要修复的内容。

问题

一般

  • 所有使用 pacman < 5.2 构建的软件包都需要重建,以解决文件顺序问题和 btrfs 大小错误。对于文件顺序问题,可以通过在镜像目录上运行以下单行命令找到受影响的 extra 软件包
for i in /srv/ftp/extra/os/x86_64/*.pkg.tar.??; do
   bsdtar -tf $i | grep "^\." > pkg-order
   sort pkg-order > sort-order
   if ! diff pkg-order sort-order &>/dev/null; then
     echo $i;
   fi
   rm pkg-order sort-order
done

文件顺序重建 FTBFS

accounts-qml-module-0.7-2-x86_64.pkg.tar.xz
archboot-2019.03-1-any.pkg.tar.xz
cmark-0.29.0-1-x86_64.pkg.tar.xz
gtk-sharp-2-2.12.45-2-x86_64.pkg.tar.xz
guile1.8-1.8.8-7-x86_64.pkg.tar.xz
java11-openjfx-11.0.3.u1-1-x86_64.pkg.tar.xz
java11-openjfx-doc-11.0.3.u1-1-x86_64.pkg.tar.xz
java11-openjfx-src-11.0.3.u1-1-x86_64.pkg.tar.xz
java8-openjfx-8.u202-3-x86_64.pkg.tar.xz
java8-openjfx-doc-8.u202-3-x86_64.pkg.tar.xz
java8-openjfx-src-8.u202-3-x86_64.pkg.tar.xz
java-openjfx-13.u14-1-x86_64.pkg.tar.xz
java-openjfx-doc-13.u14-1-x86_64.pkg.tar.xz
java-openjfx-src-13.u14-1-x86_64.pkg.tar.xz
jdk10-openjdk-10.0.2.u13-2-x86_64.pkg.tar.xz
jre10-openjdk-10.0.2.u13-2-x86_64.pkg.tar.xz
jre10-openjdk-headless-10.0.2.u13-2-x86_64.pkg.tar.xz
jsonrpc-glib-3.34.0-1-x86_64.pkg.tar.xz
libva-vdpau-driver-0.7.4-4-x86_64.pkg.tar.xz
liferea-1.12.7-1-x86_64.pkg.tar.xz
linux-atm-2.5.2-6-x86_64.pkg.tar.xz
mono-tools-4.2-2-x86_64.pkg.tar.xz
npapi-sdk-0.27.2-2-any.pkg.tar.xz
nss_ldap-265-7-x86_64.pkg.tar.xz
openjdk10-doc-10.0.2.u13-2-x86_64.pkg.tar.xz
openjdk10-src-10.0.2.u13-2-x86_64.pkg.tar.xz
pam_ldap-186-6-x86_64.pkg.tar.xz
portaudio-1:19.6.0-6-x86_64.pkg.tar.xz
qtav-1.13.0-1-x86_64.pkg.tar.xz

包含 JAR 文件的软件包

JAR 文件为每个文件包含修改时间戳,这使得它们不可重现。根据构建系统,有不同的解决方案可用于此问题。

Ant

目前不支持可重现构建,请参阅上游功能请求

Gradle

应该开箱即用地支持可重现构建。

Maven

支持可以设置为固定时间戳的 project.build.outputTimestamp 属性。最近版本的 Maven 插件会遵守此属性以创建可重现的工件。该属性应在项目的 pom.xml 文件中设置,如果上游尚未执行此操作,您可以使用如下命令在编译时定义它

mvn -Dproject.build.outputTimestamp="$SOURCE_DATE_EPOCH" clean package

可能需要修补项目的 pom.xml 以将插件更新到支持可重现构建的更新版本,有关最低要求的版本和更多信息(如其他必要的配置选项),请参阅Maven 可重现构建指南

示例软件包(包括 Maven 插件版本更新的补丁):junit-system-rules

OpenJDK jar 命令

内置的 OpenJDK jar 程序将从 OpenJDK 版本 15 开始支持 SOURCE_DATE_EPOCH

strip-nondeterminism

作为最后的手段,Debian 的 strip-nondeterminism 能够从各种文件类型(包括 JAR 文件)中剥离不可重现的元数据,例如文件时间戳。它不是万能药(例如,构建系统可能会在 JAR 清单中包含其他不可重现的元数据,strip-nondeterminism 会删除其中一些,但不是全部),并且只有在没有对可重现构建的本地支持时才应作为最后的手段使用

strip-nondeterminism --timestamp "$SOURCE_DATE_EPOCH"

KDE Kdeveloper 项目文件

KDE 创建软件包应用程序模板 .tar.bz2 文件,当使用 repro 重现时,tar 文件和 userid 不同,这可能是 repro 中的一个错误。https://gist.githubusercontent.com/jelly/570313f56ee59be7674ad4cc002232e7/raw/b85536690c48b23ce97650e8db8f0ca18c2dbf1a/gistfile1.txt

生成此问题的 cmake 文件.

使用 graphviz-2.44.0-2 构建 Doxygen 文档

graphviz 缺少对 libpng 的依赖,这使得 dot 中无法生成 PNG,因为 graphviz 是在 libpng 可用之前安装的,因此没有将其标记为 dlopen'd。所有依赖 doxygen 生成文档且具有以下差异的软件包都需要重建。

│ │ --rw-r--r--   0 root         (0) root         (0)    20234 2020-05-16 12:32:36.000000 usr/share/doc/grantlee/classGrantlee_1_1Parser.html
│ │ --rw-r--r--   0 root         (0) root         (0)      265 2020-05-16 12:32:36.000000 usr/share/doc/grantlee/classGrantlee_1_1Parser__inherit__graph.map
│ │ --rw-r--r--   0 root         (0) root         (0)       32 2020-05-16 12:32:36.000000 usr/share/doc/grantlee/classGrantlee_1_1Parser__inherit__graph.md5
│ │ --rw-r--r--   0 root         (0) root         (0)     3136 2020-05-16 12:32:36.000000 usr/share/doc/grantlee/classGrantlee_1_1Parser__inherit__graph.png
│ │ +-rw-r--r--   0 root         (0) root         (0)    19961 2020-05-16 12:32:36.000000 usr/share/doc/grantlee/classGrantlee_1_1Parser.html
│ │ +-rw-r--r--   0 root         (0) root         (0)      598 2020-05-16 12:32:36.000000 usr/share/doc/grantlee/classGrantlee_1_1Parser__inherit__graph.dot

[core]

软件包 问题 解决方案/补丁 负责人 已解决
linux 签名模块
linux-docs 许多问题 - 排序、链接...
linux-headers /usr/lib/modules/*/build/vmlinux 差异[死链接 2021-11-15 ⓘ]
linux-lts linux 相同
linux-lts-docs linux-docs 相同
linux-lts-headers linux-headers 相同

[extra]

软件包 问题 解决方案/补丁 负责人 已解决
amdvlk usr/lib/amdvlk64.so 中存在许多差异
ant .jar 文件差异
ant-doc 许多时间戳 (javadoc) 和 .zip 文件差异
asymptote html 和 info 中的日期。PDF 文档差异(日期?)
autogen man 页面中的时间戳,sr/share/autogen/libopts-42.1.17.tar.gz 具有不同的文件所有权,以及 usr/bin/autogen 中的一个小的二进制更改 需要导出 MAN_PAGE_DATE=... 并配置 --enable-timeout=70
bigloo uname 和时间戳到处都是
breezy 3.0.2.3-3 可以使用 repro 和 makechrootpkg 重现 工具问题?
clisp IP 地址;ps 文档中的时间戳,可能还有更多
deluge .pyc 文件,.egg 文件
doxygen-docs 许多具有差异的 pdf 文件
ecl uname、时间戳、gzip,许多其他二进制差异
eclipse-ecj .jar 文件
efitools /usr/share/efitools/efi/LockDown.efi 具有二进制差异
efl 许多二进制差异
emacs usr/bin/emacs 中的二进制差异
firefox 这是 firefox;PGO?
libbluray usr/share/java/{libbluray{,-awt}-j2se-1.2.0.jar 中的文件属性(?)差异
libgtop /usr/bin/libgtop_server2 中的 uname
libmp4v2 usr/include/mp4v2/project.husr/lib/libmp4v2.so.2.0.0 中的时间戳
lirc yaml 文件中的时间戳,usr/share/lirc/lirc-0.10.1.tar.gz 有许多时间戳差异,repro 导致在 makerepropkg 中未发现的 poll() 检测问题 patch
r 文件中有很多时间戳,gzip 时间戳,在 /tmp/ 中随机(?)生成的路径,二进制差异...
zabbix-agent2 /usr/bin/zabbix_agent2 中的时间戳

[multilib]

软件包 问题 解决方案/补丁 负责人 已解决
lib32-keyutils 二进制文件包含构建日期 建议