Building Julia (Detailed)
Downloading the Julia source code
ファイアウォールの背後にいる場合は、gitプロトコルの代わりにhttpsプロトコルを使用する必要があるかもしれません:
git config --global url."https://".insteadOf git://システムが適切なプロキシ設定を使用するように構成することも忘れないでください。たとえば、https_proxyおよびhttp_proxy変数を設定することによってです。
Building Julia
初回コンパイル時に、ビルドは自動的にプリビルドされた external dependencies をダウンロードします。すべての依存関係を自分でビルドしたい場合や、ビルドプロセス中にネットワークにアクセスできないシステムでビルドしている場合は、Make.user に以下を追加してください:
USE_BINARYBUILDER=0Juliaをビルドするには、すべての依存関係をビルドする場合に5GiB、仮想メモリとして約4GiBが必要です。
並列ビルドを実行するには、make -j Nを使用し、同時に実行するプロセスの最大数を指定します。ビルドのデフォルトがうまくいかない場合や、特定のmakeパラメータを設定する必要がある場合は、それらをMake.userに保存し、そのファイルをJuliaソースのルートに置くことができます。ビルドは自動的にMake.userの存在を確認し、存在する場合はそれを使用します。
Juliaのアウトオブツリービルドを作成するには、コマンドラインで make O=<build-directory> configure を指定します。これにより、指定されたディレクトリにJuliaをビルドするために必要なすべてのMakefileを含むディレクトリミラーが作成されます。これらのビルドは、Juliaのソースファイルと deps/srccache を共有します。各アウトオブツリービルドディレクトリには、トップレベルフォルダのグローバル Make.user ファイルをオーバーライドするための独自の Make.user ファイルを持つことができます。
すべてが正しく動作すれば、Juliaのバナーと、評価のために式を入力できるインタラクティブなプロンプトが表示されます。(ライブラリに関連するエラーは、PATH内に古い互換性のないライブラリが存在することが原因かもしれません。この場合、juliaディレクトリをPATHの前方に移動してみてください)。上記の指示のほとんどはunixシステムに適用されることに注意してください。
どこからでもJuliaを実行するには、次のようにします:
- エイリアスを追加します(
bashの場合:echo "alias julia='/path/to/install/folder/bin/julia'" >> ~/.bashrc && source ~/.bashrc)、または juliaディレクトリ内のjulia実行可能ファイルへのソフトリンクを/usr/local/bin(またはパスに既に含まれている適切なディレクトリ)に追加します。- このシェルセッションの実行可能パスに
juliaディレクトリを追加します(bashの場合:export PATH="$(pwd):$PATH";cshまたはtcshの場合:
set path= ( $path $cwd ) ), または
juliaディレクトリを実行可能パスに永続的に追加します(例:.bash_profileで)、またはMake.userにprefix=/path/to/install/folderを書き込み、その後make installを実行します。このフォルダーにすでにインストールされているJuliaのバージョンがある場合は、make installを実行する前にそれを削除する必要があります。
Juliaのビルドを制御するために設定できるオプションのいくつかは、ファイルMake.incの冒頭にリストされ、文書化されていますが、この目的のためにそれを編集するべきではなく、代わりにMake.userを使用してください。
JuliaのMakefileは、変数の値を印刷するための便利な自動ルール print-<VARNAME> を定義しています。ここで <VARNAME> は印刷する変数の名前に置き換えられます。例えば、
$ make print-JULIA_PRECOMPILE
JULIA_PRECOMPILE=1これらのルールはデバッグ目的で役立ちます。
今、あなたは次のようにJuliaを実行できるはずです:
juliaLinux、macOS、またはWindowsで配布するためのJuliaパッケージを構築している場合は、distributing.mdの詳細なノートを確認してください。
Updating an existing source tree
以前に git clone を使用して julia をダウンロードした場合は、新たに始めるのではなく、git pull を使用して既存のソースツリーを更新できます。
cd julia
git pull && makeソースツリーにアップストリームの更新と競合する変更を加えていないと仮定すると、これらのコマンドは最新バージョンに更新するためのビルドをトリガーします。
General troubleshooting
時間が経つにつれて、ベースライブラリに十分な変更が蓄積されると、システムイメージを構築する際のブートストラッププロセスが失敗する可能性があります。これが発生した場合、ビルドは次のようなエラーで失敗する可能性があります。
sh *** This error is usually fixed by running 'make clean'. If the error persists, try 'make cleanall' ***説明したように、
make clean && makeを実行することが通常は十分です。時々、make cleanallによるより強力なクリーンアップが必要になります。新しいバージョンの外部依存関係が導入されることがあり、これが時折、古いバージョンの既存ビルドと衝突を引き起こす可能性があります。
a. 特別な
makeターゲットが存在し、依存関係の既存のビルドを消去するのに役立ちます。例えば、make -C deps clean-llvmは、既存のllvmのビルドをクリーンアップし、次回makeが呼び出されたときにllvmがダウンロードされたソース配布から再ビルドされるようにします。make -C deps distclean-llvmは、より強力な消去で、ダウンロードされたソース配布も削除されるため、次回makeが呼び出されたときに新しいソース配布のコピーがダウンロードされ、新しいパッチが適用されることが保証されます。b. 既存の
juliaとそのすべての依存関係のバイナリを削除するには、ソースツリー内の./usrディレクトリを削除してください。最近macOSを更新した場合は、
xcode-select --installを実行してコマンドラインツールを更新してください。そうしないと、ld: library not found for -lcrt1.10.6.oのようなヘッダーやライブラリが見つからないエラーが発生する可能性があります。ソースディレクトリを移動した場合、
CMake Error: The current CMakeCache.txt directory ... is different than the directory ... where CMakeCache.txt was created.のようなエラーが発生することがあります。この場合、depsの下にある問題のある依存関係を削除することができます。極端な場合、ソースツリーを元の状態にリセットしたいかもしれません。以下のgitコマンドが役立つかもしれません:
sh 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はこれらの変更を元に戻すことができません!
Platform-Specific Notes
さまざまなオペレーティングシステムのノート:
さまざまなアーキテクチャに関するノート:
Required Build Tools and External Libraries
Juliaをビルドするには、以下のソフトウェアがインストールされている必要があります:
- [GNU make] — 依存関係の構築。
- [gcc & g++][gcc] (>= 7.1) または [Clang][clang] (>= 5.0, Apple Clang の場合は >= 9.3) — 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 curlJuliaは、次の外部ライブラリを使用しており、これらは自動的にダウンロードされ(または一部はJuliaソースリポジトリに含まれ)、最初にmakeを実行したときにソースからコンパイルされます。Juliaが使用するこれらのライブラリの特定のバージョン番号は、deps/$(libname).versionにリストされています。
- [LLVM] (15.0 + patches) — コンパイラインフラストラクチャ (see note below)。
- [FemtoLisp] — Juliaソースと共にパッケージ化され、コンパイラのフロントエンドを実装するために使用されます。
- [libuv] (カスタムフォーク) — ポータブルで高性能なイベントベースのI/Oライブラリ。
- [OpenLibm] — 基本的な数学関数を含むポータブルlibmライブラリ。
- [DSFMT] — 高速メルセンヌツイスタ擬似乱数生成器ライブラリ。
- [OpenBLAS] — 高速でオープン、かつメンテナンスされている [基本線形代数サブルーチン (BLAS)]
- [LAPACK] — 同時線形方程式の系を解くための線形代数ルーチンのライブラリ、線形方程式系の最小二乗解、固有値問題、および特異値問題。
- [MKL] (オプション) – OpenBLAS と LAPACK は Intel の MKL ライブラリに置き換えられる可能性があります。
- [SuiteSparse] — スパース行列のための線形代数ルーチンのライブラリ。
- [PCRE] — Perl互換の正規表現ライブラリ。
- [GMP] — GNU多倍精度算術ライブラリ、
BigIntサポートに必要です。 - [MPFR] — GNU 多倍精度浮動小数点ライブラリで、任意精度浮動小数点(
BigFloat)サポートに必要です。 - [libgit2] — Juliaのパッケージマネージャーで使用される、Gitリンク可能ライブラリ。
- [curl] — libcurlはダウンロードとプロキシサポートを提供します。
- [libssh2] — SSHトランスポート用のライブラリで、SSHリモートを持つパッケージのためにlibgit2によって使用されます。
- [OpenSSL] — 暗号化とトランスポート層セキュリティに使用されるライブラリで、libgit2およびlibssh2によって使用されます。
- [utf8proc] — UTF-8エンコードされたUnicode文字列を処理するためのライブラリ。
- [LLVM libunwind] — LLVMの[libunwind]のフォークで、プログラムのコールチェーンを特定するライブラリです。
- [ITTAPI] — インテルの計測およびトレース技術とジャストインタイムAPI。
[GNU make]: https://www.gnu.org/software/make [patch]: 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 [clang]: https://clang.llvm.org [python]: https://www.python.org/ [gfortran]: https://gcc.gnu.org/fortran/ [curl]: https://curl.haxx.se [fetch]: 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-config]: https://www.freedesktop.org/wiki/Software/pkg-config/ [powershell]: https://docs.microsoft.com/en-us/powershell/scripting/wmf/overview [which]: https://carlowood.github.io/which/ [ITTAPI]: https://github.com/intel/ittapi
Build dependencies
システムにこれらのパッケージの1つ以上が既にインストールされている場合、USE_SYSTEM_...=1をmakeに渡すか、Make.userに行を追加することで、Juliaがこれらのライブラリの重複をコンパイルするのを防ぐことができます。可能なフラグの完全なリストはMake.incにあります。
この手順は公式にサポートされていないことに注意してください。これは、依存関係のインストールとバージョン管理に追加の変動をもたらすためであり、システムパッケージのメンテナンス担当者のみに推奨されます。ビルドシステムは、適切なパッケージがインストールされていることを確認するためのさらなるチェックを行わないため、予期しないコンパイルエラーが発生する可能性があります。
LLVM
最も複雑な依存関係はLLVMであり、追加のパッチが上流から必要です(LLVMは後方互換性がありません)。
JuliaをLLVMと一緒にパッケージ化するには、次のいずれかをお勧めします:
Juliaパッケージ内にJulia専用のLLVMライブラリをバンドルすること、または
配布のLLVMパッケージにパッチを追加します。
- Github に完全なパッチのリストが利用可能であり、
julia-release/18.xブランチを参照してください。 - 唯一のJulia特有のパッチはlibの名前変更(
llvm7-symver-jlprefix.patch)であり、これはシステムLLVMに適用すべきではありません。 - 残りのパッチはすべて上流のバグ修正であり、上流のLLVMに寄稿されています。
- Github に完全なパッチのリストが利用可能であり、
未修正のLLVMまたは異なるバージョンを使用すると、エラーやパフォーマンスの低下が発生します。次のオプションを使用して、リモートGitリポジトリから異なるバージョンのLLVMをビルドできます Make.user ファイル:
# 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.version: 新しいバージョンをチェックアウトするためにタッチまたは変更し、make get-llvm check-llvmdeps/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バージョンでビルドすることができますが、これに対するサポートは実験的なものであり、パッケージングには適していないと見なされるべきです。
libuv
Juliaはlibuvのカスタムフォークを使用しています。これは小さな依存関係であり、Juliaと同じパッケージに安全にバンドルでき、システムライブラリと競合することはありません。Juliaのビルドはシステムlibuvを使用しようとするべきではありません。
BLAS and LAPACK
高性能の数値言語として、JuliaはOpenBLASやATLASのようなマルチスレッドBLASおよびLAPACKにリンクされるべきであり、これにより一部のシステムでデフォルトとなる可能性のある参照libblas実装よりもはるかに優れたパフォーマンスが提供されます。
Source distributions of releases
各プレリリースおよびリリースのJuliaには、「フル」ソース配布と「ライト」ソース配布があります。
フルソースディストリビューションには、Juliaのソースコードとすべての依存関係が含まれており、インターネット接続なしでソースからビルドできます。ライトソースディストリビューションには、依存関係のソースコードは含まれていません。
例えば、julia-1.0.0.tar.gz は Julia の v1.0.0 リリースの軽量ソース配布であり、julia-1.0.0-full.tar.gz は完全なソース配布です。
Building Julia from source with a Git checkout of a stdlib
Juliaをソースからビルドする必要があり、標準ライブラリのGitチェックアウトを使用する場合は、Juliaをビルドする際にmake DEPS_GIT=NAME_OF_STDLIBを使用してください。
たとえば、PkgのGitチェックアウトを使用してJuliaをソースからビルドする必要がある場合は、Juliaをビルドする際にmake DEPS_GIT=Pkgを使用してください。Pkgリポジトリはstdlib/Pkgにあり、最初はデタッチされたHEADで作成されます。既存のJuliaリポジトリからこれを行う場合は、事前にmake cleanを実行する必要があるかもしれません。
もし複数の標準ライブラリのGitチェックアウトを使用してJuliaをソースからビルドする必要がある場合、DEPS_GITは標準ライブラリ名のスペース区切りリストである必要があります。たとえば、Pkg、Tar、およびDownloadsのGitチェックアウトを使用してJuliaをソースからビルドする必要がある場合、Juliaをビルドする際にmake DEPS_GIT='Pkg Tar Downloads'を使用してください。
Building an "assert build" of Julia
"アサートビルド"のJuliaは、FORCE_ASSERTIONS=1とLLVM_ASSERTIONS=1の両方でビルドされたものです。アサートビルドを作成するには、Make.userファイルに以下の2つの変数を定義します:
FORCE_ASSERTIONS=1
LLVM_ASSERTIONS=1アサートビルドのJuliaは、通常の(非アサート)ビルドよりも遅くなることに注意してください。
Building 32-bit Julia on a 64-bit machine
時折、32ビットアーキテクチャに特有のバグが発生することがあります。このような場合、ローカルマシンで問題をデバッグできることが役立ちます。ほとんどの現代の64ビットシステムは、32ビット用にビルドされたプログラムを実行することをサポートしているため、ソースからJuliaを再コンパイルする必要がない場合(例えば、Cコードに触れることなく32ビットのJuliaの動作を主に調査する必要がある場合)、official downloads pageから取得できる32ビットビルドのJuliaを使用できる可能性があります。しかし、ソースからJuliaを再コンパイルする必要がある場合の1つの選択肢は、32ビットシステムのDockerコンテナを使用することです。少なくとも今のところ、ubuntu 32-bit docker imagesを使用して32ビット版のJuliaをビルドするのは比較的簡単です。簡単に言うと、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を省略できます。)
次に、すべての build dependencies、お好みのコンソールベースのエディタ、git、および必要なその他のもの(例:gdb、rr など)を追加します。作業するディレクトリを選択し、git clone で Julia をクローンし、デバッグしたいブランチをチェックアウトし、通常通りに Julia をビルドします。
Update the version number of a dependency
ビルドには2つのタイプがあります。
- ソースコードからすべてをビルドします(
deps/とsrc/)。 (Make.userにUSE_BINARYBUILDER=0を追加してください。詳細は Building Julia を参照) - ソースからビルドする(
src/)プリコンパイルされた依存関係付き(デフォルト)
deps/内の依存関係のバージョン番号を更新したい場合は、次のチェックリストを使用することをお勧めします:
### 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`注意:
- 特定の依存関係に対して、チェックリストのいくつかの項目が存在しない場合があります。
- チェックサムファイルは、サフィックスのない単一のファイルであるか、2つのファイルを含むフォルダーである可能性があります。
Example: OpenLibm
deps/openlibm.versionのバージョン番号を更新してください。OPENLIBM_VER := 0.X.YOPENLIBM_BRANCH = v0.X.YOPENLIBM_SHA1 = new-sha1-hash
stdlib/OpenLibm_jll/Project.tomlのバージョン番号を更新してください。version = "0.X.Y+0"
deps/checksums/openlibmのチェックサムを更新します。make -f contrib/refresh_checksums.mk openlibm
deps/patches/openlibm-*.patchファイルが存在するか確認してください。- パッチが存在しない場合は、スキップしてください。
- パッチが存在する場合は、それらが新しいバージョンにマージされているかどうかを確認し、削除する必要があるかを確認してください。パッチを削除する際は、対応するMakefileファイル(
deps/openlibm.mk)を修正することを忘れないでください。