ubuntu14编译安装llvm&clang 3.9

简介

依赖

  1. cmake-3.8+
    安装方法见上篇博文,http://www.jb51.cc/article/p-caxcirdq-ke.html
  2. python-2.7
  3. libffi-3.2.1
  4. 下载libffi 地址:ftp://sourceware.org/pub/libffi/libffi-3.2.1.tar.gz
    用下面命令编译安装libffi
-i include/Makefile.in && 
    sed -e '/^includedir/ s/=.*$/=@includedir@/' \
        -e 's/^Cflags: -I${includedir}/Cflags:/' \         -i libffi.pc.in && 
    ./configure --prefix=/usr --disable-static &&
    make

    sudo make install

整理源码

从官网下载源码 http://releases.llvm.org/download.html#3.9.1

解压 llvm-3.9.1.src.tar.xz 后重命名为llvm
解压cfe-3.9.1.src.tar.xz 后重命名为clang 放到llvm/tools目录
解压lld-3.9.0.src.tar.xz后重命名为ldd 放到llvm/tools目录
解压lld-3.9.0.src.tar.xz后重命名为lld 放到llvm/tools目录
解压lldb-3.9.1.src.tar.xz后重命名为lldb 放到llvm/tools目录
解压clang-tools-extra-3.9.1.src.tar.xz后重命名为extra 放到llvm/tools目录
解压后compiler-rt-3.9.1.src.tar.xz重命名为 compiler-rt 放到目录llvm/projects目录
解压libcxx-3.9.1.src.tar.xz后重命名为libcxx 放到目录llvm/projects目录
解压libcxxabi-3.9.1.src.tar.xz后重命名为libcxxabi 放到目录llvm/projects目录

解压后重命名为 放到目录

最后结构是这样的

$ tree -d -L 2

.
├── bindings
│   ├── go
│   ├── ocaml
│   └── python
├── cmake
│   ├── modules
│   └── platforms
├── docs
│   ├── CommandGuide
│   ├── Frontend
│   ├── HistoricalNotes
│   ├── _ocamldoc
│   ├── _static
│   ├── TableGen
│   ├── _templates
│   ├── _themes
│   └── tutorial
├── examples
│   ├── BrainF
│   ├── ExceptionDemo
│   ├── Fibonacci
│   ├── HowToUseJIT
│   ├── Kaleidoscope
│   ├── ModuleMaker
│   ├── OCaml-Kaleidoscope
│   └── ParallelJIT
├── include
│   ├── llvm
│   └── llvm-c
├── lib
│   ├── Analysis
│   ├── AsmParser
│   ├── Bitcode
│   ├── CodeGen
│   ├── DebugInfo
│   ├── ExecutionEngine
│   ├── Fuzzer
│   ├── IR
│   ├── IRReader
│   ├── LibDriver
│   ├── LineEditor
│   ├── Linker
│   ├── LTO
│   ├── MC
│   ├── Object
│   ├── ObjectYAML
│   ├── Option
│   ├── Passes
│   ├── ProfileData
│   ├── Support
│   ├── TableGen
│   ├── Target
│   └── Transforms
├── projects
│   ├── compiler-rt
│   ├── libcxx
│   └── libcxxabi
├── resources
├── runtimes
├── test
│   ├── Analysis
│   ├── Assembler
│   ├── Bindings
│   ├── Bitcode
│   ├── BugPoint
│   ├── CodeGen
│   ├── DebugInfo
│   ├── Examples
│   ├── ExecutionEngine
│   ├── Feature
│   ├── FileCheck
│   ├── Instrumentation
│   ├── Integer
│   ├── JitListener
│   ├── LibDriver
│   ├── Linker
│   ├── LTO
│   ├── MC
│   ├── Object
│   ├── ObjectYAML
│   ├── Other
│   ├── SymbolRewriter
│   ├── TableGen
│   ├── ThinLTO
│   ├── tools
│   ├── Transforms
│   ├── Unit
│   ├── Verifier
│   └── YAMLParser
├── tools
│   ├── bugpoint
│   ├── bugpoint-passes
│   ├── clang
│   ├── dsymutil
│   ├── extra
│   ├── gold
│   ├── llc
│   ├── lld
│   ├── lldb
│   ├── lli
│   ├── llvm-ar
│   ├── llvm-as
│   ├── llvm-as-fuzzer
│   ├── llvm-as-parasitic-coverage-repro
│   ├── llvm-bcanalyzer
│   ├── llvm-config
│   ├── llvm-cov
│   ├── llvm-c-test
│   ├── llvm-cxxdump
│   ├── llvm-diff
│   ├── llvm-dis
│   ├── llvm-dwarfdump
│   ├── llvm-dwp
│   ├── llvm-extract
│   ├── llvm-go
│   ├── llvm-jitlistener
│   ├── llvm-link
│   ├── llvm-lto
│   ├── llvm-mc
│   ├── llvm-mc-fuzzer
│   ├── llvm-mcmarkup
│   ├── llvm-nm
│   ├── llvm-objdump
│   ├── llvm-pdbdump
│   ├── llvm-profdata
│   ├── llvm-readobj
│   ├── llvm-rtdyld
│   ├── llvm-shlib
│   ├── llvm-size
│   ├── llvm-split
│   ├── llvm-stress
│   ├── llvm-symbolizer
│   ├── llvm-vtabledump
│   ├── lto
│   ├── msbuild
│   ├── obj2yaml
│   ├── opt
│   ├── sancov
│   ├── sanstats
│   ├── verify-uselistorder
│   ├── xcode-toolchain
│   └── yaml2obj
├── unittests
│   ├── ADT
│   ├── Analysis
│   ├── AsmParser
│   ├── Bitcode
│   ├── CodeGen
│   ├── DebugInfo
│   ├── ExecutionEngine
│   ├── IR
│   ├── LineEditor
│   ├── Linker
│   ├── MC
│   ├── MI
│   ├── ObjectYAML
│   ├── Option
│   ├── ProfileData
│   ├── Support
│   └── Transforms
└── utils
    ├── abtest
    ├── bugpoint
    ├── buildit
    ├── count
    ├── crosstool
    ├── emacs
    ├── FileCheck
    ├── fpcmp
    ├── gdb-scripts
    ├── git
    ├── git-svn
    ├── jedit
    ├── kate
    ├── KillTheDoctor
    ├── lint
    ├── lit
    ├── llvm-build
    ├── llvm-lit
    ├── LLVMVisualizers
    ├── Misc
    ├── not
    ├── PerfectShuffle
    ├── release
    ├── TableGen
    ├── Target
    ├── testgen
    ├── textmate
    ├── unittest
    ├── valgrind
    ├── vim
    └── yaml-bench

编译

cmake -G "Unix Makefiles" \
    -DPYTHON_INCLUDE_DIR=$(python -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") \     -DPYTHON_LIBRARY=$(python -c "import distutils.sysconfig as sysconfig; print(sysconfig.get_config_var('LIBDIR'))") \   -DCMAKE_INSTALL_PREFIX=/usr \   -DCMAKE_BUILD_TYPE=Release \   -DLLVM_ENABLE_FFI=ON \   -DLLVM_BUILD_LLVM_DYLIB=ON \   -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \   -DLLVM_TARGETS_TO_BUILD="host" \   -Wno-dev \   ../llvm

make -j4
sudo make install

如果安装了Ninja也可以用它来编译,速度比make要快很多(也耗资源 ninja install时候虚拟机卡半死了) cmake配置替换成这个就可以了
cmake -G Ninja
编译过程是相似的
ninja -j2
ninja install

#测试

-

常见问题

  • Could NOT find PythonLibs (missing: PYTHON_LIBRARIES PYTHON_INCLUDE_DIRS)
    cmake找不到python的头文件和库文件 添加这一段就好了 如果使用python3 用 python3 -c … 代替 python -c ….就可以
$ cmake .. \
    -DPYTHON_INCLUDE_DIR=$(python -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") \     -DPYTHON_LIBRARY=$(python -c "import distutils.sysconfig as sysconfig; print(sysconfig.get_config_var('LIBDIR'))")
  • Could NOT find SWIG (missing: SWIG_EXECUTABLE SWIG_DIR)
sudo apt-get install swig
  • llvm/tools/lldb/include/lldb/Host/Editline.h:49:22: fatal error: histedit.h: 没有那个文件或目录
    #include
sudo apt-get install libedit-dev
  • q

相关文章

1.安装过程出现0x00000000指令引用的0x00000000内存该内存不能为written 如果你安装的是inux系统 需要在...
写在全面:如果根据以下教程涉及到只读文件需要更改文件权限才能需修改文件内容,参考我的另一篇博客:...
写在前面:以下步骤中需要在终端输入命令,电脑端查看博客的朋友可以直接复制粘贴到终端,手机端查看的...
ubuntu16.04和18.04更换国内源 写在前面:安装好ubuntu双系统后,默认的软件更新源是国外的,在国内使用...
ubuntu双系统启动时卡死解决办法(在ubuntu16.04和18.04测试无误) 问题描述: 在安装完ubuntu双系统后...
又来造轮子了。。。。。。。。。。。。。。。。 今天使用w3af向文件中写入的时候,发现没有write权限,...