在本地编译基于 BinaryBuilder.jl 构建的 jll 包

简介

Julia 通过 BinaryBuilder.jl 和 AzurePipeline 来自动的为社区编译大量的、跨平台的各种二进制文件。

出于开发、调试的目的我们可能需要在本地(半自动)编译 jll 包,以确保在线编译的产物符合预期。
有时候在线编译的产物和不使用 BinaryBuilder.jl 编译的产物行为不同时,也需要这样本地编译来找出原因。

以下介绍 Windows+WSL2 (Ubuntu) 的工作流程,类 Unix 平台的流程不会有显著的差异。


环境准备

编译流程

浓缩版

git clone https://github.com/JuliaPackaging/Yggdrasil.git

# 进入 Julia 中
julia
] add BinaryBuilder.jl
exit()
# 回到 bash

# 找到你要编译的包、选定版本
cd Yggdrasil/O/OpenBLAS/OpenBLAS@0.3.10
# 此处的参数是你需要包的版本代号,空参数代表编译所有可能组合
julia --color=yes build_tarballs.jl --verbose x86_64-w64-mingw32-libgfortran5

详细流程

以 OpenBLAS 为例

  1. 拉取 Yggdrasil 注册树
    git clone https://github.com/JuliaPackaging/Yggdrasil.git
  2. 在 Julia 中安装 BinaryBuilder.jl
    打开 Julia
    ] add BinaryBuilder.jl
  3. 构建包
    cd Yggdrasil/O/OpenBLAS/OpenBLAS@0.3.10
    julia --color=yes build_tarballs.jl --verbose x86_64-w64-mingw32-libgfortran5
    
  4. 构建产物在:products 文件夹下

备注:

  • 构建过程会下载编译环境,需要保持网络畅通
    WSL2 的代理设置较为繁琐,可参考:WSL2 中访问宿主机 Windows 的代理
    设置完代理不通参考:WSL2 网络异常排查
  • 构建过程可能会需要 root 权限,需要输入密码;
    如果输入密码仍然报错,则使用 root 运行 julia,从第二步重新开始
3 个赞

一点点背景故事:

写这个是因为我在修 OpenBLAS 的 bug 时,发现本地在 julia 主 repo in-tree build 的产物和 BinaryBuilder.jl 打包的产物行为不一致,简单说就是 BB 的编译产物中还有 bug。所以需要本地 BB 编译看一下,看看是哪里出了问题。

xref: [OpenBLAS] add new patch to fix zdot crash by inkydragon · Pull Request #3655 · JuliaPackaging/Yggdrasil

您能否更详细的“ [在本地编译基于 BinaryBuilder.jl 构建的 jll 包]”过程和步骤教程,谢谢!!!

直接说哪里不清楚吧,我理解的更详细就是加点截图了。