# SPDX-License-Identifier: LicenseRef-Starship-1.0 # Copyright (c) 2023-2026 Robert A. James # # The kernel host tests (docs/v4.0.0/plans/2026-11-12-kernel-host-tests.md): each test_.c # built on the host with the kernel source file(s) it tests and the fakes, nothing else of the # kernel, and run. # # make -C kernel/tests test build and run them all; fails if any check fails # make -C kernel/tests run-test_gpt # # A test's sources are SRC_; give another on the command line to run the same test against # it (how a test is seen to fail against the code before a fix): # make -C kernel/tests run-test_gpt SRC_test_gpt=/path/to/old/gpt.c HERE := $(abspath $(dir $(lastword $(MAKEFILE_LIST)))) ROOT := $(abspath $(HERE)/../..) BUILD := $(ROOT)/build/kernel-tests CC ?= cc CFLAGS := -std=c99 -Wall -Wextra -Werror -O2 -g -I$(HERE) -I$(ROOT)/kernel/include \ -I$(ROOT)/kernel/include/starkernel -I$(ROOT)/v3/include TESTS := test_gpt test_usb_config test_sk_v4_stop test_sk_v4_slots test_sk_v4_mint SRC_test_sk_v4_mint := $(ROOT)/kernel/src/v4/sk_v4_mint.c $(ROOT)/kernel/src/gpt.c EXTRA_test_sk_v4_mint := -D__STARKERNEL__ -I$(ROOT)/v4/include SRC_test_sk_v4_slots := $(ROOT)/kernel/src/v4/sk_v4_slots.c SRC_test_sk_v4_stop := $(ROOT)/kernel/src/v4/sk_v4_stop.c SRC_test_gpt := $(ROOT)/kernel/src/gpt.c SRC_test_usb_config := $(ROOT)/kernel/src/usb/usb_config.c define TEST_RULE $(BUILD)/$(1): $(HERE)/$(1).c $(HERE)/fakes.c $(HERE)/fakes.h $(HERE)/harness.h $$(SRC_$(1)) @mkdir -p $(BUILD) $(CC) $(CFLAGS) $$(EXTRA_$(1)) $(HERE)/$(1).c $(HERE)/fakes.c $$(SRC_$(1)) -o $$@ .PHONY: run-$(1) run-$(1): $(BUILD)/$(1) @echo "$(1)" @$(BUILD)/$(1) endef $(foreach t,$(TESTS),$(eval $(call TEST_RULE,$(t)))) .PHONY: test test: $(addprefix run-,$(TESTS)) @echo "all kernel host tests passed" # #182: sk_v4_grow.c's 32-bit block arithmetic holds while Artemis is capped below 4 TiB -- the build # itself refuses a cap past that. Seen here: 256 GiB (the real cap) compiles, 4096 GiB must not. .PHONY: run-check_cap run-check_cap: @echo "check_cap" @$(CC) $(CFLAGS) -I$(ROOT)/v4/include -DSTICK_ARTEMIS_CAP_GIB=256ULL -c $(ROOT)/kernel/src/v4/sk_v4_grow.c -o /dev/null \ || { echo "FAIL #182: sk_v4_grow.c does not build with the real cap, 256 GiB"; exit 1; } @if $(CC) $(CFLAGS) -I$(ROOT)/v4/include -DSTICK_ARTEMIS_CAP_GIB=4096ULL -c $(ROOT)/kernel/src/v4/sk_v4_grow.c -o /dev/null 2>/dev/null; then \ echo "FAIL #182: a 4096 GiB cap builds -- its block numbers do not fit 32 bits, and nothing stops it"; exit 1; fi @if $(CC) $(CFLAGS) -I$(ROOT)/v4/include -c $(ROOT)/kernel/src/v4/sk_v4_grow.c -o /dev/null 2>/dev/null; then \ echo "FAIL #182: no cap defined builds -- the check would be skipped, not failed"; exit 1; fi @echo " 3 checks, 0 failures" test: run-check_cap