1. NOTE: These instructions use ~/.local/llvm_$(opam config var switch) as an install root for llvm/clang, but installing elsewhere should be fine. Also note that you probably don't want to use this clang for anything else because it is a default debug build and hence very slow. So some PATH management is likely needed to have ~/.local/llvm_$(opam config var switch) in PATH only when building / running llair. This is done automatically for the targets in test/Makefile. 2. clone llvm, clang, and libcxxabi - cd ~/path/to/sledge - git clone git+ssh://git@github.com/jberdine/llvm.git --branch ocaml_api - git clone https://github.com/llvm-mirror/clang.git llvm/tools/clang - git clone https://github.com/llvm-mirror/libcxxabi.git llvm/projects/libcxxabi 3. build llvm & clang - brew install cmake ninja - cd ~/path/to/sledge/llvm - mkdir _build - cd _build - cmake -G Ninja -DCMAKE_INSTALL_PREFIX=~/.local/llvm_$(opam config var switch) -DLLVM_OCAML_INSTALL_PATH=~/.local/llvm_$(opam config var switch)/lib/ocaml .. - ninja -j8 - ninja ocaml_doc - ninja install 4. install deps - add ~/.local/llvm_$(opam config var switch)/bin to shell PATH + because installing the opam package for llvm will look for it + export PATH=~/.local/llvm_$(opam config var switch)/bin:$PATH - pin conf-llvm + opam pin add -n conf-llvm --dev + opam pin edit conf-llvm - edit version number to match that of the llvm clone (= 7.0.0) - pin llvm + cd ~/path/to/sledge/llvm + opam pin add -n -k git llvm . + opam pin edit llvm - edit llvm and conf-llvm version number to match that of the llvm clone (= 7.0.0) - when prompted, ok to save new opam file 5. install llair for llvm_sil - cd ~/path/to/sledge - opam pin add -n -k git llair . + when prompted, ok to create new package - opam install llair 6. hush `ld: warning: directory not found for option '-L/opt/local/lib'` - the zarith package adds a spurious linker option unless you have both brew and macports, so if you see this linker warning when compiling, execute + sudo mkdir -p /opt/local/lib 7. install dev tools - opam install merlin ocp-indent tuareg user-setup - install ocamlformat 8. if needed: point new clang to xcode c++ lib - cd ~/.local/llvm_$(opam config var switch)/include - ln -s /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++ . 9. llvm dev workflow - modify llvm sources - cd ~/path/to/sledge/llvm/_build; ninja -j8 - iterate - (optional?) git add -u; git commit -m ... - ninja -j8 && ninja ocaml_doc && ninja install && opam upgrade llvm - cd ~/path/to/sledge; make - it is not uncommon to get "inconsistent assumptions" errors: clean and re-make 10. llvm emacs mode - (add-to-list 'load-path (expand-file-name "~/path/to/sledge/llvm/utils/emacs")) - (require 'llvm-mode) - (require 'autodisass-llvm-bitcode)