blob: 9b6507aaf82b0c2595806175624680155bd775d7 [file] [log] [blame]
# Copyright 2020 The Android KVM Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
SELF := $(abspath $(lastword $(MAKEFILE_LIST)))
##
## Folders
##
ROOT_DIR := $(CURDIR)
# DIST_DIR might be defined by the CI build (pKVM Busytown)
ifdef DIST_DIR
OUT_DIR := $(DIST_DIR)
else
OUT_DIR := $(ROOT_DIR)/out
endif
LINUX_OUT := $(OUT_DIR)/linux
CCACHE_DIR := $(OUT_DIR)/.ccache
SCRIPTS_DIR := $(ROOT_DIR)/build
##
## Common options
##
VERBOSE ?= 0
CCACHE ?= ""
# Find toolchain for current OS
UNNAME_S := $(shell uname -s | tr '[:upper:]' '[:lower:]')
TOOLCHAIN_CLANG := $(ROOT_DIR)/toolchains/$(UNNAME_S)-x86/clang/clang-r383902
TOOLCHAIN_BINUTILS := $(ROOT_DIR)/toolchains/$(UNNAME_S)-x86/gcc/aarch64-linux-android
CUSTOM_KERNEL_IMAGE=0
# KERNEL_IMAGE can be set to use own custom kernel image.
ifdef KERNEL_IMAGE
CUSTOM_KERNEL_IMAGE=1
else
KERNEL_IMAGE := $(LINUX_OUT)/arch/arm64/boot/Image.gz
endif
##
## Common targets
##
.DEFAULT_GOAL := default
.PHONY: default
default: kvm-unit-tests linux
.PHONY: clean
clean: buildroot_clean kvm-unit-tests_clean linux_clean
.PHONY: distclean
distclean:
- rm -rf $(OUT_DIR)
.PHONY: all
all: buildroot kvm-unit-tests linux
.PHONY: help
help:
@echo 'Generic Targets:'
@echo ' default - builds all generic targets except for buildroot'
@echo ' all - builds all generic targets'
@echo ' buildroot - the buildroot rootfs image as well as the host qemu'
@echo ' kvm-unit-tests - the kvm-unit-tests'
@echo ' linux - the linux kernel'
@echo ''
@echo 'Clean Targets:'
@echo ' clean - cleans all, but keeps the prebuilts'
@echo ' distclean - distclean for all targets'
@echo ' buildroot_clean - the buildroot rootfs image as well as the host qemu'
@echo ' kvm-unit-tests_clean - the kvm-unit-tests'
@echo ' linux_clean - the linux kernel'
@echo ''
@echo 'Test Targets:'
@echo ' test - runs all tests in qemu-aarch64 simulated environment'
@echo ' test-kut - runs all kvm-unit-tests in qemu-aarch64 simulated environment'
@echo ' test-list - lists all test targets'
@echo ''
@echo 'Misc Targets:'
@echo ' update-prebuilts - generates/update the prebuilt rootfs image (aarch64) and the qemu host (aarch64)'
##
## Buildroot
##
BR_DEFCONFIG ?= qemu_aarch64_virt_kvm-unit-tests_defconfig
BR_VERBOSE ?= $(VERBOSE)
BR_SRC := $(ROOT_DIR)/buildroot
BR_OUT := $(OUT_DIR)/buildroot
BR_MAKE := $(MAKE) -C $(BR_SRC) V=$(BR_VERBOSE) O=$(BR_OUT)
.PHONY: buildroot
buildroot:
+ $(BR_MAKE) $(BR_DEFCONFIG)
+ $(BR_MAKE) all
.PHONY: buildroot_clean
buildroot_clean:
+ $(BR_MAKE) clean
##
## kvm-unit-tests
##
KUT_CROSS_PREFIX ?= "aarch64-linux-android-"
KUT_ARCH := "arm64"
KUT_SRC := $(ROOT_DIR)/kvm-unit-tests
KUT_OUT := $(OUT_DIR)/kvm-unit-tests
KUT_STAMP := $(KUT_OUT)/kvm-unit-tests.stamp
KUT_CC := $(TOOLCHAIN_CLANG)/bin/clang
KUT_LD := $(TOOLCHAIN_CLANG)/bin/ld.lld
KUT_OBJCOPY := $(TOOLCHAIN_CLANG)/bin/llvm-objcopy
KUT_OBJDUMP := $(TOOLCHAIN_CLANG)/bin/llvm-objdump
KUT_COMMON_CFLAGS := "-Qunused-arguments -target aarch64-linux-gnueabi -fno-integrated-as -Wno-asm-operand-widths -fpic --gcc-toolchain=$(TOOLCHAIN_BINUTILS)"
KUT_PATH := $(TOOLCHAIN_CLANG)/bin:$(TOOLCHAIN_BINUTILS)/bin:$(PATH)
.PHONY: kvm-unit-tests
kvm-unit-tests $(KUT_STAMP):
mkdir -p $(KUT_OUT)
cd $(KUT_OUT) && \
$(KUT_SRC)/configure \
--erratatxt=$(KUT_SRC)/errata.txt \
--prefix=$(KUT_OUT) --arch=$(KUT_ARCH) \
--cc=$(KUT_CC) --ld=$(KUT_LD) \
--objcopy=$(KUT_OBJCOPY) --objdump=$(KUT_OBJDUMP)
PATH=$(KUT_PATH) COMMON_CFLAGS=$(KUT_COMMON_CFLAGS) \
$(MAKE) -C $(KUT_OUT) standalone
touch $(KUT_STAMP)
.PHONY: kvm-unit-tests_clean
kvm-unit-tests_clean:
- rm -f $(KUT_STAMP)
- $(MAKE) -C $(KUT_OUT) clean
##
## Linux kernel
##
LINUX_DEFCONFIG ?= defconfig
LINUX_VERBOSE ?= $(VERBOSE)
LINUX_CROSS_COMPILE ?= "aarch64-linux-gnu-"
LINUX_SRC ?= $(ROOT_DIR)/linux
LINUX_ARCH := arm64
LINUX_PATH := $(TOOLCHAIN_CLANG)/bin:$(PATH)
LINUX_MAKE := \
PATH=$(LINUX_PATH) \
ARCH=$(LINUX_ARCH) \
CROSS_COMPILE=$(LINUX_CROSS_COMPILE) \
$(MAKE) \
LLVM=1 \
GCC_TOOLCHAIN_DIR=$(TOOLCHAIN_BINUTILS)/bin \
-C $(LINUX_SRC) \
V=$(LINUX_VERBOSE) \
O=$(LINUX_OUT)
LINUX_CONFIG := $(LINUX_OUT)/.config
.PHONY: linux_defconfig
linux_defconfig $(LINUX_CONFIG):
+ $(LINUX_MAKE) $(LINUX_DEFCONFIG)
.PHONY: linux
linux: $(LINUX_CONFIG)
+ $(LINUX_MAKE)
.PHONY: linux_image
linux_image: $(LINUX_CONFIG)
+ $(LINUX_MAKE) Image.gz
# If using own kernel image (KERNEL_IMAGE is set in the environment), then skip.
ifeq ($(CUSTOM_KERNEL_IMAGE), 0)
$(KERNEL_IMAGE): linux_image
endif
.PHONY: linux_clean
linux_clean:
+ $(LINUX_MAKE) mrproper
##
## Generating/Updating prebuilts
##
update-prebuilts: \
prebuilts/linux-aarch64/images \
prebuilts/linux-x86/qemu
# The rootfs and rom images for qemu
prebuilts/linux-aarch64/images: buildroot
- rm -rf $@
mkdir -p $@
cp $(BR_OUT)/images/rootfs.ext4 $@
cp $(BR_OUT)/per-package/host-qemu/host/share/qemu/efi-virtio.rom $@
# The qemu binary and the libraries it requires
prebuilts/linux-x86/qemu: buildroot
- rm -rf $@
mkdir -p $@/bin
cp $(BR_OUT)/host/bin/qemu-system-aarch64 $@/bin
mkdir -p $@/lib
cp $(BR_OUT)/host/lib/lib* $@/lib
##
## Run tests
##
# Root test targets. Dynamically generated per-test targets
# will add themselves as dependencies of these.
.PHONY: test test-list
test:
test-list:
#
# kvm-unit-tests
#
KUT_GEN_MAKEFILE := $(SCRIPTS_DIR)/kvm-unit-tests/gen_makefile.sh
KUT_MAKEFILE := $(OUT_DIR)/Makefile.kvm-unit-tests
KUT_TEST_DIR := $(KUT_OUT)/tests
KUT_LOG_DIR := $(OUT_DIR)/test/kvm-unit-tests/
# Exclude tests that require user interaction or are known to fail.
KUT_EXCLUDE := (.+migrat.+)|(gicv2-.+)|(pmu-event-introspection)|(micro-bench)
# Generate a Makefile with targets per test and configuration.
# Pass in variable/target names from this Makefile that the
# generated Makefile will refer to.
$(KUT_MAKEFILE): $(SELF) $(KUT_GEN_MAKEFILE) $(KUT_STAMP)
@ mkdir -p $(shell dirname $@)
@ $(KUT_GEN_MAKEFILE) \
$(KUT_TEST_DIR) "$(KUT_EXCLUDE)" \
KERNEL_IMAGE KUT_LOG_DIR test test-list \
> $@.tmp
@ mv $@.tmp $@
include $(KUT_MAKEFILE)