| # 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) |
| OUT_DIR := $(ROOT_DIR)/out |
| 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) |