-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMakefile
234 lines (205 loc) · 9.3 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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
# Build ArchLinux image for AllWinner D1
IMAGE ?= archlinux_d1_full.img
CROSS_COMPILE ?= riscv64-linux-gnu-
OUTPUT_DIR ?= output
ARTIFACTS_OUTPUT_DIR = $(abspath $(OUTPUT_DIR))
ARCH ?= riscv
CI_BUILD ?=
SUDO ?= $(if $(CI_BUILD),,sudo)
SHELL ?= /usr/bin/bash
DEVICE ?=
# Extra pkgs to install, separated by white space
# do make sure the packages exist
EXPKGS ?=
# Extra space for disk image generation, in megabytes
EXSPACE ?= $(if $(EXPKGS),1024,0)
# kernel localversion
# KERNEL_RELEASE = KERNEL_VERSION + KERNEL_LOCALVERSION
# KERNEL_VERSION is a string generated by `make kernelversion`
KERNEL_LOCALVERSION ?= -AllWinnerD1-Smaeul
# The builder will download ${ARCHIVE_ROOTFS_SOURCE}${ARCHIVE_ROOTFS}
# to ${ARCHIVE_ROOTFS_STORAGE}
ARCHIVE_ROOTFS ?= archriscv-20220727.tar.zst
ARCHIVE_ROOTFS_SOURCE ?= https://archriscv.felixc.at/images/
ARCHIVE_ROOTFS_STORAGE = $(ARTIFACTS_OUTPUT_DIR)/$(ARCHIVE_ROOTFS)
# These are required executables, will be checked in the first place,
# before any building process.
REQUIRED_EXECUTABLES = \
awk bc \
cpio swig riscv64-linux-gnu-gcc \
dd mkfs.ext2 mkfs.ext2 parted losetup \
mktemp tar gzip zstd \
genfstab sh bash sudo curl
export
# some command requires a percent symbol
PERCENT := %
.PHONY: clean default u-boot linux image install
.PHONY: check-% prepare-directory
.DEFAULT: default
default: u-boot linux download-rootfs
check-executables:
@$(foreach exec,$(REQUIRED_EXECUTABLES),\
$(if $(shell which $(exec)),echo "- found $(exec)";,$(error "No $(exec) in PATH")))
prepare-directory: check-executables
mkdir -p $(ARTIFACTS_OUTPUT_DIR)
help:
@echo "Usage:"
@echo " build everything except image: make artifacts"
@echo " build a raw image: make IMAGE=/path/to/img image"
@echo " install everything: make DEVICE=/path/to/block/device install"
@echo " clean up: make clean"
@echo ""
@echo "Other useful build targets:"
@echo " u-boot"
@echo " linux"
@echo " download-rootfs"
@echo " linux-release-tarball"
@echo ""
@echo "Configurable variables:"
@echo " IMAGE The system image to create. Defaults to $(IMAGE)."
@echo " DEVICE The target block device to install the system."
@echo " EXPKGS The extra packages to automatically install to the rootfs."
@echo " Separated by white space, eg. EXPKGS='networkmanager aria2c'"
@echo " EXSPACE The extra space added when creating the disk image, in MB,"
@echo " defaults to 0 when EXPKGS is empty otherwise 1024."
@echo ""
@echo "For expert users, please read the root Makefile and change the variables as you wish."
@echo ""
@echo 'If you have a very powerful multicore CPU, you can speed up the process by add "-j$$(nproc)" to the command line.'
@echo ""
u-boot linux: prepare-directory
+$(MAKE) -C $@ build
@echo "- $@ built"
linux-release-tarball: linux
+$(MAKE) -C linux release-tarball
linux-release-pkg: linux
+$(MAKE) -C linux release-pkg
download-rootfs:
+$(MAKE) -C rootfs download
@echo "- $(ARCHIVE_ROOTFS) downloaded."
$(ARTIFACTS_OUTPUT_DIR)/u-boot-sunxi-with-spl.bin: u-boot
$(ARTIFACTS_OUTPUT_DIR)/Image: linux
$(ARTIFACTS_OUTPUT_DIR)/Image.gz: linux
$(ARTIFACTS_OUTPUT_DIR)/8723ds.ko: linux
$(ARTIFACTS_OUTPUT_DIR)/kernel_package.tar.gz: linux-release-tarball
rootfs/$(ARCHIVE_ROOTFS): download-rootfs
ARTIFACTS = \
$(ARTIFACTS_OUTPUT_DIR)/u-boot-sunxi-with-spl.bin \
$(ARTIFACTS_OUTPUT_DIR)/Image \
$(ARTIFACTS_OUTPUT_DIR)/Image.gz \
$(ARTIFACTS_OUTPUT_DIR)/8723ds.ko \
$(ARTIFACTS_OUTPUT_DIR)/kernel_package.tar.gz \
rootfs/$(ARCHIVE_ROOTFS)
artifacts: $(ARTIFACTS)
install: $(ARTIFACTS)
@echo "start installing to device:$(if $(DEVICE),$(DEVICE),$(error "Invalid parameter DEVICE: $(DEVICE)"))"
echo "Now requires superuser privileges to manipulate the partitions,"; \
echo "rootless method haven't been implemented yet."; \
echo "So it's dangous, please make sure you trust the script wont break your system."; \
$(SUDO) parted -s -a optimal -- "$(DEVICE)" mklabel gpt
$(SUDO) parted -s -a optimal -- "$(DEVICE)" mkpart primary ext2 40MiB 300MiB
$(SUDO) parted -s -a optimal -- "$(DEVICE)" mkpart primary ext4 340MiB 100$(PERCENT)
set -e; \
MOUNTPOINT=$(shell mktemp -d); \
PART_SEP=$$([ -b $(DEVICE)p1 ] && echo 'p' || echo ''); \
if [ '/tmp' != "$${MOUNTPOINT:0:4}" ]; then echo "Misbehaved temp dir! Abort!"; exit 1; fi; \
DEVICES=$(DEVICE)$${PART_SEP}; \
echo "Creating filesystem"; \
$(SUDO) mkfs.ext2 -F -L boot $${DEVICES}1; \
$(SUDO) mkfs.ext4 -F -L root $${DEVICES}2; \
echo "Writing rootfs and kernel"; \
$(SUDO) mount $${DEVICES}2 $${MOUNTPOINT}; \
$(SUDO) mkdir $${MOUNTPOINT}/boot; \
$(SUDO) mount $${DEVICES}1 $${MOUNTPOINT}/boot; \
$(SUDO) tar -x -f rootfs/$(ARCHIVE_ROOTFS) -C $${MOUNTPOINT}; \
$(SUDO) tar -x -f "$(ARTIFACTS_OUTPUT_DIR)/kernel_package.tar.gz" -C $${MOUNTPOINT}; \
$(SUDO) sh -c "echo '8723ds' >> $${MOUNTPOINT}/etc/modules-load.d/8723ds.conf"; \
$(SUDO) mkdir -p $${MOUNTPOINT}/boot/extlinux; \
$(SUDO) sh -c "echo 'label default' >> $${MOUNTPOINT}/boot/extlinux/extlinux.conf"; \
$(SUDO) sh -c "echo ' linux ../Image' >> $${MOUNTPOINT}/boot/extlinux/extlinux.conf"; \
$(SUDO) sh -c "echo ' append earlycon=sbi console=ttyS0,115200n8 root=/dev/mmcblk0p2 rootwait cma=96M' >> $${MOUNTPOINT}/boot/extlinux/extlinux.conf"; \
echo "generate fstab"; \
$(SUDO) sh -c "genfstab -U $${MOUNTPOINT} >> $${MOUNTPOINT}/etc/fstab"; \
cat $${MOUNTPOINT}/etc/fstab; \
if [ -n "$(EXPKGS)" ]; then \
echo "Install extra pkgs"; \
if which arch-chroot && which qemu-riscv64-static; then \
$(SUDO) arch-chroot $${MOUNTPOINT} /bin/pacman --noconfirm -Syu $(EXPKGS); \
$(SUDO) rm -rf $${MOUNTPOINT}/var/cache/pacman/pkg; \
else echo "not all necessary tools found, skipping"; \
fi; \
fi; \
echo "umount"; \
$(SUDO) umount $${MOUNTPOINT}/boot; \
$(SUDO) umount $${MOUNTPOINT}; \
echo "Write bootloader"; \
$(SUDO) dd if="$(ARTIFACTS_OUTPUT_DIR)/u-boot-sunxi-with-spl.bin" of="$(DEVICE)" bs=1024 seek=128; \
echo "clean up"; \
$(SUDO) rm -rf $${MOUNTPOINT};
$(IMAGE): $(ARTIFACTS)
@echo "start building $@"
@echo "Prepare image at $(IMAGE)"
# Calculate a suitable size, 150% of the minumum (Unit MB) plus 340MB plus EXSPACE
# Create a suitable empty file
ROOTFS_SIZE=$$(tar -t -v --zstd -f rootfs/$(ARCHIVE_ROOTFS) | awk '{s+=$$3} END{print int(s/1024/1024 * 1.5)}');\
KERNEL_SIZE=$$(tar -t -v --gzip -f "$(ARTIFACTS_OUTPUT_DIR)/kernel_package.tar.gz" | awk '{s+=$$3} END{print int(s/1024/1024 * 1.5)}');\
PART_SIZE=$$(echo "$${ROOTFS_SIZE} + $${KERNEL_SIZE} + 340 + $(EXSPACE)" | bc); \
dd if=/dev/zero of="$(IMAGE)" bs=1M count=$${PART_SIZE}
# Write partition table on it
parted -s -a optimal -- "$(IMAGE)" mklabel gpt
parted -s -a optimal -- "$(IMAGE)" mkpart primary ext2 40MiB 300MiB
parted -s -a optimal -- "$(IMAGE)" mkpart primary ext4 340MiB 100$(PERCENT)
# Write rootfs, kernel and boot config
set -e; \
MOUNTPOINT=$(shell mktemp -d); \
if [ '/tmp' != "$${MOUNTPOINT:0:4}" ]; then echo "Misbehaved temp dir! Abort!"; exit 1; fi; \
echo "Now requires superuser privileges to manipulate the partitions,"; \
echo "rootless method haven't been implemented yet."; \
echo "So it's dangous, please make sure you trust the script wont break your system."; \
export DEVICES=$$($(SUDO) losetup -f -P --show "$(IMAGE)"); \
echo "Creating filesystem"; \
$(SUDO) mkfs.ext2 -F -L boot $${DEVICES}p1; \
$(SUDO) mkfs.ext4 -F -L root $${DEVICES}p2; \
echo "Writing rootfs and kernel"; \
$(SUDO) mount $${DEVICES}p2 $${MOUNTPOINT}; \
$(SUDO) mkdir $${MOUNTPOINT}/boot; \
$(SUDO) mount $${DEVICES}p1 $${MOUNTPOINT}/boot; \
$(SUDO) tar -x -f rootfs/$(ARCHIVE_ROOTFS) -C $${MOUNTPOINT}; \
$(SUDO) tar -x -f "$(ARTIFACTS_OUTPUT_DIR)/kernel_package.tar.gz" -C $${MOUNTPOINT}; \
$(SUDO) sh -c "echo '8723ds' >> $${MOUNTPOINT}/etc/modules-load.d/8723ds.conf"; \
$(SUDO) mkdir -p $${MOUNTPOINT}/boot/extlinux; \
$(SUDO) sh -c "echo 'label default' >> $${MOUNTPOINT}/boot/extlinux/extlinux.conf"; \
$(SUDO) sh -c "echo ' linux ../Image' >> $${MOUNTPOINT}/boot/extlinux/extlinux.conf"; \
$(SUDO) sh -c "echo ' append earlycon=sbi console=ttyS0,115200n8 root=/dev/mmcblk0p2 rootwait cma=96M' >> $${MOUNTPOINT}/boot/extlinux/extlinux.conf"; \
echo "generate fstab"; \
$(SUDO) sh -c "genfstab -U $${MOUNTPOINT} >> $${MOUNTPOINT}/etc/fstab"; \
cat $${MOUNTPOINT}/etc/fstab; \
if [ -n "$(EXPKGS)" ]; then \
echo "Install extra pkgs"; \
if which arch-chroot && which qemu-riscv64-static; then \
$(SUDO) arch-chroot $${MOUNTPOINT} /bin/pacman --noconfirm -Syu $(EXPKGS); \
$(SUDO) rm -rf $${MOUNTPOINT}/var/cache/pacman/pkg; \
else echo "not all necessary tools found, skipping"; \
fi; \
fi; \
echo "umount"; \
$(SUDO) umount $${MOUNTPOINT}/boot; \
$(SUDO) umount $${MOUNTPOINT}; \
echo "Write bootloader"; \
$(SUDO) dd if="$(ARTIFACTS_OUTPUT_DIR)/u-boot-sunxi-with-spl.bin" of="$${DEVICES}" bs=8192 seek=16; \
echo "clean up"; \
$(SUDO) rm -rf $${MOUNTPOINT}; \
$(SUDO) losetup -d $${DEVICES};
image: $(IMAGE)
clean-u-boot clean-linux:
+$(MAKE) -C $(subst clean-,,$@) clean
distclean-u-boot distclean-linux:
+$(MAKE) -C $(subst distclean-,,$@) distclean
clean-all: clean-u-boot clean-linux
distclean-all: distclean-u-boot distclean-linux
clean: clean-all
rm -rf $(ARTIFACTS_OUTPUT_DIR)
rm -f $(IMAGE)
distclean: distclean-all
rm -rf $(ARTIFACTS_OUTPUT_DIR)
rm -f $(IMAGE)