-
Notifications
You must be signed in to change notification settings - Fork 0
/
Makefile
146 lines (110 loc) · 3.25 KB
/
Makefile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
MAKE_CFG := $(shell ./config.rs --make > config.mk)
CARGO_CFG := $(shell ./config.rs --cargo)
include config.mk
ifeq ($(CFG_ARCH), x64)
TRIPLE = x86_64-elf
AS = nasm
AFLAGS = -f elf64
ifndef RELEASE
AFLAGS += -g
endif
ASRC = start.s interrupts.s syscall.s
QEMU = qemu-system-x86_64
QFLAGS = -m 5G
else ifeq ($(CFG_ARCH), aarch64)
TRIPLE = aarch64-elf
QEMU = qemu-system-aarch64
QFLAGS = -m 1G \
-machine virt \
-cpu cortex-a57
else
$(error Unknown architecture "$(CFG_ARCH)")
endif
TOOLCHAIN = toolchain/$(CFG_ARCH)/bin/$(TRIPLE)-
BUILDDIR = $(shell pwd)/build
OBJDIR = $(BUILDDIR)/obj
ISODIR = $(BUILDDIR)/iso
RUSTDIR = $(BUILDDIR)/rust
RBUILDDIR = $(RUSTDIR)/*-kernel/*
BUNDLEDIR = $(BUILDDIR)/bundle
DISASDIR = $(BUILDDIR)/disas
LN = ln -sf
CARGO = cargo
CFLAGS = --target kernel/arch/$(CFG_ARCH)/$(CFG_ARCH)-kernel.json
LD = $(TOOLCHAIN)ld
LFLAGS = -T kernel/arch/$(CFG_ARCH)/link.ld \
-z max-page-size=0x1000 \
-z noexecstack \
--gc-sections
ISO = grub-mkrescue
IFLAGS = -follow-links -no-pad
GRUB_CFG = cfg/grub.cfg
QFLAGS += -chardev stdio,id=serial0,logfile=qemu.log \
-serial chardev:serial0 \
-no-reboot \
-no-shutdown
ifeq ($(CFG_GRAPHIC), false)
QFLAGS += -display none
endif
ifdef RELEASE
CFLAGS += --release
endif
KERNLIB = $(RBUILDDIR)/libkernel.a
USERSPACE_CRATES = $(notdir $(wildcard userspace/*))
USER_CRATES_BINS = $(filter-out ulib, $(USERSPACE_CRATES))
USER_BINS_TARGET = $(USER_CRATES_BINS:%=$(RBUILDDIR)/%)
USERSPACE_BUNDLE = $(USER_BINS_TARGET:$(RBUILDDIR)/%=$(BUNDLEDIR)/%)
AOBJ = $(ASRC:%.s=$(OBJDIR)/%.o)
OBJS = $(AOBJ) $(KERNLIB)
KERNBIN = $(BUILDDIR)/kernel.bin
KERNISO = $(BUILDDIR)/kote.iso
ECHO = printf '%5s %s\n\c' $1 $2 $(@F)
all: qemu
iso: $(KERNISO)
kernel: $(KERNBIN)
qemu: $(KERNISO)
@$(call ECHO, qemu, $(<F))
@$(QEMU) $(QFLAGS) -cdrom $^
clippy:
@$(call ECHO, cargo)
@$(CARGO) clippy $(CFLAGS) -- -W clippy::all
$(KERNBIN): $(OBJS)
@$(call ECHO, ld)
@$(LD) $(LFLAGS) $^ -o $@
$(OBJDIR)/%.o: kernel/arch/$(CFG_ARCH)/%.s | $(OBJDIR)
@$(call ECHO, as)
@$(AS) $(AFLAGS) $^ -o $@
$(KERNISO): $(KERNBIN) | $(ISODIR)
@$(call ECHO, iso)
@$(LN) $(realpath $(KERNBIN)) $(ISODIR)
@$(LN) $(realpath $(GRUB_CFG)) $(ISODIR)/boot/grub
@$(ISO) $(IFLAGS) $(ISODIR) -o $@ 2> /dev/null
$(KERNLIB): $(USERSPACE_BUNDLE) config.rs | $(RUSTDIR)
@$(call ECHO, cargo)
@$(CARGO_CFG) $(CARGO) build $(CFLAGS) -p kernel
$(BUNDLEDIR)/%: $(RBUILDDIR)/% | $(BUNDLEDIR)
@$(LN) $^ $@
$(USER_BINS_TARGET): | $(RUSTDIR)
@$(call ECHO, cargo)
@$(CARGO) build $(CFLAGS) -p $(@F)
$(OBJDIR) $(RUSTDIR) $(DISASDIR) $(BUNDLEDIR):
@mkdir -p $@
$(ISODIR):
@mkdir -p $@/boot/grub
clean:
@$(call ECHO)
@rm -rf $(BUILDDIR) $(KERNBIN) $(KERNISO)
-include debug.mk
-include overrides.mk
-include toolchain.mk
-include $(RBUILDDIR)/libkernel.d
-include $(USER_BINS_TARGET:%=%.d)
.PHONY: all iso kernel qemu clippy clean
.NOTPARALLEL:
.DELETE_ON_ERROR:
.SUFFIXES:
MAKEFLAGS += --no-builtin-rules \
--no-builtin-variables