22# #
33# # Copyright (c) 2018-2021 Andre Richter <andre.o.richter@gmail.com>
44
5- include ../utils /color.mk.in
5+ include ../common /color.mk.in
66
7- # Default to the RPi3
7+ # #--------------------------------------------------------------------------------------------------
8+ # # Optional, user-provided configuration values
9+ # #--------------------------------------------------------------------------------------------------
10+
11+ # Default to the RPi3.
812BSP ?= rpi3
913
10- # BSP-specific arguments
14+
15+
16+ # #--------------------------------------------------------------------------------------------------
17+ # # Hardcoded configuration values
18+ # #--------------------------------------------------------------------------------------------------
19+
20+ # BSP-specific arguments.
1121ifeq ($(BSP ) ,rpi3)
1222 TARGET = aarch64-unknown-none-softfloat
1323 KERNEL_BIN = kernel8.img
@@ -32,11 +42,18 @@ else ifeq ($(BSP),rpi4)
3242 RUSTC_MISC_ARGS = -C target-cpu=cortex-a72
3343endif
3444
35- # Export for build.rs
45+ QEMU_MISSING_STRING = "This board is not yet supported for QEMU."
46+
47+ # Export for build.rs.
3648export LINKER_FILE
3749
38- QEMU_MISSING_STRING = "This board is not yet supported for QEMU."
50+ KERNEL_ELF = target/$(TARGET ) /release/kernel
51+
3952
53+
54+ # #--------------------------------------------------------------------------------------------------
55+ # # Command building blocks
56+ # #--------------------------------------------------------------------------------------------------
4057RUSTFLAGS = -C link-arg=-T$(LINKER_FILE ) $(RUSTC_MISC_ARGS )
4158RUSTFLAGS_PEDANTIC = $(RUSTFLAGS ) -D warnings -D missing_docs
4259
@@ -53,51 +70,84 @@ OBJCOPY_CMD = rust-objcopy \
5370 --strip-all \
5471 -O binary
5572
56- KERNEL_ELF = target/ $( TARGET ) /release/kernel
73+ EXEC_QEMU = $( QEMU_BINARY ) -M $( QEMU_MACHINE_TYPE )
5774
58- DOCKER_IMAGE = rustembedded/osdev-utils
59- DOCKER_CMD = docker run --rm -v $(shell pwd) :/work/tutorial -w /work/tutorial
60- DOCKER_CMD_INTERACT = $(DOCKER_CMD ) -i -t
75+ # #------------------------------------------------------------------------------
76+ # # Dockerization
77+ # #------------------------------------------------------------------------------
78+ DOCKER_IMAGE = rustembedded/osdev-utils
79+ DOCKER_CMD = docker run -t --rm -v $(shell pwd) :/work/tutorial -w /work/tutorial
80+ DOCKER_CMD_INTERACT = $(DOCKER_CMD ) -i
6181
6282DOCKER_QEMU = $(DOCKER_CMD_INTERACT ) $(DOCKER_IMAGE )
6383DOCKER_TOOLS = $(DOCKER_CMD ) $(DOCKER_IMAGE )
6484
65- EXEC_QEMU = $(QEMU_BINARY ) -M $(QEMU_MACHINE_TYPE )
6685
86+
87+ # #--------------------------------------------------------------------------------------------------
88+ # # Targets
89+ # #--------------------------------------------------------------------------------------------------
6790.PHONY : all $(KERNEL_ELF ) $(KERNEL_BIN ) doc qemu clippy clean readelf objdump nm check
6891
6992all : $(KERNEL_BIN )
7093
94+ # #------------------------------------------------------------------------------
95+ # # Build the kernel ELF
96+ # #------------------------------------------------------------------------------
7197$(KERNEL_ELF ) :
7298 $(call colorecho, "\nCompiling kernel - $(BSP ) ")
7399 @RUSTFLAGS=" $( RUSTFLAGS_PEDANTIC) " $(RUSTC_CMD )
74100
101+ # #------------------------------------------------------------------------------
102+ # # Build the stripped kernel binary
103+ # #------------------------------------------------------------------------------
75104$(KERNEL_BIN ) : $(KERNEL_ELF )
76105 @$(OBJCOPY_CMD ) $(KERNEL_ELF ) $(KERNEL_BIN )
77106
107+ # #------------------------------------------------------------------------------
108+ # # Build the documentation
109+ # #------------------------------------------------------------------------------
78110doc :
79111 $(call colorecho, "\nGenerating docs")
80112 @$(DOC_CMD ) --document-private-items --open
81113
82- ifeq ($(QEMU_MACHINE_TYPE ) ,)
114+ # #------------------------------------------------------------------------------
115+ # # Run the kernel in QEMU
116+ # #------------------------------------------------------------------------------
117+ ifeq ($(QEMU_MACHINE_TYPE ) ,) # QEMU is not supported for the board.
118+
83119qemu :
84120 $(call colorecho, "\n$(QEMU_MISSING_STRING ) ")
85- else
121+
122+ else # QEMU is supported.
123+
86124qemu : $(KERNEL_BIN )
87125 $(call colorecho, "\nLaunching QEMU")
88126 @$(DOCKER_QEMU ) $(EXEC_QEMU ) $(QEMU_RELEASE_ARGS ) -kernel $(KERNEL_BIN )
89127endif
90128
129+ # #------------------------------------------------------------------------------
130+ # # Run clippy
131+ # #------------------------------------------------------------------------------
91132clippy :
92133 @RUSTFLAGS=" $( RUSTFLAGS_PEDANTIC) " $(CLIPPY_CMD )
93134
135+ # #------------------------------------------------------------------------------
136+ # # Clean
137+ # #------------------------------------------------------------------------------
94138clean :
95139 rm -rf target $(KERNEL_BIN )
96140
141+ # #------------------------------------------------------------------------------
142+ # # Run readelf
143+ # #------------------------------------------------------------------------------
97144readelf : $(KERNEL_ELF )
98145 $(call colorecho, "\nLaunching readelf")
99146 @$(DOCKER_TOOLS ) $(READELF_BINARY ) --headers $(KERNEL_ELF )
100147
148+ # #------------------------------------------------------------------------------
149+ # # Run objdump
150+ # #------------------------------------------------------------------------------
101151objdump : $(KERNEL_ELF )
102152 $(call colorecho, "\nLaunching objdump")
103153 @$(DOCKER_TOOLS ) $(OBJDUMP_BINARY ) --disassemble --demangle \
@@ -106,10 +156,15 @@ objdump: $(KERNEL_ELF)
106156 --section .got \
107157 $(KERNEL_ELF) | rustfilt
108158
159+ # #------------------------------------------------------------------------------
160+ # # Run nm
161+ # #------------------------------------------------------------------------------
109162nm : $(KERNEL_ELF )
110163 $(call colorecho, "\nLaunching nm")
111164 @$(DOCKER_TOOLS ) $(NM_BINARY ) --demangle --print-size $(KERNEL_ELF ) | sort | rustfilt
112165
113- # For rust-analyzer
166+ # #------------------------------------------------------------------------------
167+ # # Helper target for rust-analyzer
168+ # #------------------------------------------------------------------------------
114169check :
115170 @RUSTFLAGS=" $( RUSTFLAGS) " $(CHECK_CMD ) --message-format=json
0 commit comments