AnyMath 文档

建筑Julia(详细)

下载Julia源代码

如果你在防火墙后面,你可能需要使用 https 协议,而不是 git的 议定书:

git config --global url."https://".insteadOf git://

还要确保将系统配置为使用适当的代理设置,例如通过设置 https_proxyhttp_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):$路径" ;在 cshtcsh:

设置路径=( 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

假设您没有对源树进行任何会与上游更新冲突的更改,这些命令将触发生成以更新到最新版本。

一般故障排除

  1. 随着时间的推移,基础库可能会累积足够的更改,使得构建系统映像中的引导过程将失败。 如果发生这种情况,构建可能会失败,并出现如下错误

   &ast;&ast;&ast; This error is usually fixed by running 'make clean'. If the error persists, try 'make cleanall' &ast;&ast;&ast;

如所述,运行 清洁&制造 通常是足够的。 偶尔,更强的清理工作 使清洁 是需要的。

  1. 可能会引入外部依赖关系的新版本,这可能偶尔会导致与旧版本的现有构建发生冲突。 A.特别 使 存在目标是为了帮助擦除依赖项的现有构建。 例如, make-C deps clean-llvm 将清理现有的 llvm 所以, llvm 将在下次从下载的源发行版重建 使 被调用。 make-C deps distclean-llvm 是一个更强的擦除,它也将删除下载的源发行版,确保将下载源发行版的新副本,并且下次应用任何新补丁 使 被调用。 b.删除现有的二进制文件 朱莉娅 及其所有依赖项,删除 ./usr 目录_在源树_。

  2. 如果您最近更新了macOS,请务必运行 xcode-select—​install 更新命令行工具。 否则,您可能会遇到缺少标头和库的错误,例如 ld:-lcrt1.10.6未找到库。o.

  3. 如果您移动了源目录,则可能会出现以下错误 CMake错误:当前的CMakeCache。txt目录。.. 与目录不同。.. 在哪里CMakeCache。txt已创建。,在这种情况下,您可以删除下面的违规依赖项 副警长

  4. 在极端情况下,您可能希望将源树重置为原始状态。 以下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使用libuv的自定义分支。 它是一个很小的依赖项,可以安全地与Julia捆绑在同一个包中,并且不会与系统库冲突。 Julia构建应该_not_尝试使用系统libuv。

布拉斯和拉帕克

作为一种高性能的数值语言,Julia应该链接到多线程BLAS和LAPACK,如OpenBLAS或ATLAS,这将提供比参考更好的性能 利布拉斯 在某些系统上可能是默认的实现。

发行版的源发行版

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=1LLVM_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。

更新依赖项的版本号

有两种类型的构建

  1. 构建一切(副警长/src公司/)来自源代码。 (添加 USE_BINARYBUILDER=0做吧。用户,见 建筑物朱莉娅)

  2. 从源代码构建(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)-&ast;/`: `md5` and `sha512`

Patches:
- [ ] `deps/$(libname).mk`
- [ ] `deps/patches/$(libname)-&ast;.patch`

注:

*对于特定的依赖关系,清单中的某些项目可能不存在。 *对于校验和文件,它可能是*没有后缀的单个文件*,或*包含两个文件的文件夹*。

例子:: [医]开放式

  1. 更新版本号 deps/openlibm。版本 ** OPENLIBM_VER:=0。X.Y

* OPENLIBM_BRANCH=v0。X.Y * OPENLIBM_SHA1=new-sha1-hash

  1. 更新版本号在 stdlib/OpenLibm_jll/项目。汤姆尔 ** 版本="0。X.Y+0"

  2. 更新校验和 deps/校验和/openlibm ** make-f contrib/refresh_checksums.mk openlibm

  3. 检查补丁文件 deps/补丁/openlibm-*。补丁 存在 **如果补丁不存在,跳过。

*如果存在补丁,请检查它们是否已合并到新版本中并需要删除。 删除补丁时,记得修改对应的Makefile文件(deps/openlibm.mk).