Engee 文档

Julia Build(详细说明)

下载Julia源代码

如果您在防火墙后面,则可能需要使用https协议而不是git协议。

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

请务必在系统中配置适当的代理服务器设置,例如通过设置变量`https_proxy`和`http_proxy'。

茱莉亚建造

第一次编译时,构建会自动下载预构建的external dependencies。 如果您希望自己构建所有依赖项,或者在构建过程中在没有网络访问的系统上构建,请将以下内容添加到"Make"中。用户的文件。

USE_BINARYBUILDER=0

构建Julia需要5GB,如果组装了所有依赖项,以及大约4GB的虚拟内存。

要执行并行构建,请使用’make-j N’并指定并行进程的最大数量。 如果构建中的默认设置不适合您,并且您需要设置特定参数(make),则可以将它们保存到"Make"中。用户’文件并将此文件放在Julia源代码的根目录中。 构建将自动验证"Make"的存在。用户的文件,并将使用它,如果它存在。

您可以通过在命令行中指定`make O=<build-directory>configure`来在树外创建Julia构建。 将创建一个目录镜像,其中包含在指定目录中构建Julia所需的所有Makefile。 这些构建将共享Julia和`deps/srccache’中的源代码文件。 树外的每个构建目录都可以有自己的"Make"。用户’文件,复盖全局’Make。顶级文件夹中的用户文件。

如果一切正常,您将看到Julia横幅和一个交互式窗口,您可以在其中输入计算表达式。 (与库相关的错误可能是由PATH变量中存在旧的不兼容库引起的。 在这种情况下,请尝试将`julia`目录移近路径的开头。)请注意,上面的大多数说明都适用于Unix系统。

要从任何地方启动julia,您可以:

  • 添加一个别名(to’bash':'echo"alias julia='/path/to/install/folder/bin/julia'">>/。bashrc&&源/.bashrc`),或

  • 将`julia’目录中的`julia’可执行文件的flexlink添加到'/usr/local`bin'(或路径中已有的任何合适目录),或者

  • 将`julia`目录添加到此shell会话的可执行文件路径中(在`bash’中:'export PATH="$(pwd):$PATH"';在’csh’或’tcsh’中’set path=( cwd)`),或

  • 将`julia`目录永久添加到可执行文件路径中(例如,在`.bash_profile'),或

  • 将`prefix=/path/to/install/folder`写入’Make。用户’文件,然后运行’make install'。 如果Julia版本已安装在此文件夹中,则应在运行"make install"之前将其删除。

一些可以设置来控制Julia构建的参数在’Make’的开头列出并记录下来。inc’档案。 但它不应该被编辑为此目的。 使用’Make.用户’代替。

Julia中的makefile定义了方便的自动`print-<VARNAME>'规则,用于输出变量值,将`<VARNAME>`替换为需要输出其值的变量的名称。 例如:

$ make print-JULIA_PRECOMPILE
JULIA_PRECOMPILE=1

这些规则对调试很有用。

现在你应该能够运行Julia如下。

julia

如果要构建Julia包以便在Linux、macOS或Windows上分发,请阅读文件中的详细说明。 distributing.md.

更新现有源代码树

如果您以前使用git clone下载了julia,则可以使用git pull更新现有的源代码树,而不是重新开始。

cd julia
git pull && make

假设您没有对源代码树进行任何可能与上游存储库中的更新冲突的更改,这些命令将运行生成更新到最新版本。

常见问题的故障排除

  1. 随着时间的推移,基本库中可能有足够的更改,以便在构建系统映像时引导过程失败。 如果发生这种情况,构建可能会失败,并出现类似于以下内容的错误。

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

    如前所述,执行`make clean&&make’通常就足够了。 有时需要更强的清洁,使用"make cleanall"进行。

  2. 可能会引入外部依赖关系的新版本,这可能会不时导致与旧版本的现有构建发生冲突。

    答:有特殊的"make"文件来帮助清理现有的依赖关系构建。 例如,'make-C deps clean-llvm’将清理’llvm’的现有构建,以便在下次调用`make`时从下载的源发行版重新构建`llvm`。 'make-C deps distclean-llvm’是一个更强大的清理,它也将删除下载的源发行版,确保它的新副本将被下载,并且下次调用`make’时将应用任何新的修复程序。

    B.要删除现有的’julia`二进制文件及其所有依赖项,请删除'。源代码tree_中的/usr`目录。

  3. 如果您最近更新了macOS,请务必运行命令`xcode-select—​install’以更新命令行工具。 否则,在缺少标头和库的地方可能会出现错误,例如`ld:library not found for-lcrt1.10.6。o'。

  4. 如果您已经移动了源代码目录,则可能会出现类似`CMake Error'的错误。:当前的CMakeCache。txt目录。.. 与目录不同。.. 在哪里CMakeCache。txt已创建。`. 在这种情况下,您可以删除`deps`中的冲突依赖项。

  5. 在极端情况下,可能需要将源代码树返回到其初始状态。 下面的git命令可能很有用。

     git reset –hard #Принудительно удаляет любые изменения в любых файлах в системе управления версиями
     git clean -x -f -d #Принудительно удаляет любые файлы или каталоги вне системы управления версиями

为了避免失去工作成果,请确保 在执行这些命令之前,您知道他们在做什么。 git将无法撤消这些更改!_

特定于平台的说明

不同操作系统的注意事项:

不同架构的注意事项:

必要的构建工具和外部库

要构建Julia,您需要安装以下软件:

在基于Debian的发行版(例如Ubuntu)中,可以使用`apt-get`轻松安装它们:

sudo apt-get install build-essential libatomic1 python gfortran perl wget m4 cmake pkg-config curl

Julia使用以下外部库,这些库是自动的 下载(或在某些情况下包含在Julia源代码存储库中), 然后在第一次运行`make`时从源代码编译。 Julia使用的这些库的具体版本号 列于https://github.com/JuliaLang/julia/blob/master/deps /['deps/$(libname)。版本']:

  • https://www.llvm.org [LLVM](15.0+https://github.com/JuliaLang/llvm-project/tree/julia-release/15.x [patches])--compiler infrastructure(参见note below)。

  • https://github.com/JeffBezanson/femtolisp [FemtoLisp]--与Julia源代码捆绑在一起,用于实现编译器的前端。

  • https://github.com/JuliaLang/libuv [libuv](custom fork)是一个可移植的、基于事件的高性能I/O库。

  • *https://github.com/JuliaLang/openlibm [OpenLibm]*是一个包含基本数学函数的可移植libm库。

  • DSFMT--fast Mersenne Twister伪随机数生成器库。

  • OpenBLAS--快速,开放和支持[基本线性代数子程序(BLAS)]

  • LAPACK--线性代数例程库,用于求解线性方程组、最小二乘方程线性系统解、特征值问题和奇异值问题。

  • MKL(可选)--OpenBLAS和LAPACK可以被英特尔的MKL库取代。

  • SuiteSparse--稀疏矩阵的线性代数例程库。

  • PCRE--一个Perl兼容的正则表达式库。

  • GMP--支持"BigInt"所需的GNU多精度算术库。

  • MPFR--多精度浮点计算的GNU库,支持任意精度浮点('BigFloat')所必需的。

  • https://libgit2.org /[libgit2]--Julia包管理器使用的Git库。

  • https://curl.haxx.se [curl]--libcurl提供下载和代理支持。

  • *https://www.libssh2.org [libssh2]*是libgit2用于远程SSH包的SSH传输库。

  • *https://tls.mbed.org /[mbedtls]*是用于加密和传输层安全性的库,由libssh2使用。

  • utf8proc--处理UTF-8编码的Unicode字符串的库。

  • LLVM libunwind--LLVM的fork from https://www.nongnu.org/libunwind [libunwind],定义程序调用链的库。

  • ITTAPI--英特尔仪器和跟踪技术以及实时API。

构建依赖项

如果您的系统上已经安装了一个或多个这些软件包,则可以通过传递`USE_SYSTEM_来阻止Julia编译这些库的重复项。..=1`在’make’中或通过将此行添加到’Make。户'。 可能的标志的完整列表可以在’Make’中找到。公司'。

请注意,官方不支持此过程,因为它在依赖项的安装和版本控制中引入了额外的可变性,并且仅建议系统管理员使用。 可能会发生意外的编译错误,因为构建系统不会执行进一步的检查以确保安装了正确的软件包。

LLVM

最困难的依赖是LLVM,为此我们需要开发人员提供额外的补丁(LLVM不向后兼容)。

对于使用LLVM打包的Julia,我们建议:

  • 在Julia包中包含仅Julia的LLVM库,或者

  • 将补丁添加到LLVM分发包中。 补丁的完整列表可在https://github.com/JuliaLang/llvm-project [Github]在`julia-release/15。x’分支。 Julia特有的唯一补丁是库的重命名’llvm7-symver-jlprefix。补丁`),其不应应用于系统LLVM。 **其余补丁是源代码中的错误修复,已转移到LLVM源代码。

使用未校正或不同版本的LLVM会导致错误和/或性能降低。 您可以使用"Make"中的以下选项从远程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

#其他有用的选项:
#要从中获取LLVM的Git存储库的URL:
#LLVM_GIT_URL=。..
#要从git克隆的备用分支的名称
#LLVM_BRANCH=julia-16.0.6-0
#自动签出的更改提交的SHA哈希
#LLVM_SHA1=$(LLVM_BRANCH)
#要构建的LLVM目标列表。  强烈建议至少保留所有
#在`deps/llvm.mk`中列出的默认目标,即使您不一定需要所有目标。
#LLVM_TARGETS=。..
#如果您需要重新启动构建,请使用ccache进行更快的重新编译。
#USECCACHE=1
#CMAKE_GENERATOR=忍者
#LLVM_ASSERTIONS=1
#LLVM_DEBUG=符号

构建的各个阶段由特定文件控制。:

  • 'deps/llvm。version`:change to check the new version,'make get-llvm check-llvm`

  • 'deps/srccache/llvm`source-extracted':执行’make extract-llvm`的结果

  • 'deps/llvm/build_Release*/build-configured':执行’make configure-llvm’的结果

  • 'deps/llvm/build_Release*/build-configured':执行’make compile-llvm’的结果

  • 'usr-staging/llvm/build_Release*。tgz`:执行’make stage-llvm’的结果(使用’make reinstall-llvm’重新创建)

  • 'usr/manifest/llvm':执行’make install-llvm’的结果(使用`make uninstall-llvm’重新创建)

  • 'make version-check-llvm':每次运行以警告用户本地更改的存在

尽管Julia可以使用较新版本的LLVM构建,但它们的支持应该被认为是实验性的,不适合打包。

link:@id libuv[libuv]

Julia使用libuv的自定义分支。 这是一个小的依赖项,它可以安全地包含在与Julia相同的包中;它不会与系统库冲突。 Julia_builds不应该使用libuv系统分叉。

link:@id BLAS-and-LAPACK[布拉斯和拉帕克]

作为一种高性能的数值计算语言,Julia应该链接到多线程BLAS和LAPACK,如OpenBLAS或ATLAS,这将提供比在某些系统上默认使用的参考libblas实现高得多的性能。

link:@id Source-distributions-of-releases[发行版的源代码分发]

每个pre-release和Julia release都有完整的源代码分发和轻量级的源代码分发。

完整发行版包含Julia源代码和所有依赖项,因此可以在没有internet连接的情况下从源代码构建Julia。 轻量级发行版不包含依赖项的源代码。

例如,'julia-1.0.0。焦油。gz'--这是一个轻量级的源代码发行版,用于发布`V1.0.0`Julia和`julia-1.0.0-full。焦油。gz`--这是源代码的完整分发。

link:@id Building-Julia-from-source-with-a-Git-checkout-of-a-stdlib[使用git checkout库stdlib从源代码构建Julia]

如果您需要使用Git checkout从源代码构建Julia用于Pkg,Tar和下载,请在构建时使用’make DEPS_GIT=NAME_OF_STDLIB'。

例如,如果您需要使用Git checkout for Pkg从源代码构建Julia,则在构建时使用’make DEPS_GIT=Pkg'。 'Pkg`存储库位于`stdlib/Pkg`中,最初创建时禁用了`HEAD'。 如果您是从现有的Julia存储库构建的,则可能需要先执行"make clean"。

如果您需要使用git checkout从源代码构建Julia几个stdlib库,'DEPS_GIT’应该是用空格分隔的stdlib库名称列表。 例如,如果您需要使用Git checkout从源代码构建Julia用于Pkg,Tar和下载,请在构建时使用’make DEPS_GIT='Pkg Tar Downloads'。

link:@id Building-an-[建立Julia语句的集合]

Julia语句程序集是使用`FORCE_ASSERTIONS=1`和`LLVM_ASSERTIONS=1’创建的程序集。 要构建审批程序集,请在"Make"中定义以下两个变量。用户的文件。

FORCE_ASSERTIONS=1
LLVM_ASSERTIONS=1

请注意,Julia批准构建的运行速度将比常规(非批准)构建慢。

link:@id Building-32-bit-Julia-on-a-64-bit-machine[在64位计算机上构建32位版本的Julia]

有时可能存在特定于32位体系结构的错误。 在这种情况下,能够在本地计算机上调试问题将非常有用。 大多数现代64位系统支持为32位系统设计的程序的执行。 因此,如果您不需要从源代码重新编译Julia(例如,您只需要在不接触C代码的情况下测试Julia的32位版本),那么很可能您可以为您的系统使用32位Julia构建,可在https://julialang.org/downloads /[官方下载文件页面]。 但是,如果您需要从源代码重新编译Julia,一种选择是使用具有32位系统的Docker容器。 至少现在,构建Julia的32位版本相对简单,使用https://hub.docker.com/r/i386/ubuntu [来自Ubuntu的32位Docker镜像]。 总之,配置docker后,需要执行以下步骤。

$ docker pull i386/ubuntu
$ docker run –platform i386 -i -t i386/ubuntu /bin/bash

在这个阶段,32位计算机的控制台应该是打开的(注意,`uname`命令告诉主计算机的体系结构,因此将输出64位体系结构,但这不会影响Julia构建)。 您可以添加包和编译代码;当执行’exit’命令时,所有更改都将丢失,因此您应该在一个会话中完成分析或配置复制的脚本以配置环境。

接下来,运行以下命令:

# apt update

(请注意,没有安装sudo程序,但不需要它,因为您正在使用root用户权限,并且可以在所有命令中省略sudo。)

然后添加所有[required-build-tools-and-external-libraries,build dependencies],您选择的控制台编辑器,git程序以及您可能需要的任何其他内容(例如`gdb,rr等). 选择工作目录,运行Julia存储库的’git clone’命令,提取要调试的分支,并正常构建Julia。

link:@id Update-the-version-number-of-a-dependency[依赖版本号的更新]

有两种类型的程序集。

  1. 从源代码组装所有组件(deps/`和`src/)。 (将`USE_BINARYBUILDER=0’参数添加到’Make。user’file;参见Julia Build。)

  2. 来自源代码('src/`)的程序集,具有预编译的依赖项(默认情况下)。

如果要更新’deps’中的依赖项版本号,请使用以下清单。

### Контрольный список
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`

注意。

  • 对于某些依赖项,清单的某些元素可能会丢失。

  • 校验和文件可以是没有后缀的*单独文件*,也可以是包含两个文件的*文件夹*。

例如:'OpenLibm`

  1. 更新’deps/openlibm中的版本号。版本` 'OPENLIBM_VER:=0。X.Y` 'OPENLIBM_BRANCH=v0.X.Y` **'OPENLIBM_SHA1=new-sha1-hash`

  2. 更新`stdlib/OpenLibm_jll/Project中的版本号。汤姆尔` **'版本="0。X.Y+0"`

  3. 更新’deps/checksums`openlibm’中的校验和 **'make-f contrib/refresh_checksums.mk openlibm`

  4. 检查补丁文件的deps/patches/openlibm-*的存在。补丁` 如果没有更正,则跳过操作。; 如果有修复,请检查它们是否已与新版本合并,这就是需要删除它们的原因。 删除修复程序时,不要忘记更改相应的Makefile(`deps/openlibm.mk')。