#rpm #非确定性 #构建 # #文件 #修改 #可重复构建

bin+lib add-determinism

RPM构建根辅助工具,用于删除文件中的非确定性位

9个版本

0.3.6 2024年7月30日
0.3.5 2024年7月19日
0.3.2 2024年6月28日
0.2.0 2024年4月3日
0.1.0 2024年3月23日

#255文件系统

Download history 1/week @ 2024-05-19 4/week @ 2024-06-02 133/week @ 2024-06-09 100/week @ 2024-06-16 171/week @ 2024-06-23 231/week @ 2024-06-30 7/week @ 2024-07-07 215/week @ 2024-07-14 43/week @ 2024-07-21 165/week @ 2024-07-28 4/week @ 2024-08-04 3/week @ 2024-08-11

273 每月下载量

GPL-3.0-or-later

4.5MB
2K SLoC

包含 (归档库, 340KB) libHSbase-compat-batteries-0.12.3-EvvecFThiaEAGWq5U5Tpi9.a.fixed, (静态库, 340KB) libHSbase-compat-batteries-0.12.3-EvvecFThiaEAGWq5U5Tpi9.a, (静态库, 1KB) tests/cases/libempty.a, (静态库, 2KB) tests/cases/testrelro.a, (静态库, 2KB) tests/cases/testrelro.fixed.a

构建后处理器,用于重置元数据字段以实现构建可重复性

Packaging status

此crate提供了程序add-determinism,它接受一个或多个路径作为参数,并将递归处理这些路径,尝试在匹配扩展名的任何文件上运行处理器。(每个参数可以是单个文件或要递归处理的目录。)

对于每个处理的文件,都会打开一个临时文件,重写内容,将修改时间戳从原始文件复制到临时副本,并重命名副本以覆盖原始文件。

如果处理失败,会发出警告,但不会进行修改,程序返回成功。

此工具的目的是消除构建中常见的非确定性来源,使创建可重复(包)构建更容易。

用法

独立

$ add-determinism /path/to/file /path/to/directory

请注意,程序在原地工作,用重写的版本(如果有任何修改)替换输入文件。

一些有用的选项

  • -v — 启用调试输出
  • -j [N] — 使用 N 个工作者(如果没有提供 N,则使用与CPU一样多的工作者)
  • --handler list|HANDLER|-HANDLER — 约束处理器列表。接受逗号分隔的名称列表,可以是“正”名称列表,在这种情况下,只有列出的处理器将被使用,或者是一个“负”名称列表,每个名称前缀为减号,在这种情况下,列出的处理器将不被使用。默认情况下,无法初始化的处理器会跳过并发出警告。如果提供了“正”列表,初始化处理器失败将导致错误。可以使用特殊值 list 列出已知处理器。
  • --brp — 启用“构建根程序”模式,详见下文。

在 rpm 构建环境中

当使用 --brp 调用时,必须定义环境变量 $RPM_BUILD_ROOT 并确保它不为空。所有参数都必须在 $RPM_BUILD_ROOT 之下。此选项旨在用于定义安装后步骤的 rpm 宏。请参阅 redhat-rpm-config pull request #293 了解添加了 add-determinism 调用的请求。

验证而非修改

当使用 --check 调用时,该工具处理所有文件,但实际上不会保存任何修改。相反,如果任何文件将被修改,它将失败。如果无法读取任何文件,它也会返回错误。

处理器

ar

接受 *.a

将嵌入的修改时间重置为 $SOURCE_DATE_EPOCH,并将所有者:组设置为 0:0。

jar

接受 *.jar

使用 zip 包重写 zip 文件。存档条目的修改时间被钳定到 $SOURCE_DATE_EPOCH。移除了额外的元数据,即主要是 UNIX 格式的时间和 DOS 权限(也因为包不支持这些)。

javadoc

接受 *.html

检查 HTML 文件的 <head> 部分,并找到 Javadoc 插入的标准行,这些行指定了文件的创建日期。例如,<!-- 由 javadoc 生成 (<version>)<date> --> 将被替换为一个不带版本和日期的版本,而 <meta name="dc.created" content="<date>"> 将被替换为一个包含 $SOURCE_DATE_EPOCH 的版本。

pyc

接受 *.pyc

此处理程序实现了 Python 字节码文件的 .pyc 文件解析器,并清理了未使用的“标志引用”。它是 MarshalParser Python 模块的 Rust 重实现。

pyc-zero-mtime

接受 *.pyc

此处理程序将 .pyc 文件头部的内部时间戳设置为 0,并将对应的源 .py 文件的 mtime 设置为 0。这旨在用于丢弃 mtimes 的 OSTree 系统,导致 .pyc 文件中嵌入的时间戳与 .py 文件的文件系统元数据不匹配。

默认情况下,此处理程序未启用,必须通过 --handler pyc-zero-mtime 明确请求。

注意事项

该项目灵感来源于 strip-nondeterminism,但完全使用 Rust 编写。对于 Debian,构建工具是用 Perl 编写的,更多 Perl 不是一个问题。但在 Fedora/RHEL/… 中,工具是用 Bash、Python 编写的或编译的,我们不希望在所有构建根中引入 Perl。此外,我们想要进行的处理细节也不同。例如,Debian 不分发 Python 字节码文件。

依赖项

~11–21MB
~295K SLoC