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とするか、ターミナルを再起動して、設定した環境変数を有効にします。

再度コンパイルを試みればコンパイル出来るはずです。