跳转到主要内容

在非Gentoo Linux主机上构建Gentoo软件包的CLI工具

项目描述

Build and smoke test

binary-gentoo

关于

binary-gentoo 是一组简单的CLI工具的集合,主要用于帮助在非Gentoo Linux主机上构建Gentoo软件包。一个典型的场景是操作一个 活跃的 Gentoo二进制软件包主机 — 一个活跃的“binhost”。

次要功能binary-gentoo 还可以在使用Docker隔离和完整的 emerge 视角(而不会影响您的宿主系统)的Gentoo主机上构建Gentoo软件包。

目前有四个CLI工具遵循 Unix哲学,并且可以用Bash等粘合语言组合使用

  • gentoo-build – 使用Docker隔离构建Gentoo软件包
  • gentoo-clean — 使用 app-portage/gentoolkiteclean 清理Gentoo pkgdir/distdir文件,并使用Docker隔离
  • gentoo-local-queue – 管理基于文件的简单推送/弹出构建任务队列
  • gentoo-packages — 对pkgdir执行操作(除 emaint --fix binhost 之外)
  • gentoo-tree-diff – 列出某个portdir相对于另一个portdir具有的软件包/版本/修订版本
  • gentoo-tree-sync – 将给定的portdir目录(及其备份)更新到最新状态

binary-gentoo 是软件libre,在 GNU Affero GPL版本3或更高版本 许可证下授权。

安装

安装Docker,Python >=3.8,pip和rsync,然后

# pip install binary-gentoo

活动Binhost操作

要使用 binary-gentoo 设置活动binhost,您可能需要一个具有以下资源的虚拟机...

  • 足够的资源,即可能
    • >=2虚拟核心
    • >=8 GB RAM
    • >=100 GB磁盘空间
  • 某些Linux发行版
  • 启用自动更新以在一段时间内保持相对安全
  • 已安装运行时依赖项
    • Docker
    • Python >=3.8
    • rsync
  • 一个SSH或HTTP守护进程(用于将生成的二进制文件提供给您的消费端Gentoo机器,除非这是从另一台机器完成的)
  • 要使用的最新版本的/etc/portage文件夹副本
  • 一个包含所有要构建的包名称的最新文本文件,例如通过EIX_LIMIT=0 eix -I --only-names生成
  • 一组编译标志(CFLAGSCXXFLAGSLDFLAGSCPU_FLAGS_X86),这些标志适用于生产机器和消费机器,并且理想情况下已安装resolve-march-native——下面将详细介绍如何找到理想的标志
  • 两个portdir副本——一个通过gentoo-tree-sync(或某种形式的git pull)同步,另一个在调用gentoo-tree-diff后使用rsync恢复同步
  • 一个粘合脚本...
    • 尊重您的包含列表(例如,如果一些误报是可以接受的,则使用grep -q -f installed.txt -F <<<"${atom}" || continue
    • 尊重您的排除列表(例如,类似*sys-kernel/*|*-bin-*|*-9999*|*acct-*/*的东西)
    • gentoo-tree-diff新闻推送到队列
    • 从队列中取出,使用例如jq -r .atom提取原子,然后让gentoo-build进行构建
    • 永远循环
    • 时不时地睡一会儿
    • 时不时地运行gentoo-clean

确定理想的构建标志

让我举一个具体的例子。

消费端机器

在消费端机器上,我们有一个这样的硬件环境

# lscpu | fgrep 'Model name' | sed 's,^.\{33\},,'
Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz

# resolve-march-native
-march=sandybridge -maes --param l1-cache-line-size=64 --param l1-cache-size=32 --param l2-cache-size=3072 -O2 -pipe

# cpuid2cpuflags
CPU_FLAGS_X86: aes avx mmx mmxext pclmul popcnt sse sse2 sse3 sse4_1 sse4_2 ssse3

生产端机器

在生产端机器生产端机器上,我们有一个这样的硬件环境

# lscpu | fgrep 'Model name' | sed 's,^.\{33\},,'
QEMU Virtual CPU version 2.5+

# resolve-march-native
-march=k8-sse3 -maes -mcx16 -mno-3dnow -mno-3dnowa -mpclmul -mpopcnt -mrdrnd -msahf -msse4 -msse4.1 -msse4.2 -mssse3 -mtune=k8 --param=l1-cache-line-size=64 --param=l1-cache-size=64 --param=l2-cache-size=512 -O2 -pipe

# cpuid2cpuflags
CPU_FLAGS_X86: aes mmx mmxext pclmul popcnt rdrand sse sse2 sse3 sse4_1 sse4_2 ssse3

结果生产端构建标志

简而言之,我们正在寻找的标志是尽可能接近消费端机器,同时仍然能够生成二进制文件,这些二进制文件既可以在消费端机器上执行,也可以在生产端机器上执行(这样生产端机器就能够安装和运行包的依赖项的二进制文件)。

对于上面的例子,我在生产端机器上得到了以下这些值

  • CFLAGS: -march=x86-64 -mtune=sandybridge -maes --param l1-cache-line-size=64 --param l1-cache-size=32 --param l2-cache-size=3072 -mpclmul -mpopcnt -msse4.1 -msse4.2 -mssse3 -O2 -pipe(特别是-march-mtune
  • CXXFLAGS: 与CFLAGS相同
  • LDFLAGS: 消费端机器上返回的portageq envvar LDFLAGS
  • CPU_FLAGS_X86: aes mmx mmxext pclmul popcnt sse sse2 sse3 sse4_1 sse4_2 ssse3(即没有avx和没有rdrand

设计决策

  • binary-gentoo中的所有代码必须在非Gentoo Linux机器上运行,前提是已安装并启用了Docker以及具有正常互联网访问权限。

  • 像Chromium这样的大型包需要大量的RAM和CPU时间。因此,构建默认使用MAKETOPTS=-j1,将感兴趣包与其依赖项分开构建。这允许在只有8GB RAM的虚拟机中构建例如Chromium包。

  • 关于依赖项约束,一些包可以构建而不发生冲突,但不能安装而不发生冲突。因此,默认情况下只安装依赖项,而不安装感兴趣包。

项目详情


下载文件

下载适用于您的平台文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分布

binary-gentoo-6.2.0.tar.gz (40.1 kB 查看哈希值)

上传时间

构建分布

binary_gentoo-6.2.0-py3-none-any.whl (49.4 kB 查看哈希值)

上传时间 Python 3

由...