在没有 Nix 的情况下静态链接你的 Haskell 可执行文件 · Hasufell 的博客

主要观点:在 Tom Sydney 关于“让 Haskell 可执行文件与 Nix 静态链接”的优秀文章之后,提出一种替代方法,认为大多数 Haskell 开发者无需使用 Nix 也可实现二进制文件静态链接,介绍使用 Musl 和 Alpine Linux 进行静态链接的方式。
关键信息

  • GHC/cabal 通常不知如何进行部分静态链接,需使用 Musl libc 及基于 Musl 的 Linux 发行版如 Alpine Linux 或 Void Linux musl,本文选 Alpine。
  • GHCup 支持 Alpine Linux,可在其上安装 GHC,且构建静态二进制文件不一定要使用静态链接的 GHC。
  • 需用可重现(-ish)的干净构建环境,可利用支持 Alpine Linux 容器的 docker。
  • cabal build 结合 cabal list-bin 构建并创建静态二进制文件,也可通过 -ghc-options='-optl-static' 替代。
  • 若二进制文件依赖系统 C 库,需安装相应的 -dev 和有时需 -static 包,可在[https://pkgs.alpinelinux.org/...]搜索。
  • Github CI 中有使用 Alpine 构建静态发布二进制文件的示例。
    重要细节
  • 构建过程中先在 docker 容器中安装各种依赖,如 apk update 等,再安装 GHCup 并创建 dummy app 进行测试,最后检查二进制文件属性。
  • 若依赖不在 Alpine 仓库中,需更多手动工作,可考虑 Void Linux 作为替代。
阅读 100
0 条评论