## Installation
Installation cannot be done fully automatically.
It would require Cabal code that is bound to certain Cabal versions
and is prone to fail.
We give several non-automatic ways
that also allow you to choose a particular LLVM version.
First possibility is to point Cabal
to the LLVM installation directories manually.
It is recommended to add options to your global `.cabal/config`:
~~~~
extra-include-dirs: /usr/lib/llvm-21/include
extra-lib-dirs: /usr/lib/llvm-21/lib
~~~~
This works for both `v1-build` and `v2-build`.
The shown paths work for Debian and Ubuntu
using the LLVM repositories at .
You can obtain them with
~~~~
llvm-config-21 --includedir --libdir
~~~~
You can choose specific LLVM versions per project.
For `v1-builds` it works like so:
~~~~
cabal install -fllvm1300 --extra-include-dirs=$(llvm-config-13 --includedir) --extra-lib-dirs=$(llvm-config-13 --libdir) yourpackage
~~~~
For Nix-style build you must add some options
to the `cabal.project.local` file of your LLVM-related project:
~~~~
package llvm-ffi
flags: +llvm1300
extra-include-dirs: /usr/lib/llvm-13/include
extra-lib-dirs: /usr/lib/llvm-13/lib
~~~~
Alternatively, you may set environment variables globally or locally:
~~~~
export CPATH=/usr/lib/llvm-21/include:$CPATH
export C_INCLUDE_PATH=/usr/lib/llvm-21/include:$C_INCLUDE_PATH
export LD_LIBRARY_PATH=/usr/lib/llvm-21/lib:$LD_LIBRARY_PATH
~~~~
You can install and make LLVM library available
in an elegant way using Nix:
~~~~
nix-shell -p llvmPackages_21.libllvm
~~~~
Though, for compatibility of GHC with LLVM and GLIBC
you will need to use more packages from Nix
and you better use a `shell.nix` file for bundling those:
~~~~
let
pkgs = import {};
llvmPkgs = pkgs.llvmPackages_21.libllvm;
in
pkgs.mkShell {
nativeBuildInputs = (with pkgs; [
gnumake
pkg-config
ghc
cabal-install
llvmPkgs
]);
CPATH="${llvmPkgs.dev}/include";
C_INCLUDE_PATH="${llvmPkgs.dev}/include";
LD_LIBRARY_PATH="${llvmPkgs.lib}/lib";
}
~~~~
The second way uses `pkg-config`.
You can store above paths permanently in a `pkg-config` file like `llvm.pc`.
The optimal way would be if LLVM installations or GNU/Linux distributions
would contain such a file, but they don't.
Instead, you may generate it using the `llvm-pkg-config` package
or write one manually.
Then you run
~~~~
cabal install -fpkgConfig
~~~~
Warning for inplace builds:
Re-configuring the package using, say `-fllvm1600`,
and re-buildung it might result in corrupt code.
You must make sure that the stuff in `cbits` is re-compiled.
Cabal or GHC may forget about that.
You are safe if you run `cabal clean`.
Caution: Nasty crashes can occur
if you have configured paths for LLVM version X in `.cabal/config`
and try to build `llvm-ffi` for a different LLVM version Y.
Counterintuitively, global search paths have higher precedence
[than local ones](https://github.com/haskell/cabal/issues/7782).
But that does not simply mean
that the local configuration is ignored completely.
Instead the local library file is found,
because its name libLLVM-Y.so is unique,
whereas the include file names clash,
thus the ones from the global include directory are used.