Windows 上从源码编译 julia

*nix 的参见:


开发环境

  • 系统 Win 10 x64
  • julia v1.8+
  • shell 环境:MinGW/MSYS2
  • C/C++ 编译器:gcc/g++
  • 构建系统:make

MSYS2 默认安装最新的 gcc,这会导致一些兼容性的问题,对于开发使用影响不大。
如果你准备分发自己编译的 julia 二进制文件,建议使用 julialang 的 docker 镜像:juliapackaging/package-windows-x86_64Dockerfile

开发环境选择备注
  • 系统环境
    • Win10:对旧版本的系统并没有硬性限制。
    • x64:32 位的系统则需使用全套的 32 位工具链,除非有兼容性因素,否则不推荐使用。
  • julia v1.8+:对 MSYS2 工具链的支持在 v1.9 开发期间加入,已经移植到 v1.8+。
    目前的 LTS 版本 v1.6.7 没有反向移植 MSYS2 构建的支持补丁。只能使用 Cygwin 构建。
  • shell 环境:支持使用 Cygwin。
    不过目前的 CI 使用的是 MSYS2。这也意味着,如果之后没人加入 Cygwin 的 CI,随着时间的推移,Cygwin 的支持会出现越来越多的问题。所以不推荐使用。
  • win 上也可以使用 WSL(2) 交叉编译。步骤类似 *nix 系统。
  • C/C++ 编译器:
    • 在 macOS 上支持 clang,其他系统上没有进行完备的测试
    • 曾经支持 MSVC 构建。目前暂不支持。
  • 构建系统:在某些旧版本上曾经支持 cmake。目前暂不支持。

依赖安装

安装 MSYS2

配置 MinGW64 环境

  • 打开 MSYS2 MinGW64 shell(深蓝色图标)
  • (可选)配置 MSYS2 包镜像。
    执行:sed -i "s#mirror.msys2.org/#mirrors.tuna.tsinghua.edu.cn/msys2/#g" /etc/pacman.d/mirrorlist*
  • 更新包数据库:pacman -Syu
    更新完成后会提示你,需要关闭窗口重新启动 shell
  • 重新打开 MinGW64 shell 后,继续更新包:pacman -Syu

安装编译工具链

  • 打开配置的好的 MinGW64 shell
  • 安装编译工具:pacman -S cmake diffutils git m4 make patch p7zip python
  • 安装 C/C++ 编译器:pacman -S mingw-w64-x86_64-gcc
  • (可选)安装 fortran 编译器:pacman -S mingw-w64-x86_64-gcc-fortran
    仅涉及编译 fortran 代码时才需要。julia 本身并不直接依赖 fortran,数学库相关的依赖会涉及 fortran 代码。

源码编译 julia

# (可选)切换到 win 上的工作路径
cd /e/

# Clone julia 源代码
git clone https://github.com/JuliaLang/julia.git
cd julia

# 选择 release 版本
git checkout v1.8.3

# 开始 in-tree 构建
make -j$(nproc)

(可选)在目录中构建

有时我们需要同时测试多个版本的构建,把他们分别放在不同的文件夹内就比较方便。

# 在 julia/ 目录中,已经切换好 release

# 配置 julia。julia-mingw-w64 即为构建目录名
make O=julia-mingw-w64 configure
# (可选)禁用 in-tree build
echo 'ifeq ($(BUILDROOT),$(JULIAHOME))
        $(error "in-tree build disabled")
      endif' >> Make.user

# 在目录中构建
make -C julia-mingw-w64 -j$(nproc)

# 之后的 make 操作均要自定目录名 `-C julia-mingw-w64`

成功构建后

julia/ 目录下 ls 可以看见 julia.bat 即为 julia 的可执行程序

MINGW64 /e/julia
$ ls
CITATION.bib     LICENSE.md  README.md      cli      etc              stdlib       usr-staging
CITATION.cff     Make.inc    THIRDPARTY.md  contrib  julia.bat        sysimage.mk
CONTRIBUTING.md  Makefile    VERSION        deps     julia.spdx.json  test
HISTORY.md       NEWS.md     base           doc      src              usr

运行本地构建的 julia

julia/ 目录下:./julia.bat

单独运行某个测试

make test 可以运行所有测试,但时间较长且资源占用很大,一般 8C16T + 16GB 内存大约 40min~2h。

  • 打印可单独执行的测试名称:make -C test/ print-TESTS
    $ make -C test/ print-TESTS
    make: Entering directory '/e/julia/test'
    TESTS=all default stdlib 
    unicode strings compiler 
    ArgTools Artifacts Base64 CRC32c CompilerSupportLibraries_jll Dates DelimitedFiles Distributed Downloads FileWatching 
    Future GMP_jll InteractiveUtils LLVMLibUnwind_jll LazyArtifacts LibCURL LibCURL_jll LibGit2 LibGit2_jll LibSSH2_jll LibUV_jll LibUnwind_jll Libdl LinearAlgebra Logging MPFR_jll Markdown MbedTLS_jll Mmap MozillaCACerts_jll NetworkOptions OpenBLAS_jll OpenLibm_jll PCRE2_jll Pkg Printf Profile REPL Random SHA Serialization SharedArrays Sockets SparseArrays Statistics SuiteSparse SuiteSparse_jll TOML Tar Test UUIDs Unicode Zlib_jll dSFMT_jll libLLVM_jll libblastrampoline_jll nghttp2_jll p7zip_jll 
    abstractarray ambiguous arrayops asyncmap atexit atomics backtrace binaryplatforms bitarray bitset boundscheck boundscheck_exec broadcast cartesian ccall channels char checked choosetests client cmdlineargs combinatorics complex copy core corelogging deprecation_exec dict docs download download_exec enums env error errorshow euler exceptions fastmath file filesystem float16 floatapprox floatfuncs functional generic_map_tests gmp goto hashing int interpreter intfuncs intrinsics iobuffer iostream iterators keywordargs llvmcall llvmcall2 loading math meta misc missing mod2pi mpfr namedtuple numbers offsetarray opaque_closure operators ordering osutils parse path precompile print_process_affinity profile_spawnmany_exec ranges rational read reduce reducedim reflection regex reinterpretarray rounding ryu secretbuffer sets show simdloop smallarrayshrink some sorting spawn specificity stack_overflow stacktraces staged stress stress_fd_exec subarray subtype syntax sysinfo test_exec test_sourcepath testenv threads threads_exec triplequote tuple vecelement version worlds  
    unicode/utf8  strings/basic strings/io strings/search strings/types strings/util  compiler/AbstractInterpreter compiler/codegen compiler/contextual compiler/effects compiler/inference compiler/inline compiler/interpreter_exec compiler/irpasses compiler/irutils compiler/ssair compiler/validation
    
  • 单独执行某个测试:make test-math
    test- 后面接测试名称
  • 测试名中带 / 的测试,则需要使用:make -C test/ strings/basic

打包为 msi

  • 下载 msi 打包依赖:make win-extras
  • 打包为 exe:make binary-dist && make exe

Note:

  • make binary-dist
    • 会新建 julia/julia-版本号 目录,例如 julia/julia-1.8.3/
    • 会自行构建 html 文档,请耐心等待
  • make exe 输出:julia/julia-1.8.3-win64.exe

构建出错

总的来说调试 bug 就已经很难了,远程、间接的调别人的 bug 基本不太可行。
如果遇到了问题可以先自行检查以下 checklist。
还是有问题,建议单独发帖询问,附上详细的环境配置、你的操作步骤以及完整的报错日志文件。

自查 checklist

环境配置阶段

一般来说不会有问题,报错建议多baidu搜搜。

  • 检查安装时,路径是否含有中文
  • 全局环境变量 PATH 里是否有其他开发环境?
    这种开发环境均不建议放在 PATH 中

编译阶段

  • 先使用不带并行标志(-j)的 make 运行一次
    并行会导致日志混乱,单进程运行便于观察报错日志
  • 是不是网络问题?挂代理试试
  • 提示 hash 对不上,删了那个文件试试
  • 提示文件夹、软连接无法创建,删了目标文件(夹)试试
  • 出现 C++ 的编译报错,而你又没有改代码。
    • make clean 清理缓存,再试一次
    • make cleanall 清理所有缓存,再试一次
    • 看看是不是没选对 release,直接编译了主分支?

运行阶段

运行阶段的通常涉及到调试 julia,比较复杂。暂略。
相关的文档:


参考列表

更新日志

  • 2022-12-11 初稿
5 个赞

其他的补充:

2023-02-10:目前主线 master (v1.9.0-alpha1+)无法在 MSYS2 下编译。cygwin 不受影响。