建筑Julia(详细)
下载Julia源代码
如果你在防火墙后面,你可能需要使用 https 协议,而不是 git的 议定书:
git config --global url."https://".insteadOf git://
还要确保将系统配置为使用适当的代理设置,例如通过设置 https_proxy 和 http_proxy 变量。
建筑朱莉娅
第一次编译时,构建会自动下载预构建 外部依赖。 如果您希望自己构建所有依赖项,或者在构建过程中无法访问网络的系统上构建,请将以下内容添加到 做吧。用户:
USE_BINARYBUILDER=0
如果构建所有依赖关系,构建Julia需要5GiB和大约4gib的虚拟内存。
要执行并行构建,请使用 make-j N 并提供最大并发进程数。 如果构建中的默认值对您不起作用,并且您需要设置特定的make参数,则可以将它们保存在 做吧。用户,并将文件放在您的Julia源的根目录中。 构建将自动检查是否存在 做吧。用户 并使用它,如果它存在。
您可以通过指定创建Julia的树外构建 使O=<build-directory>配置 在命令行上。 这将在指定的目录中创建一个目录镜像,其中包含构建Julia所需的所有Makefile。 这些构建将共享Julia中的源文件和 副警长/副警长. 每个树外构建目录都可以有自己的 做吧。用户 文件复盖全局 做吧。用户 顶层文件夹中的文件。
如果一切正常,您将看到一个Julia横幅和一个交互式提示,您可以在其中输入表达式进行评估。 (与库相关的错误可能是由路径中存在的旧的不兼容库引起的。 在这种情况下,请尝试移动 朱莉娅 路径中较早的目录)。 请注意,上面的大多数说明都适用于unix系统。
在任何你能做到的地方运行朱莉娅:
*添加别名(在 巴什: echo"alias julia='/path/to/install/folder/bin/julia'">>/。bashrc&&源/.巴什克),或
*添加软链接到 朱莉娅 可执行文件 朱莉娅 目录至 usr/本地/仓库 (或任何合适的目录已经在你的路径),或
*添加 朱莉娅 此shell会话的可执行路径的目录(在 巴什: 导出路径="$(pwd):$路径" ;在 csh 或 tcsh:
设置路径=( cwd) ),或
*添加 朱莉娅 永久目录到可执行文件路径(例如 .bash_profile),或
*写 前缀=/路径/到/安装/文件夹 进入 做吧。用户 然后运行 进行安装. 如果此文件夹中已经安装了Julia的版本,则应在运行之前将其删除 进行安装.
您可以设置来控制Julia构建的一些选项在文件的开头列出并记录 做吧。公司,但你永远不应该为此编辑它,使用 做吧。用户 相反。
Julia的Makefile定义了方便的自动规则,称为 打印-<VARNAME> 用于打印变量的值,替换 <VARNAME> 用变量的名称来打印值。 例如
$ make print-JULIA_PRECOMPILE
JULIA_PRECOMPILE=1
这些规则对于调试目的很有用。
现在你应该能够像这样运行Julia:
julia
如果您正在构建一个Julia包,以便在Linux、macOS或Windows上分发,请查看https://github.com/JuliaLang/julia/blob/master/doc/src/devdocs/build/distributing.md[distributing.md].
更新现有的源代码树
如果您以前下载过 朱莉娅 使用 git克隆,您可以使用更新现有的源代码树 git拉 而不是重新开始:
cd julia
git pull && make
假设您没有对源树进行任何会与上游更新冲突的更改,这些命令将触发生成以更新到最新版本。
一般故障排除
-
随着时间的推移,基础库可能会累积足够的更改,使得构建系统映像中的引导过程将失败。 如果发生这种情况,构建可能会失败,并出现如下错误
*** This error is usually fixed by running 'make clean'. If the error persists, try 'make cleanall' ***
如所述,运行 清洁&制造 通常是足够的。 偶尔,更强的清理工作 使清洁 是需要的。
-
可能会引入外部依赖关系的新版本,这可能偶尔会导致与旧版本的现有构建发生冲突。 A.特别
使存在目标是为了帮助擦除依赖项的现有构建。 例如,make-C deps clean-llvm将清理现有的llvm所以,llvm将在下次从下载的源发行版重建使被调用。make-C deps distclean-llvm是一个更强的擦除,它也将删除下载的源发行版,确保将下载源发行版的新副本,并且下次应用任何新补丁使被调用。 b.删除现有的二进制文件朱莉娅及其所有依赖项,删除./usr目录_在源树_。 -
如果您最近更新了macOS,请务必运行
xcode-select—install更新命令行工具。 否则,您可能会遇到缺少标头和库的错误,例如ld:-lcrt1.10.6未找到库。o. -
如果您移动了源目录,则可能会出现以下错误
CMake错误:当前的CMakeCache。txt目录。.. 与目录不同。.. 在哪里CMakeCache。txt已创建。,在这种情况下,您可以删除下面的违规依赖项副警长 -
在极端情况下,您可能希望将源树重置为原始状态。 以下git命令可能会有所帮助:
git reset --hard #Forcibly remove any changes to any files under version control
git clean -x -f -d #Forcibly remove any file or directory not under version control
为了避免丢失工作,请确保在运行这些命令之前知道它们的作用。 git的 将无法撤消这些更改!
所需的构建工具和外部库
构建Julia需要安装以下软件:
**https://www.gnu.org/software/make [补丁]:https://www.gnu.org/software/patch [wget]:https://www.gnu.org/software/wget [m4]:https://www.gnu.org/software/m4 [awk]:https://www.gnu.org/software/gawk [gcc]:https://gcc.gnu.org [铛]:https://clang.llvm.org [蟒蛇]:https://www.python.org/[gfortran]:https://gcc.gnu.org/fortran/[卷曲]:https://curl.haxx.se [取]:https://www.freebsd.org/cgi/man.cgi?fetch(1)[perl]:https://www.perl.org [cmake]:https://www.cmake.org [OpenLibm]:https://github.com/JuliaLang/openlibm [DSFMT]:https://github.com/MersenneTwister-Lab/dSFMT [OpenBLAS]:https://github.com/xianyi/OpenBLAS [LAPACK]:https://www.netlib.org/lapack [MKL]:https://software.intel.com/en-us/articles/intel-mkl [SuiteSparse]:https://people.engr.tamu.edu/davis/suitesparse.html [PCRE]:https://www.pcre.org [LLVM]:https://www.llvm.org [LLVM libunwind]:https://github.com/llvm/llvm-project/tree/main/libunwind [FemtoLisp]:https://github.com/JeffBezanson/femtolisp [GMP]:https://gmplib.org [MPFR]:https://www.mpfr.org [libuv]:https://github.com/JuliaLang/libuv [libgit2]:https://libgit2.org/[utf8proc]:https://julialang.org/utf8proc/[libunwind]:https://www.nongnu.org/libunwind [libssh2]:https://www.libssh2.org [OpenSSL]:https://www.openssl.org/[pkg-配置]:https://www.freedesktop.org/wiki/Software/pkg-config/[powershell]:https://docs.microsoft.com/en-us/powershell/scripting/wmf/overview [其中]:https://carlowood.github.io/which/[ITTAPI]:https://github.com/intel/ittapi[GNU make]*--构建依赖项。
**[gcc&g++][gcc]*(>=7.1)或*[Clang][clang]* (>= 5.0, >= 9.3 for Apple Clang)--编译和链接C,C++.
**[libatomic][gcc]*--由*[gcc]*提供,需要支持原子操作。
**[python]*(>=2.7)--构建LLVM所需。
**[gfortran]*--编译和链接Fortran库。
**[perl]*--预处理库的头文件。
**[wget]*、*[curl]*或*[fetch]*(FreeBSD)--自动下载外部库。
**[m4]*--建设GMP所需。
**[awk]*--Makefile的辅助工具。
**[patch]*--用于修改源代码。
**[cmake]*(>=3.4.3)--需要构建 libgit2.
**[pkg-config]*--需要构建 libgit2 正确,特别是对于代理支持。
**[powershell]*(>=3.0)--仅在Windows上必需。
**[which]*--检查构建依赖关系所需。
在基于Debian的发行版(例如Ubuntu)上,您可以轻松地安装它们 apt-get:
sudo apt-get install build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config curl
Julia使用以下外部库,这些库会自动下载(或在少数情况下,包含在Julia源代码存储库中),然后在第一次运行时从源代码编译 使. Julia使用的这些库的具体版本号列于https://github.com/JuliaLang/julia/blob/master/deps/[deps/$(libname)。版本]:
**[LLVM]*(15.0+https://github.com/JuliaLang/llvm-project/tree/julia-release/15.x[patches])--编译器基础结构(参见 下注)。
**[FemtoLisp]*--与Julia source打包,用于实现编译器前端。
**[libuv]*(custom fork)--可移植的、基于事件的高性能I/O库。
**[OpenLibm]*--包含基本数学函数的可移植libm库。
**[DSFMT]*--fast Mersenne Twister伪随机数生成器库。
**[OpenBLAS]*--快速、开放和维护[基本线性代数子程序(BLAS)]
**[LAPACK]*--线性代数例程库,用于求解联立线性方程组、线性方程组的最小二乘解、特征值问题和奇异值问题。
**[MKL]*(可选)--OpenBLAS和LAPACK可能会被英特尔的MKL库所取代。
**[SuiteSparse]*--稀疏矩阵的线性代数例程库。
**[PCRE]*--Perl兼容的正则表达式库。
**[GMP]*--GNU多精度算术库,需要 比金特 支持。
**[MPFR]*--GNU多精度浮点库,任意精度浮点需要([医]大块头)支持。
**[libgit2]*--Git可链接库,Julia的包管理器使用。
**[curl]*--libcurl提供下载和代理支持。
**[libssh2]*--用于SSH传输的库,libgit2用于带有SSH远程的包。
**[OpenSSL]*--用于加密和传输层安全性的库,由libgit2和libssh2使用。
**[utf8proc]*--处理UTF-8编码Unicode字符串的库。
**[LLVM libunwind]*--LLVM的分支[libunwind],一个确定程序调用链的库。
**[ITTAPI]*--英特尔的仪器和跟踪技术以及实时API。
构建依赖项
如果您的系统上已经安装了一个或多个这些包,则可以通过传递来阻止Julia编译这些库的重复项 USE_SYSTEM_。..=1 到 使 或者将行添加到 做吧。用户. 可能的标志的完整列表可以在 做吧。公司.
请注意,此过程不受官方支持,因为它在依赖项的安装和版本控制中引入了额外的可变性,并且仅建议系统包维护者使用。 可能会导致意外的编译错误,因为构建系统不会进行进一步检查以确保安装了正确的软件包。
LLVM
最复杂的依赖是LLVM,我们需要上游的额外补丁(LLVM不向后兼容)。
对于使用LLVM打包Julia,我们建议:
*将仅Julia的LLVM库捆绑在Julia包中,或
*将补丁添加到发行版的LLVM包中。
**补丁的完整列表可在上https://github.com/JuliaLang/llvm-project[Github]查看 朱莉娅-释放/18.x 分支。
**唯一特定于Julia的补丁是lib重命名(llvm7-symver-jlprefix。补丁),这应该_not_应用于系统LLVM。
**其余补丁均为上游bug修复,并已贡献到上游LLVM中。
使用未修补或不同版本的LLVM会导致错误和/或性能不佳。 您可以从远程Git存储库中使用以下选项构建不同版本的LLVM 做吧。用户 档案:
# Force source build of LLVM
USE_BINARYBUILDER_LLVM = 0
# Use Git for fetching LLVM source code
# this is either `1` to get all of them
DEPS_GIT = 1
# or a space-separated list of specific dependencies to download with git
DEPS_GIT = llvm
# Other useful options:
#URL of the Git repository you want to obtain LLVM from:
# LLVM_GIT_URL = ...
#Name of the alternate branch to clone from git
# LLVM_BRANCH = julia-16.0.6-0
#SHA hash of the alternate commit to check out automatically
# LLVM_SHA1 = $(LLVM_BRANCH)
#List of LLVM targets to build. It is strongly recommended to keep at least all the
#default targets listed in `deps/llvm.mk`, even if you don't necessarily need all of them.
# LLVM_TARGETS = ...
#Use ccache for faster recompilation in case you need to restart a build.
# USECCACHE = 1
# CMAKE_GENERATOR=Ninja
# LLVM_ASSERTIONS=1
# LLVM_DEBUG=Symbols
各种构建阶段由特定文件控制:
* deps/llvm。版本 :触摸或更改以检出新版本, 使get-llvm检查-llvm
* deps/srccache/llvm/source-extracted :结果 制作extract-llvm
* deps/llvm/build_Release*/build-configured :结果 制作configure-llvm
* deps/llvm/build_Release*/build-configured :结果 制作compile-llvm
* usr-staging/llvm/build_Release*。tgz,tgz :结果 制作舞台-llvm (再生与 重新安装-llvm)
* usr/清单/llvm :结果 制作install-llvm (再生与 使卸载-llvm)
* make version-check-llvm :每次运行警告用户是否有本地修改
虽然Julia可以使用较新的LLVM版本构建,但对此的支持应该被视为实验性的,不适合打包。
发行版的源发行版
Julia的每个预发布和发布都有一个"全"源分布和一个"光"源分布。
完整的源代码分发包含Julia的源代码和所有依赖项,因此它可以在没有internet连接的情况下从源代码构建。 光源分布不包括依赖关系的源代码。
例如, 朱莉娅-1.0.0.焦油。gz 是光源分布为 v1.0.0 释放朱莉娅,而 朱莉娅-1.0.0-满.焦油。gz 是完整的源分布。
使用stdlib的Git签出从源代码构建Julia
如果您需要使用stdlib的Git签出从源代码构建Julia,请使用 使DEPS_GIT=NAME_OF_STDLIB 在建造朱莉娅的时候。
例如,如果您需要使用Pkg的Git checkout从源代码构建Julia,则使用 使DEPS_GIT=Pkg 在建造朱莉娅的时候。 该 Pkg,Pkg 回购协议在 stdlib/Pkg,并创建最初与分离 头. 如果您是从预先存在的Julia存储库中执行此操作,则可能需要 使清洁 事先。
如果您需要使用多个stdlib的Git签出从源代码构建Julia,那么 部门/部门 应该是stdlib名称的空格分隔列表。 例如,如果您需要使用Pkg,Tar和Downloads的Git checkout从源代码构建Julia,则使用 make DEPS_GIT='Pkg Tar Downloads' 在建造朱莉娅的时候。
建立朱莉娅的"断言构建"
Julia的"断言构建"是一个使用两者构建的构建 FORCE_ASSERTIONS=1 和 LLVM_ASSERTIONS=1. 要构建assert构建,请在您的 做吧。用户 档案:
FORCE_ASSERTIONS=1 LLVM_ASSERTIONS=1
请注意,Julia的assert构建将比常规(非assert)构建慢。
在64位机器上构建32位Julia
偶尔,可能会出现特定于32位体系结构的错误,当发生这种情况时,能够在本地计算机上调试问题是很有用的。 由于大多数现代64位系统都支持运行为32位系统构建的程序,如果您不必从源代码重新编译Julia(例如,您主要需要检查32位Julia的行为而无需触摸C代码),https://julialang.org/downloads/[官方下载页面]。 但是,如果您确实需要从源代码重新编译Julia,一种选择是使用32位系统的Docker容器。 至少现在,构建32位版本的Julia使用以下方法相对简单https://hub.docker.com/r/i386/ubuntu[ubuntu32位docker镜像]。 简而言之,设置后 码头工人 以下是所需的步骤:
$ docker pull i386/ubuntu
$ docker run --platform i386 -i -t i386/ubuntu /bin/bash
此时您应该在32位机器控制台中(请注意 乌纳姆 报告主机架构,所以仍然会说64位,但这不会影响Julia构建)。 您可以添加包并编译代码;当您 出口;出口,所有更改都将丢失,因此请务必在单个会话中完成分析或设置可用于设置环境的复制/粘贴脚本。
从这一点上,你应该
# apt update
(注意 须藤 没有安装,但也没有必要,因为你正在运行 根,所以可以省略 须藤 从所有命令。)
然后添加所有的 构建依赖,您选择的基于控制台的编辑器, git的,以及您需要的其他任何东西(例如, gdb,gdb, 存款准备金率 等)。 选择一个目录来工作, git克隆 Julia,查看您要调试的分支,并像往常一样构建Julia。
更新依赖项的版本号
有两种类型的构建
-
构建一切(
副警长/和src公司/)来自源代码。 (添加USE_BINARYBUILDER=0到做吧。用户,见 建筑物朱莉娅) -
从源代码构建(
src公司/)具有预编译的依赖项(默认)
当您要更新依赖项的版本号时 副警长/,您可能需要使用以下清单:
### Check list
Version numbers:
- [ ] `deps/$(libname).version`: `LIBNAME_VER`, `LIBNAME_BRANCH`, `LIBNAME_SHA1` and `LIBNAME_JLL_VER`
- [ ] `stdlib/$(LIBNAME_JLL_NAME)_jll/Project.toml`: `version`
Checksum:
- [ ] `deps/checksums/$(libname)`
- [ ] `deps/checksums/$(LIBNAME_JLL_NAME)-*/`: `md5` and `sha512`
Patches:
- [ ] `deps/$(libname).mk`
- [ ] `deps/patches/$(libname)-*.patch`
注:
*对于特定的依赖关系,清单中的某些项目可能不存在。 *对于校验和文件,它可能是*没有后缀的单个文件*,或*包含两个文件的文件夹*。
例子:: [医]开放式
-
更新版本号
deps/openlibm。版本**OPENLIBM_VER:=0。X.Y
* OPENLIBM_BRANCH=v0。X.Y
* OPENLIBM_SHA1=new-sha1-hash
-
更新版本号在
stdlib/OpenLibm_jll/项目。汤姆尔**版本="0。X.Y+0" -
更新校验和
deps/校验和/openlibm**make-f contrib/refresh_checksums.mk openlibm -
检查补丁文件
deps/补丁/openlibm-*。补丁存在 **如果补丁不存在,跳过。
*如果存在补丁,请检查它们是否已合并到新版本中并需要删除。 删除补丁时,记得修改对应的Makefile文件(deps/openlibm.mk).