*nix 的参见:
开发环境
- 系统 Win 10 x64
- julia v1.8+
- shell 环境:MinGW/MSYS2
- C/C++ 编译器:
gcc
/g++
- 构建系统:
make
MSYS2 默认安装最新的 gcc,这会导致一些兼容性的问题,对于开发使用影响不大。
如果你准备分发自己编译的 julia 二进制文件,建议使用 julialang 的 docker 镜像:juliapackaging/package-windows-x86_64
(Dockerfile)
开发环境选择备注
- 系统环境
- 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 构建。目前暂不支持。
- 在 macOS 上支持
- 构建系统:在某些旧版本上曾经支持 cmake。目前暂不支持。
依赖安装
安装 MSYS2
- 打开官网下载 64 位的安装包: https://www.msys2.org/
下载速度慢可以使用镜像站:msys2/distrib/x86_64
- 正常安装。没有需要特殊配置的地方。
配置 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,比较复杂。暂略。
相关的文档:
参考列表
- 官方 Win 构建文档:Compiling with MinGW/MSYS2
- tuna 镜像源配置:msys2 | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
更新日志
- 2022-12-11 初稿