Makefile 3.7 KiB raw
1
# Radiance build file.
2
3
# Core standard library modules.
4
STD := -pkg std $(patsubst %,-mod %,$(shell cat std.lib))
5
6
# Full standard library with test modules.
7
STD_TEST := $(STD) $(patsubst %,-mod %,$(shell cat std.lib.test))
8
9
# Source files.
10
STD_LIB := $(shell find lib -name '*.rad')
11
BIN_DIR := bin
12
RAD_BIN := $(BIN_DIR)/radiance.rv64.dev
13
14
# Emulator command used to invoke the self-hosted compiler.
15
EMU       := $(or $(RAD_EMULATOR),emulator)
16
EMU_FLAGS := -memory-size=385024 \
17
			 -data-size=348160 \
18
			 -stack-size=512 \
19
			 -count-instructions
20
RADIANCE  := $(EMU) $(EMU_FLAGS) -run $(RAD_BIN)
21
22
# Verify the emulator binary exists.
23
EMU_PATH := $(shell command -v $(EMU) 2>/dev/null)
24
25
default: emulator $(RAD_BIN)
26
test: emulator seed-test std-test bin-test
27
28
seed-test:
29
	@seed/test
30
31
# Emulator command check
32
33
emulator:
34
ifeq ($(EMU_PATH),)
35
	$(error Emulator not found. Install it or set RAD_EMULATOR to its path)
36
endif
37
38
# Compiler build
39
40
SEED      := seed/radiance.rv64
41
COMPILER_SRC := compiler/radiance.rad compiler/radiance/codegen.rad
42
SEED_OPTS := $(STD) -pkg radiance $(patsubst %,-mod %,$(COMPILER_SRC)) -entry radiance
43
44
$(RAD_BIN): $(STD_LIB) $(COMPILER_SRC) | $(BIN_DIR)
45
	@echo "radiance $(SEED) => $@"
46
	@$(EMU) $(EMU_FLAGS) -run $(SEED) $(SEED_OPTS) -o $@
47
48
$(BIN_DIR):
49
	@mkdir -p $@
50
51
# Standard Library Tests
52
53
STD_LIB_TEST := lib/std.test.rv64
54
55
std-test: $(STD_LIB_TEST)
56
	@echo
57
	@$(EMU) $(EMU_FLAGS) -run $(STD_LIB_TEST)
58
59
$(STD_LIB_TEST): $(STD_LIB) $(RAD_BIN)
60
	@echo "radiance -test $(STD_TEST) -entry std -o $@"
61
	@$(RADIANCE) -test $(STD_TEST) -entry std -o $@
62
63
clean-std-test:
64
	@rm -f lib/std.test.rv64 \
65
		lib/std.test.rv64.debug \
66
		lib/std.test.rv64.s \
67
		lib/std.test.rv64.o
68
69
# Binary Tests
70
71
BIN_TEST_DIR := test/tests
72
# Only tests with `//! returns:` are compiled to binaries and executed.
73
BIN_TEST_EXE_SRC := $(shell grep -rl '^//! returns:' $(BIN_TEST_DIR))
74
BIN_TEST_RAD_EXE_SRC := $(filter %.rad,$(BIN_TEST_EXE_SRC))
75
BIN_TEST_RAS_EXE_SRC := $(filter %.ras,$(BIN_TEST_EXE_SRC))
76
BIN_TEST_RAD_ASM_SRC := $(wildcard $(BIN_TEST_RAD_EXE_SRC:.rad=.ras))
77
BIN_TEST_RAD_START_SRC := $(wildcard $(BIN_TEST_RAD_EXE_SRC:.rad=.start.ras))
78
BIN_TEST_EXE_BIN := $(patsubst %.rad,%.rv64,$(BIN_TEST_RAD_EXE_SRC)) \
79
	$(patsubst %.ras,%.rv64,$(BIN_TEST_RAS_EXE_SRC))
80
BIN_RUNNER   := test/runner.rv64
81
BIN_TEST_RUN := test/run
82
83
bin-test: $(BIN_RUNNER) $(BIN_TEST_EXE_BIN)
84
	@echo
85
	@$(BIN_TEST_RUN)
86
87
# Runner binary: the lowering IL checker.
88
$(BIN_RUNNER): test/runner.rad $(STD_LIB) $(RAD_BIN)
89
	@echo "radiance test/runner.rad => $@"
90
	@$(RADIANCE) $(STD) -pkg runner -mod test/runner.rad -entry runner -o $@
91
92
# A `.rad` executable test can have a same-basename `.ras` module.
93
$(patsubst %.ras,%.rv64,$(BIN_TEST_RAD_ASM_SRC)): %.rv64: %.ras
94
$(patsubst %.start.ras,%.rv64,$(BIN_TEST_RAD_START_SRC)): %.rv64: %.start.ras
95
96
# Compile each executable test to a binary.
97
$(BIN_TEST_DIR)/%.rv64: $(BIN_TEST_DIR)/%.rad $(RAD_BIN)
98
	@echo "radiance $< => $@"
99
	@$(RADIANCE) -pkg test -mod $< $(patsubst %,-mod %,$(wildcard $(@:.rv64=)/*.rad)) $(patsubst %,-start %,$(wildcard $(@:.rv64=.start.ras))) $(patsubst %,-mod %,$(wildcard $(@:.rv64=.ras))) -o $@
100
101
$(BIN_TEST_DIR)/%.rv64: $(BIN_TEST_DIR)/%.ras $(BIN_RUNNER)
102
	@echo "asm $< => $@"
103
	@$(EMU) $(EMU_FLAGS) -run $(BIN_RUNNER) -- assemble $< $@
104
105
clean-bin-test:
106
	@rm -f $(BIN_RUNNER) \
107
		$(BIN_RUNNER:.rv64=.rv64.debug) \
108
		$(BIN_RUNNER:.rv64=.rv64.s) \
109
		$(BIN_RUNNER:.rv64=.rv64.o) \
110
		$(BIN_TEST_EXE_BIN) \
111
		$(wildcard $(BIN_TEST_DIR)/*.rv64.debug) \
112
		$(wildcard $(BIN_TEST_DIR)/*.rv64.s)
113
114
seed:
115
	seed/update
116
117
clean-rad:
118
	rm -rf bin/*
119
	rm -f seed/radiance.rv64.s[0-9]*
120
121
clean: clean-std-test clean-bin-test clean-rad
122
123
t: test
124
c: clean
125
126
.PHONY: test clean default seed-test std-test bin-test seed \
127
	clean-std-test clean-bin-test clean-rad emulator
128
.SUFFIXES:
129
.DELETE_ON_ERROR:
130
.SILENT: