]> git.plutz.net Git - blast/blob - Makefile
d2493c5c2c201132aa39c51e85378162bda3034f
[blast] / Makefile
1
2 DEFAULT: _target
3 .PHONY: clean _target _qemu _partition _format _mount _bootstrap _install _sparse _copy _config _syslinux _umount _partcopy _squash _mbr
4
5 ARCH := amd64
6 KEYRING := keys/debian-archive-stretch-stable.gpg
7 BOOTSTRAP := http://cdn.debian.net/debian
8
9 # Partition Table + Boot Partition + Root Partition = 2048M
10 BOOT_MB := 126
11 ROOT_MB := 1920
12
13 define SOURCES = 
14 deb     http://cdn.debian.net/debian stretch main
15 endef
16
17 PACKAGES := ${PACKAGES} apt btrfs-tools busybox-static bzip2 ca-certificates cron debian-archive-keyring deborphan firmware-linux-free gzip htop ifupdown init iputils-ping irqbalance isc-dhcp-client less make net-tools nmap ntpdate openssh-client psmisc rsync sshfs sudo systemd traceroute unzip vim wget wireless-tools wpasupplicant xz-utils zip
18
19 ifdef disk
20 VOLUME := ${disk}
21 PBOOT := ${disk}1
22 PROOT := ${disk}2
23 SYSROOT := hdd_mount/
24 CFGROOT := hdd_mount/
25
26 _target: _mbr _umount _config _install _partition
27
28 _partition:
29 _format: _partition
30 _mount: _format
31 _bootstrap: _mount
32 _install: _bootstrap _mount
33 _config: _install _mount
34 _syslinux: _mount
35 _umount: _mount _config _syslinux
36 _mbr: _umount _syslinux
37
38 else ifdef image
39 VOLUME := ${image}
40 PBOOT := part_boot.img
41 PROOT := part_root.img
42 SYSROOT := sys_root/
43 CFGROOT := img_mount/
44
45 _target: _mbr _umount _partcopy _config _install
46
47 _bootstrap:
48 _install: _bootstrap
49 _sparse:
50 _format: _sparse
51 _mount: _format
52 _copy: _install _mount
53 _config: _copy _mount
54 _syslinux: _mount
55 _umount: _mount _config _syslinux
56 _partition:
57 _partcopy: _partition _umount
58 _mbr: _partcopy _syslinux
59
60 else ifdef squash
61 SQUASH := ${squash}
62 SYSROOT := sys_root/
63 CFGROOT := cfg_root/
64
65 _target: _squash _install _config
66
67 _bootstrap:
68 _install: _bootstrap
69 _copy: _install
70 _config: _copy
71 _squash: _config
72
73 else ifdef raspi
74 VOLUME := ${raspi}
75 PBOOT := rpi_boot.img
76 PROOT := rpi_root.img
77 SYSROOT := rpi_root/
78 CFGROOT := img_mount/
79
80 ARCH := armhf
81 KEYRING := keys/raspbian-archive-keyring.gpg
82 BOOTSTRAP := http://raspbian.raspberrypi.org/raspbian
83
84 define SOURCES =
85 deb     http://raspbian.raspberrypi.org/raspbian stretch main non-free firmware rpi
86 deb     http://archive.raspberrypi.org/debian stretch main
87 endef
88 PACKAGES := ${PACKAGES} firmware-brcm8011 libraspberrypi-bin libraspberrypi0 pi-bluetooth raspberrypi-bootloader raspberrypi-kernel
89
90 _target: _umount _partcopy _config _install
91
92 _qemu:
93 _bootstrap: _qemu
94 _install: _bootstrap
95 _sparse:
96 _format: _sparse
97 _mount: _format
98 _copy: _install _mount
99 _config: _copy _mount
100 _umount: _mount _config
101 _partition:
102 _partcopy: _partition _umount
103
104 else
105 _target:
106         false
107
108 endif
109
110 ifeq "${ARCH}" "amd64"
111 PACKAGES := ${PACKAGES} linux-image-amd64
112 else ifeq "${ARCH}" "i386"
113 PACKAGES := ${PACKAGES} linux-image-686
114 endif
115
116 export SOURCES SYSROOT CFGROOT VOLUME PBOOT PROOT SQUASH ARCH KEYRING BOOTSTRAP
117
118 sys_root/:
119         btrfs subvol create "$@" || mkdir -p "$@"
120         chmod 755 "$@"
121
122 cfg_root/: sys_root/ _install
123         btrfs sub snap "$<" "$@" || mkdir -p "$@"
124         chmod 755 "$@"
125
126 img_mount/:
127         mkdir -p "$@"
128         chmod 755 "$@"
129
130 hdd_mount/:
131         mkdir -p "$@"
132         chmod 755 "$@"
133
134 _qemu: ${SYSROOT}/usr/bin/qemu-arm-static
135 ${SYSROOT}/usr/bin/qemu-arm-static: /usr/bin/qemu-arm-static ${SYSROOT}
136         mkdir -p "$${SYSROOT}"/usr/bin
137         chmod 755 "$${SYSROOT}/usr" "$${SYSROOT}/usr/bin"
138         cp -p "$<" "$@"
139
140 _bootstrap: ${SYSROOT}/bin/sh
141 ${SYSROOT}/bin/sh: | ${SYSROOT}
142         debootstrap --variant=minbase --arch="$${ARCH}" \
143                 --keyring="$${KEYRING}" \
144                 stretch "$${SYSROOT}" "$${BOOTSTRAP}"
145
146 .PHONY: _aptkeys _norecommends
147 _aptkeys: ${SYSROOT}/etc/apt/trusted.gpg.d/
148 _norecommends: ${SYSROOT}/etc/apt/apt.conf.d/10norecommends
149
150 ${SYSROOT}/etc/apt/apt.conf.d/10norecommends: ${SYSROOT}
151         mkdir -p "$(dir $@)"
152         printf 'APT::Install-Recommends "false";\n' >"$@"
153         chmod 644 "$@"
154
155 ${SYSROOT}/etc/apt/trusted.gpg.d/: ${SYSROOT}
156         mkdir -p "$@"
157         cp keys/*.gpg "$@"
158
159 _install: ${SYSROOT} _aptkeys _norecommends
160         printf %s "$${SOURCES}" >"$${SYSROOT}/etc/apt/sources.list"
161         -cp /etc/resolv.conf "$${SYSROOT}/etc/"
162         -chroot "$${SYSROOT}" sh -c 'apt-mark showmanual |xargs apt-mark auto'
163         -chroot "$${SYSROOT}" apt-get update
164         chroot "$${SYSROOT}" ln -sf /bin/true /usr/local/sbin/invoke-rc.d
165         chroot "$${SYSROOT}" apt-get --yes install ${PACKAGES}
166         chroot "$${SYSROOT}" apt-get --yes --auto-remove purge
167         -chroot "$${SYSROOT}" apt-get --yes --auto-remove upgrade
168         chroot "$${SYSROOT}" apt-get clean
169         chroot "$${SYSROOT}" rm /usr/local/sbin/invoke-rc.d
170
171 _copy: ${SYSROOT} ${CFGROOT}
172         cp -au "$${SYSROOT}/." "$${CFGROOT}/"
173
174 .PHONY: _main_config
175 _config: _main_config
176 _main_config: ${CFGROOT} cfg_seed/
177         cp -au cfg_seed/. "$${CFGROOT}"
178
179 ${SQUASH}: ${CFGROOT}
180         -rm "$${SQUASH}"
181         mksquashfs "$${CFGROOT}" "$${SQUASH}" -comp xz
182
183 _squash: ${SQUASH}
184
185 ${VOLUME}:
186         ! printf '%s\n' "$${VOLUME}" |grep -q '^/dev/'  # abort if volume should be real device
187         dd bs=1M count=0 seek=$$((2 + ${BOOT_MB} + ${ROOT_MB})) of="$${VOLUME}"
188
189 ${PBOOT}:
190         ! printf '%s\n' "$${PBOOT}" |grep -q '^/dev/'  # abort if volume should be real device
191         dd bs=1M count=0 seek=${BOOT_MB} of="$${PBOOT}"
192
193 ${PROOT}:
194         ! printf '%s\n' "$${PROOT}" |grep -q '^/dev/'  # abort if volume should be real device
195         dd bs=1M count=0 seek=${ROOT_MB} of="$${PROOT}"
196
197 _partition: ${VOLUME}
198         printf 'label: gpt\n\n: start=2MiB, size=%iMiB, type=1, attrs="LegacyBIOSBootable"\n: type=20\n' \
199                 ${BOOT_MB} | sfdisk "$${VOLUME}"
200
201 _sparse: ${PBOOT} ${PROOT}
202
203 _format: ${PBOOT} ${PROOT}
204         -umount "$${CFGROOT}/boot" "$${CFGROOT}"
205         mkfs.fat -F 32 -n boot "$${PBOOT}"
206         mkfs.ext4 -F -L FSROOT "$${PROOT}"
207
208 .PHONY: _syslinux_efi32 _syslinux_efi64 _syslinux_bios
209 _syslinux_efi32: ${CFGROOT}
210         mkdir -p "$${CFGROOT}/boot/EFI/BOOT"
211         cp /usr/lib/SYSLINUX.EFI/efi32/syslinux.efi "$${CFGROOT}/boot/EFI/BOOT/BOOTIA32.EFI"
212         mkdir -p "$${CFGROOT}/boot/efi32"
213         cp $(addprefix /usr/lib/syslinux/modules/efi32/, ldlinux.e32 menu.c32 libutil.c32) "$${CFGROOT}"/boot/efi32/
214
215 _syslinux_efi64: ${CFGROOT}
216         mkdir -p "$${CFGROOT}/boot/EFI/BOOT"
217         cp /usr/lib/SYSLINUX.EFI/efi64/syslinux.efi "$${CFGROOT}/boot/EFI/BOOT/BOOTX64.EFI"
218         mkdir -p "$${CFGROOT}/boot/efi64"
219         cp $(addprefix /usr/lib/syslinux/modules/efi64/, ldlinux.e64 menu.c32 libutil.c32) "$${CFGROOT}"/boot/efi32/
220
221 _syslinux_bios: ${CFGROOT}
222         mkdir -p "$${CFGROOT}/boot/bios"
223         cp $(addprefix /usr/lib/syslinux/modules/bios/,  menu.c32 libutil.c32) "$${CFGROOT}"/boot/bios/
224
225 _syslinux: ${CFGROOT} _syslinux_efi32 _syslinux_efi64 _syslinux_bios
226         cp -L "$${CFGROOT}/vmlinuz" "$${CFGROOT}/initrd.img" "$${CFGROOT}/boot/"
227         cp -ru cfg_syslinux/. "$${CFGROOT}/"
228
229 _mbr: ${VOLUME}
230         syslinux -t 2097152 -i "$${VOLUME}"
231         dd conv=notrunc if=/usr/lib/syslinux/mbr/gptmbr.bin of="$${VOLUME}"
232
233 _partcopy: ${VOLUME} ${PROOT} ${PBOOT}
234         dd bs=1M seek=2 if="$${PBOOT}" of="$${VOLUME}"
235         dd bs=1M seek=$$((2 + ${BOOT_MB})) if="$${PROOT}" of="$${VOLUME}"
236
237 _mount: ${PBOOT} ${PROOT} ${CFG_ROOT}
238         mount -t ext4 "$${PROOT}" "$${CFGROOT}"
239         chmod 755 "$${CFGROOT}"
240         mkdir -p "$${CFGROOT}/boot"
241         chmod 755 "$${CFGROOT}/boot"
242         mount -t vfat "$${PBOOT}" "$${CFGROOT}/boot"
243         chmod 755 "$${CFGROOT}/boot"
244
245 _umount: ${CFGROOT}
246         -umount "$${CFGROOT}/boot"
247         umount "$${CFGROOT}" && rmdir "$${CFGROOT}"
248
249 clean:
250         [ "$${SYSROOT#/}" ] && [ "$${CFGROOT#/}" ] || false  # (abort receipe)
251         -umount img_mount/boot
252         -umount img_mount
253         -rmdir img_mount
254         -umount hdd_mount/boot
255         -umount hdd_mount
256         -rmdir hdd_mount
257         if [ -d "sys_root/" ] && ! mount |grep -qwFe "sys_root/"; then \
258                 btrfs sub del "sys_root/" || echo rm -r "sys_root/"; \
259         fi
260         if [ -d "cfg_root/" ] && ! mount |grep -qwFe "cfg_root/"; then \
261                 btrfs sub del "cfg_root/" || echo rm -r "cfg_root/"; \
262         fi
263         -rm "$${SQUASH}"
264         -[ -f "$${VOLUME}" ] && rm "$${VOLUME}"