1
1
include mk/common.mk
2
2
include mk/check-libs.mk
3
3
4
+ THIRDPARTY_DIR := 3rdparty
5
+ INCLUDE_DIR := include
6
+ BUILD_DIR := build
7
+ SRC_DIR := src
8
+
4
9
CC ?= gcc
5
10
CFLAGS := -O2 -g -Wall -Wextra
6
- CFLAGS += -include common.h
11
+ CFLAGS += -I $( INCLUDE_DIR ) -I $( THIRDPARTY_DIR ) - include $( INCLUDE_DIR ) / common.h
7
12
8
13
# clock frequency
9
14
CLOCK_FREQ ?= 65000000
10
15
DT_CFLAGS := -D CLOCK_FREQ=$(CLOCK_FREQ )
11
16
CFLAGS += $(DT_CFLAGS )
12
17
13
18
OBJS_EXTRA :=
19
+ LIBS_EXTRA :=
20
+
14
21
# command line option
15
22
OPTS :=
16
23
17
24
LDFLAGS :=
18
25
26
+ SHELL_HACK := $(shell mkdir -p $(BUILD_DIR ) )
27
+
19
28
# virtio-blk
20
29
ENABLE_VIRTIOBLK ?= 1
21
30
$(call set-feature, VIRTIOBLK)
@@ -24,7 +33,7 @@ MKFS_EXT4 ?= mkfs.ext4
24
33
ifeq ($(call has, VIRTIOBLK) , 1)
25
34
OBJS_EXTRA += virtio-blk.o
26
35
DISKIMG_FILE := ext4.img
27
- OPTS += -d $(DISKIMG_FILE )
36
+ OPTS += -d $(BUILD_DIR ) / $( DISKIMG_FILE )
28
37
MKFS_EXT4 := $(shell which $(MKFS_EXT4 ) )
29
38
ifndef MKFS_EXT4
30
39
MKFS_EXT4 := $(shell which $$(brew --prefix e2fsprogs)/sbin/mkfs.ext4)
@@ -77,8 +86,9 @@ $(call set-feature, VIRTIOSND)
77
86
ifeq ($(call has, VIRTIOSND) , 1)
78
87
OBJS_EXTRA += virtio-snd.o
79
88
80
- PA_LIB := portaudio/lib/.libs/libportaudio.a
81
- PA_CFLAGS := -Iportaudio/include
89
+ PORTAUDIO_DIR := $(THIRDPARTY_DIR ) /portaudio
90
+ PA_LIB := $(PORTAUDIO_DIR ) /lib/.libs/libportaudio.a
91
+ PA_CFLAGS := -I$(PORTAUDIO_DIR ) /include
82
92
PA_CONFIG_PARAMS :=
83
93
LDFLAGS += $(PA_LIB )
84
94
CFLAGS += $(PA_CFLAGS )
@@ -105,9 +115,10 @@ ifeq ($(call has, VIRTIOSND), 1)
105
115
# -lm separately.
106
116
LDFLAGS += -lpthread
107
117
108
- portaudio/Makefile :
109
- git submodule update --init portaudio
110
- $(PA_LIB ) : portaudio/Makefile
118
+ $(PORTAUDIO_DIR ) /Makefile :
119
+ git submodule update --init $(PORTAUDIO_DIR )
120
+
121
+ $(PA_LIB ) : $(PORTAUDIO_DIR ) /Makefile
111
122
cd $(dir $< ) && git clean -fdx && git reset --hard HEAD
112
123
cd $(dir $< ) && ./configure \
113
124
--enable-static \
@@ -119,10 +130,10 @@ $(PA_LIB): portaudio/Makefile
119
130
--disable-dependency-tracking \
120
131
$(PA_CONFIG_PARAMS)
121
132
$(MAKE) -C $(dir $<)
122
- main.o : $(PA_LIB )
123
- virtio-snd.o : $(PA_LIB )
133
+ $( BUILD_DIR ) / main.o : $(PA_LIB )
134
+ $( BUILD_DIR ) / virtio-snd.o : $(PA_LIB )
124
135
# suppress warning when compiling PortAudio
125
- virtio-snd.o : CFLAGS += -Wno-unused-parameter
136
+ $( BUILD_DIR ) / virtio-snd.o : CFLAGS += -Wno-unused-parameter
126
137
endif
127
138
128
139
# Set libm as the last dependency so that no need to set -lm seperately.
@@ -132,8 +143,9 @@ LDFLAGS += -lm
132
143
# after git submodule.
133
144
.DEFAULT_GOAL := all
134
145
135
- BIN = semu
136
- all : $(BIN ) minimal.dtb
146
+ BIN = $(BUILD_DIR ) /semu
147
+
148
+ all : $(BIN ) $(BUILD_DIR ) /minimal.dtb
137
149
138
150
OBJS := \
139
151
riscv.o \
@@ -145,34 +157,36 @@ OBJS := \
145
157
aclint.o \
146
158
$(OBJS_EXTRA )
147
159
148
- deps := $(OBJS:%.o=.%.o.d )
160
+ objs := $(foreach obj,$(OBJS ) ,$(BUILD_DIR ) /$(obj ) )
161
+ deps := $(patsubst % .o,$(BUILD_DIR ) /% .o.d,$(OBJS ) )
149
162
150
- GDBSTUB_LIB := mini-gdbstub/build/libgdbstub.a
151
- LDFLAGS += $(GDBSTUB_LIB )
152
- mini-gdbstub/Makefile :
163
+ MINI_GDBSTUB_DIR := $(THIRDPARTY_DIR ) /mini-gdbstub
164
+ MINI_GDBSTUB_LIB := $(MINI_GDBSTUB_DIR ) /build/libgdbstub.a
165
+ LDFLAGS += $(MINI_GDBSTUB_LIB )
166
+ $(THIRDPARTY_DIR ) /mini-gdbstub/Makefile :
153
167
git submodule update --init $(dir $@ )
154
- $(GDBSTUB_LIB ) : mini-gdbstub /Makefile
168
+ $(MINI_GDBSTUB_LIB ) : $( MINI_GDBSTUB_DIR ) /Makefile
155
169
$(MAKE ) -C $(dir $< )
156
- $( OBJS ) : $( GDBSTUB_LIB )
170
+ LIBS_EXTRA += $( MINI_GDBSTUB_LIB )
157
171
158
172
ifeq ($(call has, VIRTIONET) , 1)
159
- MINISLIRP_DIR := minislirp
160
- MINISLIRP_LIB := minislirp /src/libslirp.a
173
+ MINISLIRP_DIR := $( THIRDPARTY_DIR ) / minislirp
174
+ MINISLIRP_LIB := $( MINISLIRP_DIR ) /src/libslirp.a
161
175
LDFLAGS += $(MINISLIRP_LIB )
162
176
$(MINISLIRP_DIR ) /src/Makefile :
163
177
git submodule update --init $(MINISLIRP_DIR )
164
178
$(MINISLIRP_LIB ) : $(MINISLIRP_DIR ) /src/Makefile
165
179
$(MAKE ) -C $(dir $< )
166
- $( OBJS ) : $(MINISLIRP_LIB )
180
+ LIBS_EXTRA += $(MINISLIRP_LIB )
167
181
endif
168
182
169
- $(BIN ) : $(OBJS )
183
+ $(BIN ) : $(objs )
170
184
$(VECHO ) " LD\t$@ \n"
171
185
$(Q )$(CC ) -o $@ $^ $(LDFLAGS )
172
186
173
- % .o : % .c
187
+ $( BUILD_DIR ) / % .o : $( SRC_DIR ) / % .c $( LIBS_EXTRA )
174
188
$(VECHO ) " CC\t$@ \n"
175
- $(Q )$(CC ) -o $@ $(CFLAGS ) -c -MMD -MF . $@ .d $<
189
+ $(Q )$(CC ) -o $@ $(CFLAGS ) -c -MMD -MF $@ .d $<
176
190
177
191
DTC ?= dtc
178
192
@@ -196,40 +210,42 @@ S := $E $E
196
210
CFLAGS += -D SEMU_BOOT_TARGET_TIME=10
197
211
198
212
SMP ?= 1
199
- .PHONY : riscv-harts.dtsi
200
- riscv-harts.dtsi :
213
+ .PHONY : $( INCLUDE_DIR ) / riscv-harts.dtsi
214
+ $( INCLUDE_DIR ) / riscv-harts.dtsi :
201
215
$(Q ) python3 scripts/gen-hart-dts.py $@ $(SMP ) $(CLOCK_FREQ )
202
216
203
- minimal.dtb : minimal.dts riscv-harts.dtsi
217
+ $( BUILD_DIR ) / minimal.dtb : $( SRC_DIR ) / minimal.dts $( INCLUDE_DIR ) / riscv-harts.dtsi
204
218
$(VECHO ) " DTC\t$@ \n"
205
219
$(Q )$(CC ) -nostdinc -E -P -x assembler-with-cpp -undef \
220
+ -I$(INCLUDE_DIR ) \
206
221
$(DT_CFLAGS ) \
207
222
$(subst ^,$S,$(filter -D^SEMU_FEATURE_% , $(subst -D$(S ) SEMU_FEATURE,-D^SEMU_FEATURE,$(CFLAGS ) ) ) ) $< \
208
223
| $(DTC ) - > $@
209
224
210
- # Rules for downloading prebuilt Linux kernel image
211
- include mk/external.mk
212
-
213
- ext4.img :
225
+ $(BUILD_DIR ) /$(DISKIMG_FILE ) :
214
226
$(Q ) dd if=/dev/zero of=$@ bs=4k count=600
215
227
$(Q )$(MKFS_EXT4 ) -F $@
216
228
217
- check : $(BIN ) minimal.dtb $(KERNEL_DATA ) $(INITRD_DATA ) $(DISKIMG_FILE )
229
+ .PHONY : download-artifacts
230
+ download-artifacts :
231
+ $(Q ) scripts/download-artifacts.sh Image $(BUILD_DIR )
232
+ $(Q ) scripts/download-artifacts.sh rootfs $(BUILD_DIR )
233
+
234
+ check : $(BIN ) $(BUILD_DIR ) /minimal.dtb $(BUILD_DIR ) /$(DISKIMG_FILE ) download-artifacts
218
235
@$(call notice, Ready to launch Linux kernel. Please be patient.)
219
- $(Q ) ./ $(BIN ) -k $(KERNEL_DATA ) -c $(SMP ) -b minimal.dtb -i $(INITRD_DATA ) -n $(NETDEV ) $(OPTS )
236
+ $(Q )$(BIN ) -k $(BUILD_DIR ) /Image -c $(SMP ) -b $( BUILD_DIR ) / minimal.dtb -i $(BUILD_DIR ) /rootfs.cpio -n $(NETDEV ) $(OPTS )
220
237
221
238
build-image :
222
239
scripts/build-image.sh
223
240
224
241
clean :
225
- $(Q )$(RM ) $(BIN ) $(OBJS ) $(deps )
226
- $(Q )$(MAKE ) -C mini-gdbstub clean
227
- $(Q )$(MAKE ) -C minislirp/src clean
242
+ $(Q )$(RM ) $(BIN ) $(objs ) $(deps )
243
+ $(Q )$(MAKE ) -C $(THIRDPARTY_DIR ) /mini-gdbstub clean
244
+ $(Q )$(MAKE ) -C $(THIRDPARTY_DIR ) /minislirp/src clean
245
+ $(Q )$(MAKE ) -C $(THIRDPARTY_DIR ) /portaudio clean
228
246
229
247
distclean : clean
230
- $(Q )$(RM ) riscv-harts.dtsi
231
- $(Q )$(RM ) minimal.dtb
232
- $(Q )$(RM ) Image rootfs.cpio
233
- $(Q )$(RM ) ext4.img
248
+ $(Q )$(RM ) $(INCLUDE_DIR ) /riscv-harts.dtsi
249
+ $(Q )$(RM ) $(BUILD_DIR ) /*
234
250
235
251
-include $(deps )
0 commit comments