Clang3.8 toolchain install, build OVMF and run on Qemu - shijunjing/edk2 GitHub Wiki

Clang directly Install, build edk2 ovmf and run on Qemu:

jshi19@ub2-uefi-b03:~/wksp_efi/edk2$ sudo apt install clang llvm
jshi19@ub2-uefi-b03:~/wksp_efi/edk2$ clang --version
clang version 6.0.0-1ubuntu2 (tags/RELEASE_600/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
jshi19@ub2-uefi-b03:~/wksp_efi/edk2$ ld --version
GNU ld (GNU Binutils for Ubuntu) 2.30
Copyright (C) 2018 Free Software Foundation, Inc.

Then build OVMF:

jshi19@ub2-uefi-b03:~/wksp_efi/edk2$ rm Conf/tools_def.txt
jshi19@ub2-uefi-b03:~/wksp_efi/edk2$ rm Conf/target.txt
jshi19@ub2-uefi-b03:~/wksp_efi/edk2$ rm Conf/build_rule.txt
jshi19@ub2-uefi-b03:~/wksp_efi/edk2$ source edksetup.sh
jshi19@ub2-uefi-b03:~/wksp_efi/edk2$ make -C BaseTools/ clean
jshi19@ub2-uefi-b03:~/wksp_efi/edk2$ make -C BaseTools/
jshi19@ub2-uefi-b03:~/wksp_efi/edk2$ build -p OvmfPkg/OvmfPkgIa32X64.dsc -t CLANG38 -a IA32 -a X64 -b NOOPT -n 5 -DDEBUG_ON_SERIAL_PORT

Then, run the qemu to boot the clang built ovmf image:

jshi19@ub2-uefi-b03:~/wksp_efi/edk2$ qemu-system-x86_64 -m 4096 -bios ~/wksp_efi/edk2/Build/Ovmf3264/NOOPT_CLANG38/FV/OVMF.fd -global e1000.romfile=""  -machine q35 -serial mon:stdio -display none

Customized clang build:

  1. Build release version LLVM/Clang with GCC
$ git clone  https://github.com/llvm-project/llvm.git
$ git checkout release_70
$ cd ~/llvm/tools/
$ git clone https://github.com/llvm-mirror/clang.git
$ git checkout release_70
$ cd ~/llvm/projects/
$ git clone https://github.com/llvm-mirror/compiler-rt.git
$ git checkout release_70
$ cd ~
$ wget https://ftp.gnu.org/gnu/binutils/binutils-2.31.tar.gz
$ tar -xvf binutils-2.31.tar.gz
$ mkdir llvmreleasebuild
$ cd llvmreleasebuild
$ cmake ../llvm -G "Unix Makefiles" -DCMAKE_BUILD_TYPE="Release" -DLLVM_TARGETS_TO_BUILD="X86" -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_CXX_COMPILER="/usr/bin/g++" -DCMAKE_C_COMPILER="/usr/bin/gcc" -DLLVM_OPTIMIZED_TABLEGEN=ON -DLLVM_BINUTILS_INCDIR=/home/jshi19/binutils-2.31/include -DLLVM_INSTALL_UTILS=ON -DLLVM_ENABLE_ASSERTIONS=ON -DCMAKE_C_FLAGS=-DLLVM_ENABLE_DUMP -DCMAKE_CXX_FLAGS=-DLLVM_ENABLE_DUMP
$ make -j 4
  1. If you want, you can build and install GNU Binutils 2.31 as below steps in Ubuntu:
$sudo apt-get install bison
$sudo apt-get install flex

Install other necessary binutils build tools if missing

$ wget https://ftp.gnu.org/gnu/binutils/binutils-2.31.tar.gz
$ tar -xvf binutils-2.31.tar.gz
$ mkdir binutils-2.31build
$ cd binutils-2.31build
$ ../binutils-2.31/configure --enable-gold --enable-plugins --disable-werror --prefix=/usr
$ make -j 4
$ sudo make install

Build edk2 with customized clang

$ export EDK_TOOLS_PATH=$(pwd)/BaseTools
$ export CONF_PATH=$(pwd)/Conf
$ export CLANG38_BIN=path/to/your/clang/bin
(e.g. export CLANG38_BIN=/home/jshi19/llvm/releaseinstall/bin/ )
$ rm Conf/build_rule.txt
$ rm Conf/target.txt
$ rm Conf/tools_def.txt
$ source edksetup.sh
$ make -C BaseTools/ clean
$ make -C BaseTools
$ build -p OvmfPkg/OvmfPkgIa32X64.dsc -t CLANG38 -a IA32 -a X64 -b NOOPT -n 5 -DDEBUG_ON_SERIAL_PORT

Customized clang build in windows:

Install Visual Studio VS2017, then Open "Developer command Prompt for VS2017" with administrator permission

C:\steven\LLVM>git clone https://github.com/llvm/llvm-project.git
C:\steven\LLVM\llvm-project\releasebuild>cmake -GNinja ..\llvm -DCMAKE_BUILD_TYPE="Release" -DLLVM_TARGETS_TO_BUILD="X86" -DCMAKE_VERBOSE_MAKEFILE=ON -DLLVM_OPTIMIZED_TABLEGEN=ON  -DLLVM_INSTALL_UTILS=ON -DLLVM_ENABLE_ASSERTIONS=ON -DCMAKE_C_FLAGS=-DLLVM_ENABLE_DUMP -DCMAKE_CXX_FLAGS=-DLLVM_ENABLE_DUMP -DCMAKE_INSTALL_PREFIX=..\releaseinstall\ -DLLVM_ENABLE_PROJECTS="lld;clang;compiler-rt;clang-tools-extra"
C:\steven\LLVM\llvm-project\releasebuild>ninja