使用Nix打包CentOS5工具链依赖
Using Nix to package CentOS5 toolchain dependencies
我们目前正在研究 Nix 是否可以成为我们打包构建软件所需的第三方库和工具的合适工具。免责声明:我刚刚了解了 Nix,并且仍在尝试将所有部分组合在一起。
我们的产品需要与 CentOS5 系统 ABI 兼容。这就是为什么我们在 CentOS5 Docker 容器中构建我们的软件,使用自定义构建的 GCC,以及许多其他第三方工具和库都是从源代码构建的。
目前,我们有一个大的 Makefile 来构建所有这些依赖项,并使用 CI 作业来构建依赖项。每次依赖项之一发生变化,或者对 Makefile 进行一些更改时,我们都会重建所有依赖项,这需要很长时间。
我们正在研究更易于维护的更简单的解决方案,而不是改进 Makefile。我认为 Nix 可以通过将 Makefile 转换为单独的派生来帮助我们解决这个问题,并为每个派生指定正确的依赖关系。 Nix 会是这个用例的合适工具吗?我看到的主要问题是 Nix 使用现代 glibc 库作为基础派生,我们不能依赖它。我们是否需要构建自定义 glibc 版本,或者我们能否以某种方式依赖安装在主机系统(CentOS5 上)上的 glibc?
这看起来像是 Nix 可以帮助您的场景。
Our product needs to be ABI compatible with CentOS5 systems.
Nix(通过 Nixpkgs)构建的二进制文件和库不会 link 针对系统库。实际上,这类似于静态 linking,但通过不同的方式实现,例如 rpath 和包装脚本。这应该使您的产品 ABI 与任何发行版兼容,除非您的程序明确需要某些操作系统功能而不是普通库。例如,如果您的程序依赖于 GPU 驱动程序,那可能仍然是一个挑战。
with a custom built GCC
Nixpkgs 可以使用您的自定义 GCC 构建所有包或仅选择一个包。
with the right dependencies specified per derivation.
Nix 非常适合这项任务。我建议在启用沙箱功能的情况下进行构建。如果您不是 运行 NixOS,您应该在 multi-user mode 中安装它并启用沙盒。
The main problem I see is that Nix uses a modern glibc library as a base derivation, one on which we can not depend.
使用 Nix 构建时,您的产品将忽略系统 glibc。提供你自己的 glibc 是可行的,但我不认为你真的需要它,因为你从源代码构建所有东西并且与主机系统的兼容性不是问题。
or can we somehow depend on the glibc installed on the host system (the CentOS5 one)?
出于必要,这是在 Mac OS X 系统上采用的方法。这样做将被视为退后一步;您需要一个充分的理由才能这样做。
Would Nix be a suitable tool for this use case?
你应该试试看。 Nix 至少可以为您提供这些保证:
- 指定所有依赖项
- 并行构建的推导同样正确
- 每个构建都是干净的构建,即使重用早期构建的结果也是如此
- 可重复性:如果今天构建,明天构建,您明天就可以修改它
- 完全依赖:安装时不会遗漏任何依赖
祝你好运,不要犹豫,提出问题。软件通常不喜欢被强制执行正确的行为。
and use a CI job
完全披露:我正在为 Nix 开发 CI 服务。
我们目前正在研究 Nix 是否可以成为我们打包构建软件所需的第三方库和工具的合适工具。免责声明:我刚刚了解了 Nix,并且仍在尝试将所有部分组合在一起。
我们的产品需要与 CentOS5 系统 ABI 兼容。这就是为什么我们在 CentOS5 Docker 容器中构建我们的软件,使用自定义构建的 GCC,以及许多其他第三方工具和库都是从源代码构建的。
目前,我们有一个大的 Makefile 来构建所有这些依赖项,并使用 CI 作业来构建依赖项。每次依赖项之一发生变化,或者对 Makefile 进行一些更改时,我们都会重建所有依赖项,这需要很长时间。
我们正在研究更易于维护的更简单的解决方案,而不是改进 Makefile。我认为 Nix 可以通过将 Makefile 转换为单独的派生来帮助我们解决这个问题,并为每个派生指定正确的依赖关系。 Nix 会是这个用例的合适工具吗?我看到的主要问题是 Nix 使用现代 glibc 库作为基础派生,我们不能依赖它。我们是否需要构建自定义 glibc 版本,或者我们能否以某种方式依赖安装在主机系统(CentOS5 上)上的 glibc?
这看起来像是 Nix 可以帮助您的场景。
Our product needs to be ABI compatible with CentOS5 systems.
Nix(通过 Nixpkgs)构建的二进制文件和库不会 link 针对系统库。实际上,这类似于静态 linking,但通过不同的方式实现,例如 rpath 和包装脚本。这应该使您的产品 ABI 与任何发行版兼容,除非您的程序明确需要某些操作系统功能而不是普通库。例如,如果您的程序依赖于 GPU 驱动程序,那可能仍然是一个挑战。
with a custom built GCC
Nixpkgs 可以使用您的自定义 GCC 构建所有包或仅选择一个包。
with the right dependencies specified per derivation.
Nix 非常适合这项任务。我建议在启用沙箱功能的情况下进行构建。如果您不是 运行 NixOS,您应该在 multi-user mode 中安装它并启用沙盒。
The main problem I see is that Nix uses a modern glibc library as a base derivation, one on which we can not depend.
使用 Nix 构建时,您的产品将忽略系统 glibc。提供你自己的 glibc 是可行的,但我不认为你真的需要它,因为你从源代码构建所有东西并且与主机系统的兼容性不是问题。
or can we somehow depend on the glibc installed on the host system (the CentOS5 one)?
出于必要,这是在 Mac OS X 系统上采用的方法。这样做将被视为退后一步;您需要一个充分的理由才能这样做。
Would Nix be a suitable tool for this use case?
你应该试试看。 Nix 至少可以为您提供这些保证:
- 指定所有依赖项
- 并行构建的推导同样正确
- 每个构建都是干净的构建,即使重用早期构建的结果也是如此
- 可重复性:如果今天构建,明天构建,您明天就可以修改它
- 完全依赖:安装时不会遗漏任何依赖
祝你好运,不要犹豫,提出问题。软件通常不喜欢被强制执行正确的行为。
and use a CI job
完全披露:我正在为 Nix 开发 CI 服务。