blob: 5680316789ee9befc8d1ea92311e3673d66fa5f2 [file] [log] [blame]
##
## Folders
##
ROOT_DIR := $(CURDIR)
OUT_DIR := $(ROOT_DIR)/out
CCACHE_DIR := $(ROOT_DIR)/.ccache
TEST_SCRIPTS_DIR := $(ROOT_DIR)/build/aarch64-unit-tests
##
## Common options
##
VERBOSE ?= 0
CROSS_PREFIX ?= "aarch64-linux-gnu-"
CCACHE ?= ""
# Find toolchain for current OS
UNNAME_S := $(shell uname -s | tr '[:upper:]' '[:lower:]')
TOOLCHAIN_CLANG := $(ROOT_DIR)/toolchains/clang/$(UNNAME_S)-x86/clang-r383902
TOOLCHAIN_BINUTILS := $(ROOT_DIR)/toolchains/gcc/linux-x86/aarch64/aarch64-linux-androide-4.9/aarch64-linux-android
##
## Common targets
##
.PHONY: clean
clean: buildroot_clean kvmunittests_clean linux_clean
.PHONY: distclean
distclean: kvmunittests_clean
- rm -rf $(OUT_DIR)
.PHONY: all
all: buildroot kvmunittests linux
.PHONY: help
help:
@echo 'Generic Targets:'
@echo ' all - builds alli generic targetst'
@echo ' buildroot - the buildroot rootfs image as well as the host qemu'
@echo ' kvmunittests - 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 ' kvmunittests_clean - the kvm-unit-tests'
@echo ' linux_clean - the linux kernel'
@echo ''
@echo 'Misc Targets:'
@echo ' unittests - runs the kvm unit tests in the qemu-aarch64 simulated environment'
@echo ' update-prebuilts - generates/update the prebuilt rootfs image (aarch64) and the qemu host utilities (aarch64)'
##
## Buildroot
##
BR_DEFCONFIG ?= qemu_aarch64_virt_kvmunittests_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
##
## kvmunittests
##
KUT_CROSS_PREFIX ?= $(CROSS_PREFIX)
KUT_ARCH := "arm64"
KUT_SRC := $(ROOT_DIR)/kvm-unit-tests
KUT_OUT := $(OUT_DIR)/kvm-unit-tests
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: kvmunittests
kvmunittests:
cd $(KUT_SRC) && \
./configure --prefix=$(KUT_OUT) --arch=$(KUT_ARCH) \
--cc=$(KUT_CC) --ld=$(KUT_LD) \
--objcopy=$(KUT_OBJCOPY) --objdump=$(KUT_OBJDUMP)
+ cd $(KUT_SRC) && PATH=$(KUT_PATH) COMMON_CFLAGS=$(KUT_COMMON_CFLAGS) $(MAKE) install
.PHONY: kvmunittests_clean
kvmunittests_clean:
+ cd $(KUT_SRC) && $(MAKE) clean
##
## Linux kernel
##
LINUX_DEFCONFIG ?= defconfig
LINUX_VERBOSE ?= $(VERBOSE)
LINUX_CROSS_PREFIX ?= $(CROSS_PREFIX)
LINUX_ARCH := arm64
LINUX_SRC := $(ROOT_DIR)/linux
LINUX_OUT := $(OUT_DIR)/linux
LINUX_PATH := $(TOOLCHAIN_CLANG)/bin:$(PATH)
LINUX_MAKE := PATH=$(LINUX_PATH) $(MAKE) \
ARCH=$(LINUX_ARCH) \
CROSS_COMPILE=$(LINUX_CROSS_PREFIX) \
LLVM=1 \
-C $(LINUX_SRC) \
V=$(LINUX_VERBOSE) \
O=$(LINUX_OUT)
.PHONY: linux
linux:
+ $(LINUX_MAKE) defconfig
+ $(LINUX_MAKE)
.PHONY: linux_clean
linux_clean:
+ $(LINUX_MAKE) clean
+ $(LINUX_MAKE) mrproper
##
## Run unit tests
##
MAKE_PID := $(shell echo $$PPID)
JOB_FLAG := $(filter -j%, $(subst -j ,-j,$(shell ps T | grep "^\s*$(MAKE_PID).*$(MAKE)")))
JOBS := $(subst -j,,$(JOB_FLAG))
ifeq ($(JOBS),)
JOBS := "1"
endif
##
## Generating/Updating prebuilts
##
update-prebuilts: \
prebuilts/images/linux-aarch64 \
prebuilts/host_utils/linux-x86
# The rootfs and rom images for qemu
prebuilts/images/linux-aarch64: 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/host_utils/linux-x86: 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 unit tests
##
MAKE_PID := $(shell echo $$PPID)
JOB_FLAG := $(filter -j%, $(subst -j ,-j,$(shell ps T | grep "^\s*$(MAKE_PID).*$(MAKE)")))
JOBS := $(subst -j,,$(JOB_FLAG))
ifeq ($(JOBS),)
JOBS := "1"
endif
KUT_QEMU_BIN := $(ROOT_DIR)/prebuilts/host_utils/linux-x86/bin/qemu-system-aarch64
KUT_QEMU_LIB := $(ROOT_DIR)/prebuilts/host_utils/linux-x86/lib
KUT_ROOTFS_IMAGE := $(ROOT_DIR)/prebuilts/images/linux-aarch64/rootfs.ext4
# Exclude tests that require user interaction or are known to fail.
KUT_EXCLUDE := "(.+migrat.+)|(pmu-event-introspection)"
.PHONY: unittests
unittests: kvmunittests linux
@LD_LIBRARY_PATH=$(KUT_QEMU_LIB):$(LD_LIBRARY_PATH) VERBOSE=$(VERBOSE) \
$(TEST_SCRIPTS_DIR)/run_tests.sh \
-j $(JOBS) \
-t $(KUT_OUT)/share/kvm-unit-tests/ \
-x $(KUT_EXCLUDE) \
-l $(LINUX_OUT)/arch/arm64/boot/Image \
-r $(KUT_ROOTFS_IMAGE) \
-e $(KUT_QEMU_BIN)