-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
130 lines (106 loc) · 2.86 KB
/
Copy pathMakefile
File metadata and controls
130 lines (106 loc) · 2.86 KB
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
HOST ?= i686-elf
HOSTARCH ?= i386
SYSTEM_HEADER_PROJECTS := libc kernel
PROJECTS := libc kernel
SYSROOT := $(CURDIR)/sysroot
ISODIR := $(CURDIR)/isodir
ISO := myos.iso
PREFIX := /usr
EXEC_PREFIX := $(PREFIX)
BOOTDIR := /boot
LIBDIR := $(EXEC_PREFIX)/lib
INCLUDEDIR := $(PREFIX)/include
AR := $(HOST)-ar
AS := $(HOST)-as
CC := $(HOST)-gcc --sysroot=$(SYSROOT)
CXX := $(HOST)-g++ --sysroot=$(SYSROOT)
CFLAGS ?= -O2 -g
CFLAGS += -Wall -Wextra
CXXFLAGS ?= -O2 -g
CXXFLAGS += -Wall -Wextra -fno-exceptions -fno-rtti
CPPFLAGS ?=
# Your freestanding headers are installed into sysroot/usr/include.
# Do not point the cross compiler at the host /usr/include.
ifneq ($(filter %-elf,$(HOST)),)
CPPFLAGS += -isystem $(SYSROOT)$(INCLUDEDIR)
endif
QEMU := qemu-system-i386
QEMU_MEM ?= 128M
VNC_PASSWORD_FILE ?= .vnc-password
VNC_HOST_FILE ?= .vnc-host
VNC_DISPLAY ?= 1
export HOST
export HOSTARCH
export AR
export AS
export CC
export CXX
export PREFIX
export EXEC_PREFIX
export BOOTDIR
export LIBDIR
export INCLUDEDIR
export SYSROOT
export CFLAGS
export CXXFLAGS
export CPPFLAGS
.PHONY: all clean headers build iso qemu qemu-vnc check-iso check-grub default-host
all: iso
default-host:
@echo $(HOST)
headers:
mkdir -p $(SYSROOT)
set -e; for project in $(SYSTEM_HEADER_PROJECTS); do \
$(MAKE) -C $$project DESTDIR=$(SYSROOT) install-headers; \
done
build: headers
set -e; for project in $(PROJECTS); do \
$(MAKE) -C $$project DESTDIR=$(SYSROOT) install; \
done
clean:
set -e; for project in $(PROJECTS); do \
$(MAKE) -C $$project clean; \
done
rm -rf $(SYSROOT)
rm -rf $(ISODIR)
rm -f $(ISO)
iso: build
rm -rf $(ISODIR)
mkdir -p $(ISODIR)/boot/grub
cp $(SYSROOT)$(BOOTDIR)/myos.kernel $(ISODIR)/boot/myos.kernel
printf '%s\n' \
'set timeout=0' \
'set default=0' \
'' \
'menuentry "myos" {' \
' multiboot /boot/myos.kernel' \
' boot' \
'}' > $(ISODIR)/boot/grub/grub.cfg
grub-file --is-x86-multiboot $(SYSROOT)$(BOOTDIR)/myos.kernel
grub-mkrescue -o $(ISO) $(ISODIR)
check-iso: iso
xorriso -indev $(ISO) -ls /boot
xorriso -indev $(ISO) -ls /boot/grub
xorriso -indev $(ISO) -report_el_torito plain
check-grub: iso
xorriso -indev $(ISO) -ls /boot/grub
qemu: iso
$(QEMU) \
-cdrom ./$(ISO) \
-boot d \
-machine pc \
-vga std \
-monitor stdio \
-m $(QEMU_MEM)
qemu-vnc: iso
@test -f $(VNC_PASSWORD_FILE) || (echo "Missing $(VNC_PASSWORD_FILE). Create it with: printf '%s' '<password>' > $(VNC_PASSWORD_FILE) && chmod 600 $(VNC_PASSWORD_FILE)" && exit 1)
@test -f $(VNC_HOST_FILE) || (echo "Missing $(VNC_HOST_FILE). Create it with: printf '%s' '<remote-private-ip>' > $(VNC_HOST_FILE) && chmod 600 $(VNC_HOST_FILE)" && exit 1)
$(QEMU) \
-cdrom ./$(ISO) \
-boot d \
-machine pc \
-vga std \
-object secret,id=vncpass,file=$(VNC_PASSWORD_FILE) \
-vnc $$(cat $(VNC_HOST_FILE)):$(VNC_DISPLAY),password-secret=vncpass \
-monitor stdio \
-m $(QEMU_MEM)