xref: /aosp_15_r20/external/linux-kselftest/tools/testing/selftests/nolibc/Makefile (revision 053f45be4e351dfd5e965df293cd45b779f579ee)
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