RustでLLVM IRを扱いたいのにinkwellのコンパイルにコケる
error: No suitable version of LLVM was found system-wide or pointed
to by LLVM_SYS_110_PREFIX.
Consider using `llvmenv` to compile an appropriate copy of LLVM, and
refer to the llvm-sys documentation for more information.
llvm-sys: https://crates.io/crates/llvm-sys
llvmenv: https://crates.io/crates/llvmenv
--> /Users/tsunekawataiki/.cargo/registry/src/github.com-1ecc6299db9ec823/llvm-sys-110.0.1/src/lib.rs:486:1
|
486 | / std::compile_error!(concat!(
487 | | "No suitable version of LLVM was found system-wide or pointed
488 | | to by LLVM_SYS_",
489 | | env!("CARGO_PKG_VERSION_MAJOR"),
... |
496 | | llvmenv: https://crates.io/crates/llvmenv"
497 | | ));
| |___^
こんなエラーが出てコンパイルがコケる
*厳密にはinkwell
が依存しているllvm.sys
のコンパイルにコケているのを解決する話です。
環境
- MacOS Big Sur
- rust 1.53.0
inkwell = { git = "https://github.com/TheDan64/inkwell", branch = "master", features = ["llvm11-0"] }
llvm-sys = "110.0.1"
執筆時点ではinkwell
が LLVM 11までしか対応していなかったのでLLVM 11前提のコマンドを記載しますが、バージョン部分を読み替えれば他のバージョンのLLVMでも大丈夫なはずです。
コンパイルにコケる理由
ズバリ コンパイルにコケる理由は単純でコンパイル時にLLVMがどこにあるかわかっていないからです。
エラーメッセージにも出てくるように環境変数LLVM_SYS_XXX_PREFIX
が設定されていないため、事前条件チェックで失敗しています。
XXX
部分はLLVMのバージョンで今回は11なのでLLVM_SYS_110_PREFIX
となります。
環境変数を設定する
原因がわかったところで環境変数を設定します。
が、環境変数LLVM_SYS_110_PREFIX
にはllvm群がインストールされているディレクトリを設定してあげる必要があるので調べます。
llvmをインストールしていない人はインストールしましょう。
Macであればbrewでインストールできます。
brew install llvm@11
homebrewでインストールした場合は
brew --prefix llvm@11
でインストール先のディレクトリが表示されます。
筆者の環境ではこんな感じでした。
/usr/local/opt/llvm@11
あとは.bash_profile
や.zshrc
あたりに(ここはご利用のshell環境に合わせて読み替えて下さい)
export LLVM_SYS_110_PREFIX="/usr/local/opt/llvm@11"
を追加します。
さいごにsource ~/.zshrc
とするか、ターミナルを再起動して、設定した環境変数を有効にします。
再度コンパイルを試みればコンパイル出来るはずです。