bareflank-hypervisor/scripts/docs/build_instructions.md
Rian Quinn aab477a590
Build System Bug Fixes (#575)
This patch addresses several bugs with the build system:
- Lack of Windows support
- Clang Tidy was not working properly
- Making modifications to the source code would compile, but would not
re-link resulting in issues
- Removed excess file copying
- Make clean now works
- Removed unused or confusing folders in the build folder as part of the
build process. It is now much easier to traverse the build folder for
dependencies
- The targets didn't work with extensions. This has been fixed.

In addition, the following was also done under this patch
- Intrinsics was moved to the top level and out of the VMM
- Platform files are now in a folder called "platform" instead of
"arch"
- All subprojects have the same include/src/tests files structure
- All intel specific code is properly organized to match intended
namespacing
- Removed dead code
- A small part of the VMCS was converted to use the delegate pattern
- All dependencies are now downloaded at configure time instead of
compile time.
- The cache directory is now cached by Travis CI
- CMake output better matches old build system
- Added make rebuild and separate clean targets to remove various parts
of the build depending on needs.
- Added targets for Clean, Tidy, Rebuild and Format for each subproject
- Re-organized the cmake logic so that macros are not spread out
- New validation removes unneeded complexity
- Removed the need for the compiler wrapper, and in doing so, we now
provide a simpilar set of toolchain files
- Removed the need for Git repos. All external dependencies are
downloaded using a zip or tarball
- Libcxx and Libcxxabi are now in their own files. Much similar logic
- Unit test CMake files have been greatly simplified
- Each subproject is unaware of it's prefix and no long use VMM,
USERSPACE or TEST variables in their cmake files
- Fixed bugs with the flags
- Renamed the varbiables in the default.cmake config to be more
consistent and easier to follow in the rest of the code

Signed-off-by: “rianquinn” <“rianquinn@gmail.com”>
2018-01-22 12:45:07 -07:00

4.4 KiB

Configuring and Building the Bareflank Hypervisor

Dependencies

Although Bareflank can be made to run on most systems, the following are the official supported platforms and their dependencies:

  • Arch Linux:
sudo pacman -S git linux-headers nasm clang cmake base-devel
  • Ubuntu 17.04 (or Higher):
sudo apt-get install git build-essential linux-headers-$(uname -r) nasm clang cmake

Next, create a workspace to hold all Bareflank related source code, build artifacts and extensions...

mkdir ~/bareflank
cd ~/bareflank

...then clone the Bareflank hypervisor repository, and create a build directory:

git clone -b dev https://github.com/bareflank/hypervisor.git
mkdir build
cd build

Your Bareflank workspace should look like this:

| bareflank
   | - build
   | - hypervisor

Bareflank uses CMake (version 3.6+) to build VMM components, dependencies, and Bareflank extension projects. In general, CMake requires that you create a separate build directory for each build you would like to perform. Build directories can be located anywhere, but we suggest keeping them at the level of your Bareflank workspace to keep build outputs close (but separate) from source code and extensions. Unless otherwise noted, the rest of this document assumes you are building on Ubuntu 17.04 from within a Bareflank workspace and build directory at ~/bareflank/build

Basic Usage

By default, Bareflank will configure itself for the host operating system and architecture that you are currently building on. To configure and build with default settings, run the following from your build directory:

cmake ../hypervisor
make

To speed up the build process, Bareflank also supports parallel builds:

cmake ../hypervisor
make -j<#-of-cores + 1>

Configuring Build Options

You can change the default build options using a few different methods. For changing only a few configurations, the easiest method is to specify them as command line arguments to CMake. You can run cmake as many times as necessary, specifying different options each time. For example:

cmake ../hypervisor -DBUILD_VERBOSE=ON
cmake ../hypervisor -DBUILD_TYPE=Release -DBUILD_TARGET_ARCH=x86_64

If you would like to specify many build configuration options at once, you should use a Bareflank build configuration file. By default, Bareflank creates a file named bfconfig.cmake in your build directory, and uses any options specified there (using CMake syntax) to configure your build. An example bfconfig.cmake file might look like the following:

# ~/bareflank/build/bfconfig.cmake (comments start with '#')

set(BUILD_TYPE Release)
set(BUILD_TARGET_ARCH x86_64)

set(BUILD_VMM_SHARED OFF)
set(BUILD_VMM_STATIC ON)
set(ENABLE_DEVELOPER_MODE ON)

You can also specify a relative path to a Bareflank configuration file explicity:

cmake ../hypervisor -DBFCONFIG=/path/to/bfconfig.cmake

To view and configure all of the provided build configuration options at once, you can use the CMake configuration tools ccmake (from a command line) and cmake-gui (for a graphical user interface). From your build directory:

sudo apt-get install cmake-curses-gui
cmake ../hypervisor
ccmake .

Each time you reconfigure Bareflank with new build options, the build system validates your new build configuration. If you attempt to configure Bareflank with (a combinations of) options that aren't supported, the build system will fail and warn about options that need to be changed. If your build was configured properly, a usage message will guide you to the next steps (usually to run make).

Developer features

Some build features that may be particularly useful if you would like to modify Bareflank or develop your own extensions include:

  • ENABLE_BUILD_TEST - Enables unit testing support. You can can also turn unit tests for specific projects on/off using the various UNITTEST_<PROJECT_NAME> configurations
  • ENABLE_TIDY - Enable support for clang-tidy static analysis checks
  • ENABLE_ASTYLE - Enable support for astyle code formatting checks
  • ENABLE_DEVELOPER_MODE - Enable all of the above options and automatically run them on each build. These are the same checks performed by Bareflank CI before pull requests will be accepted

Additionally, developers may want to use Ninja to build Bareflank efficiently. This is supportted by specifying ninja as a generator to CMake:

cmake ../hypervisor -G Ninja
ninja