Makefile 9.2 KiB raw
1
# Radiance build file.
2
3
# Core standard library modules.
4
STD := -pkg std $(patsubst %,-mod %,$(shell cat std.lib))
5
# Session allocation support for standalone lowering fixtures.
6
TEST_FIXTURE_STD_LIB := $(shell cat test/support/std.lib)
7
TEST_FIXTURE_STD := -pkg std $(patsubst %,-mod %,$(TEST_FIXTURE_STD_LIB))
8
9
# Full standard library with test modules.
10
STD_TEST := $(STD) $(patsubst %,-mod %,$(shell cat std.lib.test))
11
12
# Standard library support for tests in another package.
13
STD_TEST_SUPPORT := $(STD) -mod lib/std/testing.rad
14
15
# Source files.
16
STD_LIB := $(shell find lib -name '*.rad')
17
BIN_DIR := bin
18
RAD_BIN := $(BIN_DIR)/radiance.rv64.dev
19
20
# Emulator command used to invoke the self-hosted compiler.
21
EMU       := $(or $(RAD_EMULATOR),emulator)
22
EMU_FLAGS := -memory-size=385024 \
23
			 -data-size=348160 \
24
			 -stack-size=1024 \
25
			 -count-instructions
26
RADIANCE  := $(EMU) $(EMU_FLAGS) -run $(RAD_BIN)
27
28
# Verify the emulator binary exists.
29
EMU_PATH := $(shell command -v $(EMU) 2>/dev/null)
30
31
default: emulator $(RAD_BIN)
32
test: emulator seed-test std-test bin-test kernel-test package-test machine-test kernel-acceptance kernel-size-check
33
34
seed-test:
35
	@seed/test
36
37
# Emulator command check
38
39
emulator:
40
ifeq ($(EMU_PATH),)
41
	$(error Emulator not found. Install it or set RAD_EMULATOR to its path)
42
endif
43
44
# Compiler build
45
46
SEED      := seed/radiance.rv64
47
COMPILER_SRC := compiler/radiance.rad compiler/radiance/codegen.rad
48
SEED_OPTS := $(STD) -pkg radiance $(patsubst %,-mod %,$(COMPILER_SRC)) -entry radiance
49
50
$(RAD_BIN): $(STD_LIB) $(COMPILER_SRC) std.lib | $(BIN_DIR)
51
	@echo "radiance $(SEED) => $@"
52
	@$(EMU) $(EMU_FLAGS) -run $(SEED) $(SEED_OPTS) -o $@
53
54
$(BIN_DIR):
55
	@mkdir -p $@
56
57
# Standard Library Tests
58
59
STD_LIB_TEST := lib/std.test.rv64
60
61
std-test: $(STD_LIB_TEST)
62
	@echo
63
	@$(EMU) $(EMU_FLAGS) -run $(STD_LIB_TEST)
64
65
$(STD_LIB_TEST): $(STD_LIB) $(RAD_BIN) std.lib std.lib.test
66
	@echo "radiance -test $(STD_TEST) -entry std -o $@"
67
	@$(RADIANCE) -test $(STD_TEST) -entry std -o $@
68
69
clean-std-test:
70
	@rm -f lib/std.test.rv64 \
71
		lib/std.test.rv64.debug \
72
		lib/std.test.rv64.s \
73
		lib/std.test.rv64.o
74
75
# Kernel modules and tests use a separate package and test entry point.
76
KERNEL_SRC := kernel/kernel.rad $(shell find kernel/kernel -name '*.rad' ! -name 'tests.rad' ! -path '*/tests/*' 2>/dev/null)
77
KERNEL_ASM := kernel/kernel/boot.ras kernel/kernel/sync.ras kernel/kernel/trap.ras kernel/kernel/pages.ras kernel/kernel/loader.ras kernel/kernel/instances.ras kernel/kernel/domains.ras kernel/kernel/dispatch.ras kernel/kernel/calls.ras kernel/kernel/plic.ras
78
KERNEL_TEST_SRC := kernel/kernel/tests.rad $(shell find kernel/kernel/tests -name '*.rad' 2>/dev/null)
79
KERNEL := -pkg kernel $(patsubst %,-mod %,$(sort $(KERNEL_SRC)))
80
KERNEL_TEST := $(BIN_DIR)/kernel.test.rv64
81
82
kernel-test: emulator $(KERNEL_TEST)
83
	@$(EMU) $(EMU_FLAGS) -run $(KERNEL_TEST)
84
	@sh test/slots/run "$(EMU)" $(STD_TEST_SUPPORT) $(KERNEL) $(patsubst %,-mod %,$(KERNEL_TEST_SRC))
85
86
$(KERNEL_TEST): $(KERNEL_SRC) $(KERNEL_TEST_SRC) $(KERNEL_ASM) $(STD_LIB) $(RAD_BIN)
87
	@echo "radiance kernel tests => $@"
88
	@$(RADIANCE) -test $(STD_TEST_SUPPORT) $(KERNEL) $(patsubst %,-mod %,$(KERNEL_TEST_SRC) $(KERNEL_ASM)) -entry kernel -o $@
89
90
$(BIN_DIR)/kernel.ril $(BIN_DIR)/std.ril &: $(KERNEL_SRC) $(STD_LIB) $(RAD_BIN)
91
	@$(RADIANCE) $(STD) $(KERNEL) -entry kernel -ril $(BIN_DIR)
92
93
$(BIN_DIR)/kernel.build.rv64: kernel/tools/build.rad $(STD_LIB) $(RAD_BIN)
94
	@$(RADIANCE) $(STD) -pkg build -mod $< -entry build -o $@
95
96
# User packages share the ABI source through a staged package module tree.
97
$(BIN_DIR)/root.ril $(BIN_DIR)/scheduler.ril &: kernel/root.rad kernel/scheduler.rad kernel/mmio.rad kernel/kernel/abi.rad kernel/kernel/sys.rad $(RAD_BIN)
98
	@mkdir -p $(BIN_DIR)/user/root $(BIN_DIR)/user/scheduler
99
	@cp kernel/root.rad kernel/scheduler.rad $(BIN_DIR)/user/
100
	@cp kernel/kernel/abi.rad kernel/kernel/sys.rad $(BIN_DIR)/user/root/
101
	@cp kernel/kernel/abi.rad kernel/kernel/sys.rad kernel/mmio.rad $(BIN_DIR)/user/scheduler/
102
	@$(RADIANCE) -pkg root -mod $(BIN_DIR)/user/root.rad -mod $(BIN_DIR)/user/root/abi.rad -mod $(BIN_DIR)/user/root/sys.rad -entry root -ril $(BIN_DIR)
103
	@$(RADIANCE) -pkg scheduler -mod $(BIN_DIR)/user/scheduler.rad -mod $(BIN_DIR)/user/scheduler/abi.rad -mod $(BIN_DIR)/user/scheduler/sys.rad -mod $(BIN_DIR)/user/scheduler/mmio.rad -entry scheduler -ril $(BIN_DIR)
104
105
$(BIN_DIR)/kernel.rv64: $(BIN_DIR)/root.ril $(BIN_DIR)/scheduler.ril $(BIN_DIR)/std.ril $(BIN_DIR)/kernel.ril $(BIN_DIR)/kernel.build.rv64 $(KERNEL_ASM)
106
	@cat $(KERNEL_ASM) > $(BIN_DIR)/kernel.ras
107
	@$(EMU) $(EMU_FLAGS) -run $(BIN_DIR)/kernel.build.rv64 -- $(BIN_DIR)/std.ril $(BIN_DIR)/kernel.ril $(BIN_DIR)/kernel.ras $@ $(BIN_DIR)/root.ril $(BIN_DIR)/scheduler.ril
108
109
# Separate binary package emission, linkage, and decode checks.
110
package-test: emulator $(BIN_DIR)/packages.check.rv64 $(BIN_DIR)/shared.build.rv64
111
	@sh test/packages/run
112
	@RAD_EMULATOR="$(EMU)" test/shared/run
113
114
$(BIN_DIR)/packages.check.rv64: test/packages/check.rad $(STD_LIB) $(RAD_BIN)
115
	@$(RADIANCE) $(STD) -pkg check -mod $< -entry check -o $@
116
117
$(BIN_DIR)/native.build.rv64: test/native/build.rad $(STD_LIB) $(RAD_BIN)
118
	@$(RADIANCE) $(STD) -pkg build -mod $< -entry build -o $@
119
120
$(BIN_DIR)/native.fixture.rv64: $(BIN_DIR)/native.build.rv64
121
	@$(EMU) -run $< -- $@
122
123
$(BIN_DIR)/shared.build.rv64: test/shared/build.rad $(STD_LIB) $(RAD_BIN)
124
	@$(RADIANCE) $(STD) -pkg build -mod $< -entry build -o $@
125
126
# Native architecture and machine-boundary checks.
127
machine-test: emulator $(BIN_DIR)/native.fixture.rv64 $(BIN_DIR)/sync.build.rv64
128
	@$(EMU) -machine -run $(BIN_DIR)/native.fixture.rv64
129
	@RAD_EMULATOR="$(EMU)" test/sync/run
130
	@RAD_EMULATOR="$(EMU)" sh test/trap/run
131
	@RAD_EMULATOR="$(EMU)" sh test/pages/run
132
133
$(BIN_DIR)/sync.build.rv64: test/sync/build.rad $(STD_LIB) $(RAD_BIN)
134
	@$(RADIANCE) $(STD) -pkg build -mod $< -entry build -o $@
135
136
# Binary Tests
137
138
BIN_TEST_DIR := test/tests
139
# Only tests with `//! returns:` are compiled to binaries and executed.
140
BIN_TEST_EXE_SRC := $(shell grep -rl '^//! returns:' $(BIN_TEST_DIR))
141
BIN_TEST_RAD_EXE_SRC := $(filter %.rad,$(BIN_TEST_EXE_SRC))
142
BIN_TEST_RAS_EXE_SRC := $(filter %.ras,$(BIN_TEST_EXE_SRC))
143
BIN_TEST_RAD_ASM_SRC := $(wildcard $(BIN_TEST_RAD_EXE_SRC:.rad=.ras))
144
BIN_TEST_RAD_START_SRC := $(wildcard $(BIN_TEST_RAD_EXE_SRC:.rad=.start.ras))
145
BIN_TEST_EXE_BIN := $(patsubst %.rad,%.rv64,$(BIN_TEST_RAD_EXE_SRC)) \
146
	$(patsubst %.ras,%.rv64,$(BIN_TEST_RAS_EXE_SRC))
147
BIN_RUNNER   := test/runner.rv64
148
BIN_TEST_RUN := test/run
149
150
bin-test: $(BIN_RUNNER) $(BIN_TEST_EXE_BIN)
151
	@echo
152
	@$(BIN_TEST_RUN)
153
154
# Runner binary: the lowering IL checker.
155
$(BIN_RUNNER): test/runner.rad $(STD_LIB) $(RAD_BIN)
156
	@echo "radiance test/runner.rad => $@"
157
	@$(RADIANCE) $(STD) -pkg runner -mod test/runner.rad -entry runner -o $@
158
159
# A `.rad` executable test can have a same-basename `.ras` module.
160
$(patsubst %.ras,%.rv64,$(BIN_TEST_RAD_ASM_SRC)): %.rv64: %.ras
161
$(patsubst %.start.ras,%.rv64,$(BIN_TEST_RAD_START_SRC)): %.rv64: %.start.ras
162
163
# Package fixtures can request session support.
164
BIN_TEST_SESSION_SRC := $(shell grep -l '^//! session-support$$' $(BIN_TEST_RAD_EXE_SRC))
165
$(BIN_TEST_SESSION_SRC:.rad=.rv64): TEST_STD_FLAGS := $(TEST_FIXTURE_STD)
166
$(BIN_TEST_SESSION_SRC:.rad=.rv64): TEST_ENTRY_FLAGS := -entry test
167
$(BIN_TEST_SESSION_SRC:.rad=.rv64): $(TEST_FIXTURE_STD_LIB) test/support/std.lib
168
169
# Compile each executable test to a binary.
170
$(BIN_TEST_DIR)/%.rv64: $(BIN_TEST_DIR)/%.rad $(RAD_BIN)
171
	@echo "radiance $< => $@"
172
	@$(RADIANCE) $(TEST_STD_FLAGS) -pkg test -mod $< $(TEST_ENTRY_FLAGS) $(patsubst %,-mod %,$(wildcard $(@:.rv64=)/*.rad)) $(patsubst %,-start %,$(wildcard $(@:.rv64=.start.ras))) $(patsubst %,-mod %,$(wildcard $(@:.rv64=.ras))) -o $@
173
174
$(BIN_TEST_DIR)/%.rv64: $(BIN_TEST_DIR)/%.ras $(BIN_RUNNER)
175
	@echo "asm $< => $@"
176
	@$(EMU) $(EMU_FLAGS) -run $(BIN_RUNNER) -- assemble $< $@
177
178
clean-bin-test:
179
	@rm -f $(BIN_RUNNER) \
180
		$(BIN_RUNNER:.rv64=.rv64.debug) \
181
		$(BIN_RUNNER:.rv64=.rv64.s) \
182
		$(BIN_RUNNER:.rv64=.rv64.o) \
183
		$(BIN_TEST_EXE_BIN) \
184
		$(wildcard $(BIN_TEST_DIR)/*.rv64.debug) \
185
		$(wildcard $(BIN_TEST_DIR)/*.rv64.s)
186
187
seed:
188
	seed/update
189
190
clean-rad:
191
	rm -rf bin/*
192
	rm -f seed/radiance.rv64.s[0-9]*
193
194
clean: clean-std-test clean-bin-test clean-rad
195
196
t: test
197
c: clean
198
199
.PHONY: test clean default seed-test std-test bin-test kernel-test package-test machine-test kernel-acceptance \
200
	kernel-size-check acceptance seed \
201
	clean-std-test clean-bin-test clean-rad emulator
202
.SUFFIXES:
203
.DELETE_ON_ERROR:
204
.SILENT:
205
206
# Full-kernel scenarios that require native execution or distinct fixture images.
207
kernel-acceptance: emulator $(RAD_BIN) $(BIN_DIR)/kernel.build.rv64 $(BIN_DIR)/kernel.rv64
208
	@RAD_EMULATOR="$(EMU)" sh test/boot/run
209
	@RAD_EMULATOR="$(EMU)" sh test/loader/run
210
	@RAD_EMULATOR="$(EMU)" sh test/dispatch/run
211
	@RAD_EMULATOR="$(EMU)" sh test/dispatch/run smp "1 2 8" 7
212
	@RAD_EMULATOR="$(EMU)" sh test/dispatch/run termination
213
	@RAD_EMULATOR="$(EMU)" sh test/runtime/run
214
	@RAD_EMULATOR="$(EMU)" sh test/bootstrap/run
215
	@RAD_EMULATOR="$(EMU)" sh test/dispatch/run mmio
216
	@RAD_EMULATOR="$(EMU)" sh test/cycles/run
217
	@RAD_EMULATOR="$(EMU)" sh test/scheduling/run
218
219
# Physical source-line limits and fixed native image memory.
220
.PHONY: kernel-size-check
221
kernel-size-check: $(BIN_DIR)/kernel.rv64
222
	@python3 test/acceptance/sizes
223
224
# Full sibling-emulator validation with retained acceptance reports.
225
acceptance:
226
	@sh test/acceptance/run