1*053f45beSAndroid Build Coastguard Worker# SPDX-License-Identifier: GPL-2.0 2*053f45beSAndroid Build Coastguard Worker# Makefile for nolibc tests 3*053f45beSAndroid Build Coastguard Workerinclude ../../../scripts/Makefile.include 4*053f45beSAndroid Build Coastguard Worker 5*053f45beSAndroid Build Coastguard Worker# we're in ".../tools/testing/selftests/nolibc" 6*053f45beSAndroid Build Coastguard Workerifeq ($(srctree),) 7*053f45beSAndroid Build Coastguard Workersrctree := $(patsubst %/tools/testing/selftests/,%,$(dir $(CURDIR))) 8*053f45beSAndroid Build Coastguard Workerendif 9*053f45beSAndroid Build Coastguard Worker 10*053f45beSAndroid Build Coastguard Workerifeq ($(ARCH),) 11*053f45beSAndroid Build Coastguard Workerinclude $(srctree)/scripts/subarch.include 12*053f45beSAndroid Build Coastguard WorkerARCH = $(SUBARCH) 13*053f45beSAndroid Build Coastguard Workerendif 14*053f45beSAndroid Build Coastguard Worker 15*053f45beSAndroid Build Coastguard Worker# kernel image names by architecture 16*053f45beSAndroid Build Coastguard WorkerIMAGE_i386 = arch/x86/boot/bzImage 17*053f45beSAndroid Build Coastguard WorkerIMAGE_x86 = arch/x86/boot/bzImage 18*053f45beSAndroid Build Coastguard WorkerIMAGE_arm64 = arch/arm64/boot/Image 19*053f45beSAndroid Build Coastguard WorkerIMAGE_arm = arch/arm/boot/zImage 20*053f45beSAndroid Build Coastguard WorkerIMAGE_mips = vmlinuz 21*053f45beSAndroid Build Coastguard WorkerIMAGE_riscv = arch/riscv/boot/Image 22*053f45beSAndroid Build Coastguard WorkerIMAGE = $(IMAGE_$(ARCH)) 23*053f45beSAndroid Build Coastguard WorkerIMAGE_NAME = $(notdir $(IMAGE)) 24*053f45beSAndroid Build Coastguard Worker 25*053f45beSAndroid Build Coastguard Worker# default kernel configurations that appear to be usable 26*053f45beSAndroid Build Coastguard WorkerDEFCONFIG_i386 = defconfig 27*053f45beSAndroid Build Coastguard WorkerDEFCONFIG_x86 = defconfig 28*053f45beSAndroid Build Coastguard WorkerDEFCONFIG_arm64 = defconfig 29*053f45beSAndroid Build Coastguard WorkerDEFCONFIG_arm = multi_v7_defconfig 30*053f45beSAndroid Build Coastguard WorkerDEFCONFIG_mips = malta_defconfig 31*053f45beSAndroid Build Coastguard WorkerDEFCONFIG_riscv = defconfig 32*053f45beSAndroid Build Coastguard WorkerDEFCONFIG = $(DEFCONFIG_$(ARCH)) 33*053f45beSAndroid Build Coastguard Worker 34*053f45beSAndroid Build Coastguard Worker# optional tests to run (default = all) 35*053f45beSAndroid Build Coastguard WorkerTEST = 36*053f45beSAndroid Build Coastguard Worker 37*053f45beSAndroid Build Coastguard Worker# QEMU_ARCH: arch names used by qemu 38*053f45beSAndroid Build Coastguard WorkerQEMU_ARCH_i386 = i386 39*053f45beSAndroid Build Coastguard WorkerQEMU_ARCH_x86 = x86_64 40*053f45beSAndroid Build Coastguard WorkerQEMU_ARCH_arm64 = aarch64 41*053f45beSAndroid Build Coastguard WorkerQEMU_ARCH_arm = arm 42*053f45beSAndroid Build Coastguard WorkerQEMU_ARCH_mips = mipsel # works with malta_defconfig 43*053f45beSAndroid Build Coastguard WorkerQEMU_ARCH_riscv = riscv64 44*053f45beSAndroid Build Coastguard WorkerQEMU_ARCH = $(QEMU_ARCH_$(ARCH)) 45*053f45beSAndroid Build Coastguard Worker 46*053f45beSAndroid Build Coastguard Worker# QEMU_ARGS : some arch-specific args to pass to qemu 47*053f45beSAndroid Build Coastguard WorkerQEMU_ARGS_i386 = -M pc -append "console=ttyS0,9600 i8042.noaux panic=-1 $(TEST:%=NOLIBC_TEST=%)" 48*053f45beSAndroid Build Coastguard WorkerQEMU_ARGS_x86 = -M pc -append "console=ttyS0,9600 i8042.noaux panic=-1 $(TEST:%=NOLIBC_TEST=%)" 49*053f45beSAndroid Build Coastguard WorkerQEMU_ARGS_arm64 = -M virt -cpu cortex-a53 -append "panic=-1 $(TEST:%=NOLIBC_TEST=%)" 50*053f45beSAndroid Build Coastguard WorkerQEMU_ARGS_arm = -M virt -append "panic=-1 $(TEST:%=NOLIBC_TEST=%)" 51*053f45beSAndroid Build Coastguard WorkerQEMU_ARGS_mips = -M malta -append "panic=-1 $(TEST:%=NOLIBC_TEST=%)" 52*053f45beSAndroid Build Coastguard WorkerQEMU_ARGS_riscv = -M virt -append "console=ttyS0 panic=-1 $(TEST:%=NOLIBC_TEST=%)" 53*053f45beSAndroid Build Coastguard WorkerQEMU_ARGS = $(QEMU_ARGS_$(ARCH)) 54*053f45beSAndroid Build Coastguard Worker 55*053f45beSAndroid Build Coastguard Worker# OUTPUT is only set when run from the main makefile, otherwise 56*053f45beSAndroid Build Coastguard Worker# it defaults to this nolibc directory. 57*053f45beSAndroid Build Coastguard WorkerOUTPUT ?= $(CURDIR)/ 58*053f45beSAndroid Build Coastguard Worker 59*053f45beSAndroid Build Coastguard Workerifeq ($(V),1) 60*053f45beSAndroid Build Coastguard WorkerQ= 61*053f45beSAndroid Build Coastguard Workerelse 62*053f45beSAndroid Build Coastguard WorkerQ=@ 63*053f45beSAndroid Build Coastguard Workerendif 64*053f45beSAndroid Build Coastguard Worker 65*053f45beSAndroid Build Coastguard WorkerCFLAGS ?= -Os -fno-ident -fno-asynchronous-unwind-tables 66*053f45beSAndroid Build Coastguard WorkerLDFLAGS := -s 67*053f45beSAndroid Build Coastguard Worker 68*053f45beSAndroid Build Coastguard Workerhelp: 69*053f45beSAndroid Build Coastguard Worker @echo "Supported targets under selftests/nolibc:" 70*053f45beSAndroid Build Coastguard Worker @echo " all call the \"run\" target below" 71*053f45beSAndroid Build Coastguard Worker @echo " help this help" 72*053f45beSAndroid Build Coastguard Worker @echo " sysroot create the nolibc sysroot here (uses \$$ARCH)" 73*053f45beSAndroid Build Coastguard Worker @echo " nolibc-test build the executable (uses \$$CC and \$$CROSS_COMPILE)" 74*053f45beSAndroid Build Coastguard Worker @echo " initramfs prepare the initramfs with nolibc-test" 75*053f45beSAndroid Build Coastguard Worker @echo " defconfig create a fresh new default config (uses \$$ARCH)" 76*053f45beSAndroid Build Coastguard Worker @echo " kernel (re)build the kernel with the initramfs (uses \$$ARCH)" 77*053f45beSAndroid Build Coastguard Worker @echo " run runs the kernel in QEMU after building it (uses \$$ARCH, \$$TEST)" 78*053f45beSAndroid Build Coastguard Worker @echo " rerun runs a previously prebuilt kernel in QEMU (uses \$$ARCH, \$$TEST)" 79*053f45beSAndroid Build Coastguard Worker @echo " clean clean the sysroot, initramfs, build and output files" 80*053f45beSAndroid Build Coastguard Worker @echo "" 81*053f45beSAndroid Build Coastguard Worker @echo "The output file is \"run.out\". Test ranges may be passed using \$$TEST." 82*053f45beSAndroid Build Coastguard Worker @echo "" 83*053f45beSAndroid Build Coastguard Worker @echo "Currently using the following variables:" 84*053f45beSAndroid Build Coastguard Worker @echo " ARCH = $(ARCH)" 85*053f45beSAndroid Build Coastguard Worker @echo " CROSS_COMPILE = $(CROSS_COMPILE)" 86*053f45beSAndroid Build Coastguard Worker @echo " CC = $(CC)" 87*053f45beSAndroid Build Coastguard Worker @echo " OUTPUT = $(OUTPUT)" 88*053f45beSAndroid Build Coastguard Worker @echo " TEST = $(TEST)" 89*053f45beSAndroid Build Coastguard Worker @echo " QEMU_ARCH = $(if $(QEMU_ARCH),$(QEMU_ARCH),UNKNOWN_ARCH) [determined from \$$ARCH]" 90*053f45beSAndroid Build Coastguard Worker @echo " IMAGE_NAME = $(if $(IMAGE_NAME),$(IMAGE_NAME),UNKNOWN_ARCH) [determined from \$$ARCH]" 91*053f45beSAndroid Build Coastguard Worker @echo "" 92*053f45beSAndroid Build Coastguard Worker 93*053f45beSAndroid Build Coastguard Workerall: run 94*053f45beSAndroid Build Coastguard Worker 95*053f45beSAndroid Build Coastguard Workersysroot: sysroot/$(ARCH)/include 96*053f45beSAndroid Build Coastguard Worker 97*053f45beSAndroid Build Coastguard Workersysroot/$(ARCH)/include: 98*053f45beSAndroid Build Coastguard Worker $(QUIET_MKDIR)mkdir -p sysroot 99*053f45beSAndroid Build Coastguard Worker $(Q)$(MAKE) -C ../../../include/nolibc ARCH=$(ARCH) OUTPUT=$(CURDIR)/sysroot/ headers_standalone 100*053f45beSAndroid Build Coastguard Worker $(Q)mv sysroot/sysroot sysroot/$(ARCH) 101*053f45beSAndroid Build Coastguard Worker 102*053f45beSAndroid Build Coastguard Workernolibc-test: nolibc-test.c sysroot/$(ARCH)/include 103*053f45beSAndroid Build Coastguard Worker $(QUIET_CC)$(CC) $(CFLAGS) $(LDFLAGS) -o $@ \ 104*053f45beSAndroid Build Coastguard Worker -nostdlib -static -Isysroot/$(ARCH)/include $< -lgcc 105*053f45beSAndroid Build Coastguard Worker 106*053f45beSAndroid Build Coastguard Workerinitramfs: nolibc-test 107*053f45beSAndroid Build Coastguard Worker $(QUIET_MKDIR)mkdir -p initramfs 108*053f45beSAndroid Build Coastguard Worker $(call QUIET_INSTALL, initramfs/init) 109*053f45beSAndroid Build Coastguard Worker $(Q)cp nolibc-test initramfs/init 110*053f45beSAndroid Build Coastguard Worker 111*053f45beSAndroid Build Coastguard Workerdefconfig: 112*053f45beSAndroid Build Coastguard Worker $(Q)$(MAKE) -C $(srctree) ARCH=$(ARCH) CC=$(CC) CROSS_COMPILE=$(CROSS_COMPILE) mrproper $(DEFCONFIG) prepare 113*053f45beSAndroid Build Coastguard Worker 114*053f45beSAndroid Build Coastguard Workerkernel: initramfs 115*053f45beSAndroid Build Coastguard Worker $(Q)$(MAKE) -C $(srctree) ARCH=$(ARCH) CC=$(CC) CROSS_COMPILE=$(CROSS_COMPILE) $(IMAGE_NAME) CONFIG_INITRAMFS_SOURCE=$(CURDIR)/initramfs 116*053f45beSAndroid Build Coastguard Worker 117*053f45beSAndroid Build Coastguard Worker# run the tests after building the kernel 118*053f45beSAndroid Build Coastguard Workerrun: kernel 119*053f45beSAndroid Build Coastguard Worker $(Q)qemu-system-$(QEMU_ARCH) -display none -no-reboot -kernel "$(srctree)/$(IMAGE)" -serial stdio $(QEMU_ARGS) > "$(CURDIR)/run.out" 120*053f45beSAndroid Build Coastguard Worker $(Q)grep -w FAIL "$(CURDIR)/run.out" && echo "See all results in $(CURDIR)/run.out" || echo "$$(grep -c ^[0-9].*OK $(CURDIR)/run.out) test(s) passed." 121*053f45beSAndroid Build Coastguard Worker 122*053f45beSAndroid Build Coastguard Worker# re-run the tests from an existing kernel 123*053f45beSAndroid Build Coastguard Workerrerun: 124*053f45beSAndroid Build Coastguard Worker $(Q)qemu-system-$(QEMU_ARCH) -display none -no-reboot -kernel "$(srctree)/$(IMAGE)" -serial stdio $(QEMU_ARGS) > "$(CURDIR)/run.out" 125*053f45beSAndroid Build Coastguard Worker $(Q)grep -w FAIL "$(CURDIR)/run.out" && echo "See all results in $(CURDIR)/run.out" || echo "$$(grep -c ^[0-9].*OK $(CURDIR)/run.out) test(s) passed." 126*053f45beSAndroid Build Coastguard Worker 127*053f45beSAndroid Build Coastguard Workerclean: 128*053f45beSAndroid Build Coastguard Worker $(call QUIET_CLEAN, sysroot) 129*053f45beSAndroid Build Coastguard Worker $(Q)rm -rf sysroot 130*053f45beSAndroid Build Coastguard Worker $(call QUIET_CLEAN, nolibc-test) 131*053f45beSAndroid Build Coastguard Worker $(Q)rm -f nolibc-test 132*053f45beSAndroid Build Coastguard Worker $(call QUIET_CLEAN, initramfs) 133*053f45beSAndroid Build Coastguard Worker $(Q)rm -rf initramfs 134*053f45beSAndroid Build Coastguard Worker $(call QUIET_CLEAN, run.out) 135*053f45beSAndroid Build Coastguard Worker $(Q)rm -rf run.out 136