Makefile 5.4 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
# Test modules are partitioned so each native image fits the emulator.
10
STD_TEST_MODULES := $(shell cat std.lib.test)
11
STD_TEST_SUPPORT := lib/std/testing.rad
12
# Resolver tests use parser test helpers.
13
STD_TEST_FRONTEND := $(filter lib/std/lang/parser/% lib/std/lang/resolver/%,$(STD_TEST_MODULES))
14
STD_TEST_CORE := $(filter-out $(STD_TEST_SUPPORT) $(STD_TEST_FRONTEND),$(STD_TEST_MODULES))
15
STD_TEST = $(STD) $(patsubst %,-mod %,$(STD_TEST_SUPPORT) $(STD_TEST_SOURCES))
16
17
# Source files.
18
STD_LIB := $(shell find lib -name '*.rad')
19
BIN_DIR := bin
20
RAD_BIN := $(BIN_DIR)/radiance.rv64.dev
21
22
# Emulator command used to invoke the self-hosted compiler.
23
EMU       := $(or $(RAD_EMULATOR),emulator)
24
EMU_FLAGS := -memory-size=385024 \
25
			 -data-size=348160 \
26
			 -stack-size=512 \
27
			 -count-instructions
28
RADIANCE  := $(EMU) $(EMU_FLAGS) -run $(RAD_BIN)
29
30
# Verify the emulator binary exists.
31
EMU_PATH := $(shell command -v $(EMU) 2>/dev/null)
32
33
default: emulator $(RAD_BIN)
34
test: emulator seed-test std-test bin-test driver-test
35
36
seed-test:
37
	@seed/test
38
39
# Emulator command check
40
41
emulator:
42
ifeq ($(EMU_PATH),)
43
	$(error Emulator not found. Install it or set RAD_EMULATOR to its path)
44
endif
45
46
# Compiler build
47
48
SEED      := seed/radiance.rv64
49
COMPILER_SRC := compiler/radiance.rad compiler/radiance/codegen.rad
50
SEED_OPTS := $(STD) -pkg radiance $(patsubst %,-mod %,$(COMPILER_SRC)) -entry radiance
51
52
$(RAD_BIN): $(STD_LIB) $(COMPILER_SRC) std.lib | $(BIN_DIR)
53
	@echo "radiance $(SEED) => $@"
54
	@$(EMU) $(EMU_FLAGS) -run $(SEED) $(SEED_OPTS) -o $@
55
56
$(BIN_DIR):
57
	@mkdir -p $@
58
59
# Standard Library Tests
60
61
STD_LIB_TEST := lib/std.core.test.rv64 lib/std.frontend.test.rv64
62
63
lib/std.core.test.rv64: STD_TEST_SOURCES := $(STD_TEST_CORE)
64
lib/std.frontend.test.rv64: STD_TEST_SOURCES := $(STD_TEST_FRONTEND)
65
66
std-test: $(STD_LIB_TEST)
67
	@echo
68
	@set -e; for image in $(STD_LIB_TEST); do \
69
		$(EMU) $(EMU_FLAGS) -run $$image; \
70
	done
71
72
$(STD_LIB_TEST): $(STD_LIB) $(RAD_BIN) std.lib std.lib.test Makefile
73
	@echo "radiance -test $(STD_TEST) -entry std -o $@"
74
	@$(RADIANCE) -test $(STD_TEST) -entry std -o $@
75
76
clean-std-test:
77
	@rm -f $(STD_LIB_TEST) \
78
		$(addsuffix .debug,$(STD_LIB_TEST)) \
79
		$(addsuffix .s,$(STD_LIB_TEST)) \
80
		$(addsuffix .o,$(STD_LIB_TEST))
81
82
# Binary Tests
83
84
# Driver fixtures exercise argument parsing and test discovery.
85
driver-test: $(RAD_BIN)
86
	@RAD_EMULATOR="$(EMU)" RAD_BIN="$(RAD_BIN)" test/command
87
	@RAD_EMULATOR="$(EMU)" RAD_BIN="$(RAD_BIN)" test/driver
88
89
driver-command: $(RAD_BIN)
90
	@$(RADIANCE) $(DRIVER_ARGUMENTS)
91
92
driver-test-image: $(RAD_BIN)
93
	@$(RADIANCE) -test $(STD) -mod lib/std/testing.rad $(DRIVER_TEST_INPUTS) $(DRIVER_TEST_FLAGS) \
94
		-entry selected -o $(DRIVER_TEST_OUTPUT)
95
96
BIN_TEST_DIR := test/tests
97
# Only tests with `//! returns:` are compiled to binaries and executed.
98
BIN_TEST_EXE_SRC := $(shell grep -rl '^//! returns:' $(BIN_TEST_DIR))
99
BIN_TEST_RAD_EXE_SRC := $(filter %.rad,$(BIN_TEST_EXE_SRC))
100
BIN_TEST_RAS_EXE_SRC := $(filter %.ras,$(BIN_TEST_EXE_SRC))
101
BIN_TEST_RAD_ASM_SRC := $(wildcard $(BIN_TEST_RAD_EXE_SRC:.rad=.ras))
102
BIN_TEST_RAD_START_SRC := $(wildcard $(BIN_TEST_RAD_EXE_SRC:.rad=.start.ras))
103
BIN_TEST_EXE_BIN := $(patsubst %.rad,%.rv64,$(BIN_TEST_RAD_EXE_SRC)) \
104
	$(patsubst %.ras,%.rv64,$(BIN_TEST_RAS_EXE_SRC))
105
BIN_RUNNER   := test/runner.rv64
106
BIN_TEST_RUN := test/run
107
108
bin-test: $(BIN_RUNNER) $(BIN_TEST_EXE_BIN)
109
	@echo
110
	@$(BIN_TEST_RUN)
111
112
# Runner binary: the lowering IL checker.
113
$(BIN_RUNNER): test/runner.rad $(STD_LIB) $(RAD_BIN)
114
	@echo "radiance test/runner.rad => $@"
115
	@$(RADIANCE) $(STD) -pkg runner -mod test/runner.rad -entry runner -o $@
116
117
# A `.rad` executable test can have a same-basename `.ras` module.
118
$(patsubst %.ras,%.rv64,$(BIN_TEST_RAD_ASM_SRC)): %.rv64: %.ras
119
$(patsubst %.start.ras,%.rv64,$(BIN_TEST_RAD_START_SRC)): %.rv64: %.start.ras
120
121
# Package fixtures can request session support.
122
BIN_TEST_SESSION_SRC := $(shell grep -l '^//! session-support$$' $(BIN_TEST_RAD_EXE_SRC))
123
$(BIN_TEST_SESSION_SRC:.rad=.rv64): TEST_STD_FLAGS := $(TEST_FIXTURE_STD)
124
$(BIN_TEST_SESSION_SRC:.rad=.rv64): TEST_ENTRY_FLAGS := -entry test
125
$(BIN_TEST_SESSION_SRC:.rad=.rv64): $(TEST_FIXTURE_STD_LIB) test/support/std.lib
126
127
# Compile each executable test to a binary.
128
$(BIN_TEST_DIR)/%.rv64: $(BIN_TEST_DIR)/%.rad $(RAD_BIN)
129
	@echo "radiance $< => $@"
130
	@$(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 $@
131
132
$(BIN_TEST_DIR)/%.rv64: $(BIN_TEST_DIR)/%.ras $(BIN_RUNNER)
133
	@echo "asm $< => $@"
134
	@$(EMU) $(EMU_FLAGS) -run $(BIN_RUNNER) -- assemble $< $@
135
136
clean-bin-test:
137
	@rm -f $(BIN_RUNNER) \
138
		$(BIN_RUNNER:.rv64=.rv64.debug) \
139
		$(BIN_RUNNER:.rv64=.rv64.s) \
140
		$(BIN_RUNNER:.rv64=.rv64.o) \
141
		$(BIN_TEST_EXE_BIN) \
142
		$(wildcard $(BIN_TEST_DIR)/*.rv64.debug) \
143
		$(wildcard $(BIN_TEST_DIR)/*.rv64.s)
144
145
seed:
146
	seed/update
147
148
clean-rad:
149
	rm -rf bin/*
150
	rm -f seed/radiance.rv64.s[0-9]*
151
152
clean: clean-std-test clean-bin-test clean-rad
153
154
t: test
155
c: clean
156
157
.PHONY: test clean default seed-test std-test bin-test seed \
158
	clean-std-test clean-bin-test clean-rad emulator driver-test driver-test-image driver-command
159
.SUFFIXES:
160
.DELETE_ON_ERROR:
161
.SILENT: