]> git.plutz.net Git - blast/blob - Makefile
general structure, + squash builder
[blast] / Makefile
1
2 DEFAULT: _target
3 .PHONY: _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 define SOURCES = 
10 deb     http://cdn.debian.net/debian stretch main
11 endef
12 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
13
14 ifdef disk
15 VOLUME := ${disk}
16 PBOOT := ${disk}1
17 PROOT := ${disk}2
18 SYSROOT := hdd_mount/
19 CFGROOT := hdd_mount/
20
21 _target: _mbr _umount _config _install _partition
22
23 _partition:
24 _format: _partition
25 _mount: _format
26 _bootstrap: _mount
27 _install: _bootstrap _mount
28 _config: _install _mount
29 _syslinux: _mount
30 _umount: _mount _config _syslinux
31 _mbr: _umount _syslinux
32
33 else ifdef image
34 VOLUME := ${image}
35 PBOOT := part_boot.img
36 PROOT := part_root.img
37 SYSROOT := sys_root/
38 CFGROOT := img_mount/
39
40 _target: _mbr _umount _partcopy _config _install
41
42 _bootstrap:
43 _install: _bootstrap
44 _sparse:
45 _format: _sparse
46 _mount: _format
47 _copy: _install _mount
48 _config: _copy _mount
49 _syslinux: _mount
50 _umount: _mount _config _syslinux
51 _partition:
52 _partcopy: _partition _umount
53 _mbr: _partcopy _syslinux
54
55 else ifdef squash
56 SQUASH := ${squash}
57 SYSROOT := sys_root/
58 CFGROOT := cfg_root/
59
60 _target: _squash _install _config
61
62 _bootstrap:
63 _install: _bootstrap
64 _copy: _install
65 _config: _copy
66 _squash: _config
67
68 else ifdef raspi
69 VOLUME := ${image}
70 PBOOT := rpi_boot.img
71 PROOT := rpi_root.img
72 SYSROOT := rpi_root/
73 CFGROOT := img_mount/
74
75 ARCH := armhf
76 KEYRING := keys/raspbian-archive-keyring.gpg
77 BOOTSTRAP := http://raspbian.raspberrypi.org/raspbian
78
79 define SOURCES =
80 deb     http://raspbian.raspberrypi.org/raspbian stretch main non-free firmware rpi
81 deb     http://archive.raspberrypi.org/debian stretch main
82 endef
83 PACKAGES := ${PACKAGES} firmware-brcm8011 libraspberrypi-bin libraspberrypi0 pi-bluetooth raspberrypi-bootloader raspberrypi-kernel
84
85 _target: _umount _partcopy _config _install
86
87 _qemu:
88 _bootstrap: _qemu
89 _install: _bootstrap
90 _sparse:
91 _format: _sparse
92 _mount: _format
93 _copy: _install _mount
94 _config: _copy _mount
95 _umount: _mount _config
96 _partition:
97 _partcopy: _partition _umount
98
99 else
100 _target:
101         false
102
103 endif
104
105 ifeq "${ARCH}" "amd64"
106 PACKAGES := ${PACKAGES} linux-image-amd64
107 else ifeq "${ARCH}" "i386"
108 PACKAGES := ${PACKAGES} linux-image-686
109 endif
110
111 export SOURCES SYSROOT CFGROOT VOLUME PBOOT PROOT SQUASH ARCH KEYRING BOOTSTRAP
112
113 ${SYSROOT}:
114         btrfs subvol create "$$SYSROOT" || mkdir -p "$$SYSROOT}"
115         chmod 755 "$@"
116         
117 _qemu: ${SYSROOT}/usr/bin/qemu-arm-static
118 ${SYSROOT}/usr/bin/qemu-arm-static: /usr/bin/qemu-arm-static ${SYSROOT}
119         mkdir -p "$${SYSROOT}"/usr/bin
120         chmod 755 "$${SYSROOT}/usr" "$${SYSROOT}/usr/bin"
121         cp -p "$<" "$@"
122
123 _bootstrap: ${SYSROOT}/bin/sh
124 ${SYSROOT}/bin/sh: | ${SYSROOT}
125         debootstrap --variant=minbase --arch="$${ARCH}" \
126                 --keyring="$${KEYRING}" \
127                 stretch "$${SYSROOT}" "$${BOOTSTRAP}"
128
129 .PHONY: _aptkeys _norecommends
130 _aptkeys: ${SYSROOT}/etc/apt/trusted.gpg.d/
131 _norecommends: ${SYSROOT}/etc/apt/apt.conf.d/10norecommends
132
133 ${SYSROOT}/etc/apt/apt.conf.d/10norecommends: ${SYSROOT}
134         mkdir -p "$(dir $@)"
135         printf 'APT::Install-Recommends "false";\n' >"$@"
136         chmod 644 "$@"
137
138 ${SYSROOT}/etc/apt/trusted.gpg.d/: ${SYSROOT}
139         mkdir -p "$@"
140         cp keys/*.gpg "$@"
141
142 _install: ${SYSROOT} _aptkeys _norecommends
143         printf %s "$${SOURCES}" >"$${SYSROOT}/etc/apt/sources.list"
144         -cp /etc/resolv.conf "$${SYSROOT}/etc/"
145         -chroot "$${SYSROOT}" sh -c 'apt-mark showmanual |xargs apt-mark auto'
146         -chroot "$${SYSROOT}" apt-get update
147         chroot "$${SYSROOT}" ln -sf /bin/true /usr/local/sbin/invoke-rc.d
148         chroot "$${SYSROOT}" apt-get --yes install ${PACKAGES}
149         chroot "$${SYSROOT}" apt-get --yes --auto-remove purge
150         -chroot "$${SYSROOT}" apt-get --yes --auto-remove upgrade
151         chroot "$${SYSROOT}" apt-get clean
152         chroot "$${SYSROOT}" rm /usr/local/sbin/invoke-rc.d
153
154 _copy: ${SYSROOT}
155         btrfs sub snap "$${SYSROOT}" "$${CFGROOT}" || \
156                 cp -a "$${SYSROOT}/." "$${CFGROOT}/"
157
158 .PHONY: _main_config
159 _config: _main_config
160 _main_config: ${CFGROOT} cfg_seed/
161         cp -a cfg_seed/. "$${CFGROOT}"
162
163 ${SQUASH}: ${CFGROOT}
164         -rm "$@"
165         mksquashfs "$$CFGROOT" "$$SQUASH" -comp xz
166
167 _squash: ${SQUASH}
168
169 clean:
170         [ "$${SYSROOT#/}" ] && [ "$${CFGROOT#/}" ] || false  # (abort receipe)
171         -mount |grep -qwF "$${SYSROOT}/boot" && umount "$${SYSROOT}/boot"
172         -mount |grep -qwF "$${SYSROOT}/proc" && umount "$${SYSROOT}/proc"
173         -mount |grep -qwF "$${SYSROOT}/sys" && umount "$${SYSROOT}/sys"
174         -mount |grep -qwF "$${SYSROOT}/dev" && umount "$${SYSROOT}/dev"
175         -mount |grep -qwF "$${SYSROOT}" && umount "$${SYSROOT}"
176         -mount |grep -qwF "$${CFGROOT}" && umount "$${CFGROOT}"
177         if [ -d "$${SYSROOT}" ] && ! mount |grep -qwFe "$${SYSROOT}"; then \
178                 btrfs sub del "$${SYSROOT}" || echo rm -r "$${SYSROOT}"; \
179         fi
180         if [ -d "$${CFGROOT}" ] && ! mount |grep -qwFe "$${CFGROOT}"; then \
181                 btrfs sub del "$${CFGROOT}" || echo rm -r "$${CFGROOT}"; \
182         fi
183         -rm "$${SQUASH}"