-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathMakefile
288 lines (221 loc) · 10.8 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
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
# some help variables to get around makefile syntax
empty=
space=$(empty) $(empty)
comma=,
KVERS=$(shell uname -r)
ARCH_LIB=$(dir $(shell ldd /bin/sh | grep "libc.so." | grep -o '/lib[^[:space:]]*'))
MODDIR=/lib/modules/$(KVERS)/
SHELL=/bin/bash
PATH:=$(PATH):/sbin:/usr/sbin
RAMDISK=$(RAMDISK_DESTDIR)ramdisk$(RAMDISK_EXTRAS)-$(KVERS)
ifndef RD_DIR
RD_DIR:=$(shell mktemp -d /tmp/ramdisk.XXXXXX)
REMOVE_RD_DIR=1
endif
export RD_DIR
RD_TMPL=ramdisk.template
RD_FILES=$(shell find $(RD_TMPL) -not -type l)
findprog=$(shell find {/usr,}/{s,}bin -maxdepth 1 \( -false $(foreach name,$(1),-or -name "$(name)") \))
findmod_file=$(basename $(basename $(notdir $(shell find $(MODDIR) \( -false $(foreach name,$(1),-or -name "$(subst -,[-_],$(name)).ko*") \)))))
findmod_alias=$(call findmod_file,$(shell awk '/^alias ($(subst $(space),|,$(1))) /{print $$3}' $(MODDIR)modules.alias | tr _ -))
findmod=$(call findmod_file,$(1)) $(call findmod_alias,$(1))
ISO=cdrom.iso
ISO_LABEL=Linux Live
ISO_DIR=$(patsubst %.iso,%.d,$(ISO))
ISO_TMPL=cdrom.template
ISO_FILES=$(shell find $(ISO_TMPL) -not -type l)
SFS_PARTS=base kernel mods
SFS_DIR=netinstall/nfs
LAST_FS=64M
SFS_EXCLUDE=root/.ssh/authorized_keys etc/ssh/ssh_host_dsa_key etc/ssh/ssh_host_dsa_key.pub
MKISOFS=genisoimage -r -jcharset UTF-8
MODS_RUNNING=$(shell grep -v '^[^ ]* [^ ]* 0 ' /proc/modules | cut -f1 -d" " | grep -vE "^(snd|xt|nf|ipt|iptable|ip6|ip6t|ip6table)_")
NET_DISABLED_WIFI=wireless/ wlan
NET_DISABLED_PPP=ppp
NET_DISABLED=arcnet/ appletalk/ tokenring/ wan/ pcmcia/ hamradio/ irda/ $(NET_DISABLED_PPP) $(NET_DISABLED_WIFI)
NIC_DRV=$(basename $(basename $(notdir $(shell find $(MODDIR)/kernel/drivers/net -name '*.ko*' $(patsubst %,-not -path '*/%*',$(NET_DISABLED))))))
NETDRV=$(NIC_DRV) $(call findmod,cifs nfs md4 hmac des_generic ecb arc4 nbd cmac)
USBHID_MODS=$(call findmod,uhci-hcd ehci-hcd ohci-hcd usbhid hid-generic)
USBMODS=$(USBHID_MODS) $(call findmod,sd-mod usb-storage) $(notdir $(shell find $(MODDIR)/kernel/drivers/usb/{storage,host} -name "*.ko*"))
DISKDRV=$(basename $(basename $(notdir $(shell find $(MODDIR)/kernel/drivers \( -path "$(MODDIR)/kernel/drivers/mmc/*" -o -path "$(MODDIR)/kernel/drivers/memstick/*" -o -path "$(MODDIR)/kernel/drivers/ata/*" -o -path "$(MODDIR)/kernel/drivers/scsi/*" -o -path "$(MODDIR)/kernel/drivers/ide/*" \) -name '*.ko*')))) $(call findmod,cciss mptspi mptsas mmc_block nvme memstick sdhci_pci virtio_blk virtio_pci loop)
CRYPTOMODS=dm-crypt $(basename $(basename $(notdir $(shell find $(MODDIR)/kernel -name "cbc.ko*" $(patsubst %,-or -name '%*.ko*',aes sha arc4 xts)))))
CRYPTOPROGS=cryptsetup
FSMODS=$(call findmod,ext2 ext3 ext4 xfs ntfs ntfs3 vfat reiserfs btrfs isofs crc32 crc16 crc32c)
OTHERMODS=$(call findmod,aufs squashfs overlay)
VIDEOMODS=$(call findmod,i915)
VIDEOPROGS=$(call findprog,vbetool)
FUSEPROGS=/sbin/mount.fuse
FUSEMODS=fuse
NTFSPROGS=$(call findprog,ntfs* scrounge-ntfs)
UDEVPROGS=$(call findprog,udevd udevadm) $(shell find /lib/systemd/ -maxdepth 1 -name systemd-udevd -perm /1) $(shell find $$(dpkg -L udev | grep '^/lib/udev/[^/]*$$') -maxdepth 0 -type f -perm /1)
UDEVFILES=$(shell dpkg -L udev dmsetup lvm2 | grep -E '^/lib/udev/(keymaps|(hwdb|rules).d)/') $(shell find /lib/udev/ -name hwdb.bin)
NETPROGS=$(wildcard /lib/libnss_dns.so.* /lib/libnss_files.so.* $(ARCH_LIB)/libnss_files.so.* $(ARCH_LIB)/libnss_dns.so.*) $(call findprog,telnet udp-[rs]e*er *mount.cifs socat xnbd-client)
WIFIMODS=$(basename $(basename $(notdir $(shell find $(MODDIR)/kernel/drivers/net/wireless -name '*.ko*'))))
WIFIPROGS=iwlist iwconfig
DISKMODS=$(DISKDRV) $(call findmod,nls-cp437 nls-iso8859-1 nls-ascii nls-utf8 cdrom i2c-i801)
MODS=$(DISKMODS) $(FSMODS) $(OTHERMODS) $(USBMODS) $(VIDEOMODS)
NORMMODS=yenta_socket $(CRYPTOMODS)
MINPROGS=modprobe /usr/lib/klibc/bin/* $(wildcard /lib/libnss_files.so.* $(ARCH_LIB)/libnss_files.so.*) /sbin/{dmsetup,blkid} $(UDEVPROGS)
NORMPROGS=rmmod halt busybox losetup $(call findprog,fdisk lspci lvm kexec) $(CRYPTOPROGS) $(VIDEOPROGS)
TPM_PROGS=tcsd
TPM_MODS=$(basename $(basename $(shell find $(MODDIR) -name "tpm*.ko*")))
PKCS11_PROGS=$(call findprog,openssl pcscd pkcs15-tool ifdhandler openct-control opensc-tool) /usr/lib/opensc-pkcs11.so /usr/lib/ssl/engines/engine_pkcs11.so $(shell find /usr/lib/pcsc/drivers -name "*.so") $(shell awk '/^LIBPATH/{print $$2}' /etc/reader.conf.d/*)
PKCS11_FILES=/etc/opensc/opensc.conf /etc/openct.conf $(wildcard /etc/reader.conf.d/*) $(shell find /usr/lib/pcsc/drivers -type f -not -name "*.so")
PKCS15_PROGS=$(call findprog,pkcs15-tool pcscd) $(shell find /usr/lib/pcsc/drivers -name "*.so*") $(shell /sbin/ldconfig -p | grep -o '/[^[:space:]]*/libpcsclite.so.1' | head -1) $(shell /sbin/ldconfig -p | grep -o '/[^[:space:]]*/libgcc_s.so.1' | head -1)
PKCS15_FILES=$(shell find /usr/lib/pcsc/drivers -not -name "*.so*" -not -type d)
MODFILES=$(shell find "$(MODDIR)" -name "modules.builtin" -o -name "modules.order")
9P_MODS=9p $(call findmod,9pnet_virtio virtio_pci virtio_mmio virtio_balloon virtio_net)
RELAXMODS=fuse cdrom ehci-hcd loop ohci-hcd uhci-hcd aufs ext2 ext3 ext4 sd-mod yenta_socket reiserfs sdhci_pci rtsx_pci_sdmmc
DATAFILES=$(MODFILES) $(UDEVFILES)
ifeq ($(MODS),dep)
MODS=$(MODS_RUNNING)
endif
ifeq ($(TGT),vmware)
NIC_DRV=pcnet32
endif
ifeq ($(TGT),usb)
DISKDRV=
FSMODS=isofs squashfs vfat
endif
ifeq ($(TGT),nfsroot)
FSMODS=
DISKMODS=
UDEVPROGS=
UDEVFILES=
NETPROGS=
NETDRV=$(NIC_DRV) nfs
USBMODS=$(USBHID_MODS)
MIN=1
NET=1
RAMDISK_EXTRAS?=_nfs
endif
ifdef SSH_PUBKEY
DROPBEAR=1
endif
ifdef DROPBEAR
NET=1
PROGS+=dropbear
endif
ifdef NTFS
PROGS+=$(NTFSPROGS)
FUSE=1
endif
ifdef FUSE
MODS+=$(FUSEMODS)
PROGS+=$(FUSEPROGS)
endif
ifdef 9P
MODS+=$(9P_MODS)
endif
ifdef WIFI
PROGS+=wpa_supplicant
NET_DISABLED_WIFI=
NET=1
RAMDISK_EXTRAS?=_wifi
endif
KVM_ROOT?=none
KVM_APPEND=root=$(KVM_ROOT) quiet console=ttyS0
KVM_OPTS=-nographic -m 512
ifdef KVM_ROOT_SMB
KVM_ROOT=smb://%@$(KVM_ROOT_SMB)/*.sfs+:$(lastword $(subst :, ,$(KVM_ROOT_SMB)))/\$$arch/*kernel-\$$kver.sfs+mem
KVM_APPEND+= systemd.unit=multi-user.target ip=dhcp
NET=1
endif
ifdef NET
PROGS+=$(NETPROGS)
MODS+=$(NETDRV)
FSMODS+=nfs
RAMDISK_EXTRAS?=_net
endif
ifdef TPM
PROGS+=$(TPM_PROGS)
MODS+=$(TPM_MODS)
endif
ifdef PKCS11
PROGS+=$(PKCS11_PROGS)
DATAFILES+=$(PKCS11_FILES)
endif
ifdef PKCS15
PROGS+=$(PKCS15_PROGS)
DATAFILES+=$(PKCS15_FILES)
endif
PROGS+=$(MINPROGS)
ifdef MODS_PRELOAD
MODS+=$(MODS_PRELOAD)
endif
ifdef USWSUSP
PROGS+=/usr/lib/uswsusp/resume
DATAFILES+=/etc/uswsusp.conf
endif
ifndef MIN
PROGS+=$(NORMPROGS)
MODS+=$(NORMMODS)
DATAFILES+=/lib/terminfo/l/linux /usr/share/misc/pci.ids
endif
ifdef INST
PROGS+=cdebootstrap mkfs.ext4
DATAFILES+=/usr/share/keyrings/debian-archive-keyring.gpg
DATADIRS+=/usr/share/cdebootstrap
endif
ifdef EXTRA
EXTRAPROGS+=halt /sbin/{fsck,mkfs.}* $(call findprog,cfdisk hexedit less strace xfs_repair partimage grub hd parted cdebootstrap testdisk photorec ms-sys wlanconfig mksquashfs) lsmod pcimodules gzip objdump $(NTFSPROGS) ldconfig mount $(NETPROGS)
EXTRAMODS+=$(NETDRV)
DATADIRS+=/usr/lib/grub /usr/share/cdebootstrap
endif
DATAFILES+=$(EXTRA_DATAFILES)
PROGS+=$(EXTRAPROGS)
MODS+=$(EXTRAMODS)
# function list starts at word 57
BBHELP=$(shell busybox --help)
BBFUNC=$(subst $(comma),,$(wordlist 57,$(words $(BBHELP)),$(BBHELP)))
.PHONY: all ramdisk clean test nfsroot dbg
all: ramdisk
ramdisk: $(RAMDISK)
test -z $(REMOVE_RD_DIR) || $(RM) -r $(RD_DIR)
clean:
$(RM) -r $(RD_DIR) $(RAMDISK) $(ISO)
mrproper: clean
$(RM) -r $(ISO_DIR)
test: $(RAMDISK)
test -z $(REMOVE_RD_DIR) || $(RM) -r $(RD_DIR)
kvm -kernel /boot/vmlinuz-$(KVERS) -initrd $(RAMDISK) -append "$(KVM_APPEND)" $(KVM_OPTS)
nfsroot: clean
$(MAKE) $(MAKEFLAGS) TGT=nfsroot
cp $(RAMDISK) netinstall/tftp
$(RAMDISK): $(RD_FILES) Makefile
cp -T -r $(RD_TMPL) $(RD_DIR)
env LANG=C ./copy_exe -m $(RD_DIR) $(PROGS)
test -z "$(DATADIRS)" || cp --parents -r $(DATADIRS) $(RD_DIR)
test -z "$(DATAFILES)" || cp --parents $(DATAFILES) $(RD_DIR)
test ! -e "$(RD_DIR)/sbin/udevadm" -o -e "$(RD_DIR)/sbin/udevsettle" || ln -s udevadm "$(RD_DIR)/sbin/udevsettle"
test -e "$(RD_DIR)/bin/sh" -o ! -e "$(RD_DIR)/bin/busybox" || { ln="$$("$(RD_DIR)/bin/busybox" --help | grep -n ^Currently | cut -f1 -d:)"; for x in $$("$(RD_DIR)/bin/busybox" --help | tail -n+$$(($$ln+1)) | tr -d ,);do ln -s busybox "$(RD_DIR)/bin/$$x";done; }
test ! -e "$(RD_DIR)/usr/lib/klibc/bin/sh.shared" -o -e "$(RD_DIR)/bin/sh" || ln -s ../usr/lib/klibc/bin/sh.shared "$(RD_DIR)/bin/sh"
test ! -e "$(RD_DIR)/bin/sh" -o -e "$(RD_DIR)/bin/bash" || ln -s sh "$(RD_DIR)/bin/bash"
test -z "$(MODS_PRELOAD)" || for mod in $(MODS_PRELOAD);do echo "$$mod" ; done > "$(RD_DIR)/etc/modules.preload"
test -z "$(DROPBEAR)" || { mkdir -p $(RD_DIR)/etc/dropbear $(RD_DIR)/scripts/rootfs.d; for t in rsa dss;do dropbearkey -t $$t -f $(RD_DIR)/etc/dropbear/dropbear_$${t}_host_key;done; echo "mkdir -p /dev/pts;mount -t devpts none /dev/pts || true; chmod 755 /; dropbear -E -s" >$(RD_DIR)/scripts/rootfs.d/dropbear.sh; }
test -z "$(SSH_PUBKEY)" || { mkdir -p $(RD_DIR)/.ssh ; echo "$(SSH_PUBKEY)" >$(RD_DIR)/.ssh/authorized_keys ; }
test -z "$(APPEND)" || echo "$(APPEND)" >$(RD_DIR)/cmdline
grep -h -o "GROUP=[^ ]*" "$(RD_DIR)/lib/udev/rules.d"/*.rules | sed -e 's/GROUP="\([^"]*\)".*/^\1:/' | sort -u | grep -f - /etc/group | cut -f1-3 -d: | sed -e 's/$$/:/' >"$(RD_DIR)/etc/group"
test ! -x $(RD_DIR)/lib/systemd/systemd-udevd -o -x $(RD_DIR)/sbin/udevd || mv $(RD_DIR)/lib/systemd/systemd-udevd $(RD_DIR)/sbin/udevd
env MODDIR=$(MODDIR) KVERS=$(KVERS) ./moddep $(RD_DIR) -r "$(RELAXMODS)" $(sort $(basename $(basename $(notdir $(MODS)))))
test -z "$(NO_MAKEFLAGS)" || echo "$$MAKEFLAGS" >"$(RD_DIR)/.makeflags"
(cd "$(RD_DIR)"; find . -not -name . | fakeroot cpio -o -V -H newc) >"$(RAMDISK).tmp"
gzip -1 <"$(RAMDISK).tmp" >"$(RAMDISK)"
rm -f "$(RAMDISK).tmp"
$(ISO_DIR): $(ISO_FILES) ramdisk
cp -T -r $(ISO_TMPL) $(ISO_DIR)
ln -sf ../../$(RAMDISK) $(ISO_DIR)/boot/ramdisk
ln -sf /boot/vmlinuz-$(KVERS) $(ISO_DIR)/boot/vmlinuz
sed -i -e 's|@iso_label@|$(ISO_LABEL)|g' -e 's|@root_dev@|/vol/$(subst $(space),_,$(ISO_LABEL))|g' -e 's|@last_fs@|$(LAST_FS)|g' -e 's|@fs_parts@|$(subst $(space),+,$(addsuffix .sfs,$(addprefix :boot/,$(SFS_PARTS))))|g' $(ISO_DIR)/boot/grub/menu.lst
$(RM) $(ISO_DIR)/boot/grub/menu.lste
sed -i -e 's|@iso_label@|$(ISO_LABEL)|g' $(ISO_DIR)/vmware/livecd.vmx
$(RM) $(ISO_DIR)/vmware/livecd.vmxe
@touch $@
$(ISO): $(ISO_DIR) $(addprefix $(ISO_DIR)/boot/,$(addsuffix .sfs,$(SFS_PARTS))) Makefile
$(MKISOFS) -f -c boot/boot.catalog -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4 -boot-info-table -V "$(ISO_LABEL)" -o $(ISO) $(ISO_DIR)
$(ISO_DIR)/boot/%.sfs: $(SFS_DIR)/%/
fakeroot $(patsubst %,-i%,$(realpath $(SFS_DIR)/fakeroot.sav)) mksquashfs $^ $@ -noappend -e $(SFS_EXCLUDE)
%.sfs: %/
fakeroot $(patsubst %,-i%,$(realpath $(dir $@)fakeroot.sav)) mksquashfs $^ $@ -noappend -e $(SFS_EXCLUDE)
dbg:
@echo $(sort $(MODS))