Julia Build(详细说明)
茱莉亚建造
第一次编译时,构建会自动下载预构建的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.
常见问题的故障排除
-
随着时间的推移,基本库中可能有足够的更改,以便在构建系统映像时引导过程失败。 如果发生这种情况,构建可能会失败,并出现类似于以下内容的错误。
*** This error is usually fixed by running 'make clean'. If the error persists, try 'make cleanall' ***
如前所述,执行`make clean&&make’通常就足够了。 有时需要更强的清洁,使用"make cleanall"进行。
-
可能会引入外部依赖关系的新版本,这可能会不时导致与旧版本的现有构建发生冲突。
答:有特殊的"make"文件来帮助清理现有的依赖关系构建。 例如,'make-C deps clean-llvm’将清理’llvm’的现有构建,以便在下次调用`make`时从下载的源发行版重新构建`llvm`。 'make-C deps distclean-llvm’是一个更强大的清理,它也将删除下载的源发行版,确保它的新副本将被下载,并且下次调用`make’时将应用任何新的修复程序。
B.要删除现有的’julia`二进制文件及其所有依赖项,请删除'。源代码tree_中的/usr`目录。
-
如果您最近更新了macOS,请务必运行命令`xcode-select—install’以更新命令行工具。 否则,在缺少标头和库的地方可能会出现错误,例如`ld:library not found for-lcrt1.10.6。o'。
-
如果您已经移动了源代码目录,则可能会出现类似`CMake Error'的错误。:当前的CMakeCache。txt目录。.. 与目录不同。.. 在哪里CMakeCache。txt已创建。`. 在这种情况下,您可以删除`deps`中的冲突依赖项。
-
在极端情况下,可能需要将源代码树返回到其初始状态。 下面的git命令可能很有用。
git reset –hard #Принудительно удаляет любые изменения в любых файлах в системе управления версиями git clean -x -f -d #Принудительно удаляет любые файлы или каталоги вне системы управления версиями
为了避免失去工作成果,请确保 在执行这些命令之前,您知道他们在做什么。 git将无法撤消这些更改!_
必要的构建工具和外部库
要构建Julia,您需要安装以下软件:
-
GNU make--创建依赖项。
-
gcc&g++(>=7.1)或*https://clang.llvm.org [铛]* (>= 5.0, >= 9.3 for Apple Clang)--c,C的编译和链接++.
-
libatomic--由*提供https://gcc.gnu.org [gcc]*并且是支持原子操作所必需的。
-
https://www.python.org /[python](>=2.7)--构建LLVM所需。
-
gfortran--Fortran库的编译和链接。
-
https://www.perl.org [perl]--库头文件的转换。
-
wget,卷曲,或*https://www.freebsd.org/cgi/man.cgi?fetch(1)[fetch]*(FreeBSD)--用于自动加载外部库。
-
https://www.gnu.org/software/m4 [m4]--GMP装配所需。
-
awk--Makefile的辅助工具。
-
patch--更改源代码。
-
https://www.cmake.org [cmake](>=3.4.3)--需要构建`libgit2'。
-
pkg-config--这对于libgit2的正确组装是必要的,特别是对于代理支持。
-
https://docs.microsoft.com/en-us/powershell/scripting/wmf/overview [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源代码存储库中), 然后在第一次运行`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 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[依赖版本号的更新]
有两种类型的程序集。
-
从源代码组装所有组件(
deps/`和`src/
)。 (将`USE_BINARYBUILDER=0’参数添加到’Make。user’file;参见Julia Build。) -
来自源代码('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`
-
更新’deps/openlibm中的版本号。版本` 'OPENLIBM_VER:=0。X.Y` 'OPENLIBM_BRANCH=v0.X.Y` **'OPENLIBM_SHA1=new-sha1-hash`
-
更新`stdlib/OpenLibm_jll/Project中的版本号。汤姆尔` **'版本="0。X.Y+0"`
-
更新’deps/checksums`openlibm’中的校验和 **'make-f contrib/refresh_checksums.mk openlibm`
-
检查补丁文件的deps/patches/openlibm-*的存在。补丁` 如果没有更正,则跳过操作。; 如果有修复,请检查它们是否已与新版本合并,这就是需要删除它们的原因。 删除修复程序时,不要忘记更改相应的Makefile(`deps/openlibm.mk')。