1# $MirOS: src/distrib/baselive/Makefile,v 1.66 2014/01/04 20:24:56 tg Exp $
2
3.include <bsd.own.mk>
4
5# common variables
6REALOBJDIR!=	realpath ${.OBJDIR}
7TOPDIR?=	${.CURDIR}/..
8
9DUALIVE?=	No
10BATCH?=		No
11GRML?=		No
12
13.if ${GRML:L} != "no"
14BATCH=		No
15.endif
16
17.if ${DUALIVE:L} == "no"
18STUFFDIR=	${BSDRELDIR}/rel
19.else
20STUFFDIR=	${DUALIVE}/i386
21.endif
22
23.MAIN: all
24
25KERNEL_PREP=	print 'rootdev 6 0\nquit' | config -ef bsd.tmp
26.if exists(${REALOBJDIR}/../../sys/arch/i386/stand/liveboot/.)
27BOOT=		${REALOBJDIR}/../../sys/arch/i386/stand/liveboot/boot
28DO_LIVEBOOT=	#defined
29.endif
30CDROM_OPTS+=	bootimage=i386\;b_torito.ldr
31CDROM_OPTS+=	no-emul-boot
32
33CHAINSECTOR?=	24
34
35# temporary mounts
36WRKDIR=		${REALOBJDIR}/tmpdata
37TMPMOUNT=	${REALOBJDIR}/tmpmnt
38VND?=		svnd0
39VND_DEV=	/dev/${VND}a
40VND_RDEV=	/dev/r${VND}a
41VND_CRDEV=	/dev/r${VND}c
42RAWLABEL?=	-r
43
44RDSETROOT?=	${REALOBJDIR}/../common/elfrdsetroot
45
46IMAGE?=		mrdev${OSrev}.fs
47IMAGESIZE?=	8192
48IMAGEOPTS?=	minfree=0,optimization=space,bsize=4096,fsize=512,density=2048
49IMAGETYPE?=	ipldisc
50IMAGE_PREP?=	@:
51KERNEL_PREP?=	@:
52
53BOOT?=		${WRKDIR}/v${OSrev}/i386/boot
54
55CDROM?=		livecd${OSrev}.iso
56CDROM_OPTS+=	applicationid=NetBSD_makefs
57CDROM_OPTS+=	hide-rr-moved
58.if ${DUALIVE:L} != "no"
59CDROM_OPTS+=	label=MirOS~v${OSrev}~BSD~DuaLive~CD
60.else
61CDROM_OPTS+=	label=MirOS~v${OSrev}~BSD/i386~Live~CD
62.endif
63CDROM_OPTS+=	no-trailing-padding
64CDROM_OPTS+=	preparer=MirBSD_and_its_contributors
65CDROM_OPTS+=	publisher=Copyright_\<c\>_2002=2014_The_MirOS_Project
66CDROM_OPTS+=	rockridge
67.if ${DUALIVE:L} != "no"
68.  if ${GRML:L} != "no"
69CDROM_OPTS+=	volumeid=$$(uname -sl | tr -- '- \#' :_):Triforce
70.  else
71CDROM_OPTS+=	volumeid=$$(uname -sl | tr -- '- \#' :_):DuaLive
72.  endif
73.else
74CDROM_OPTS+=	volumeid=$$(uname -slm | tr -- '- \#' :_):BaseLive
75.endif
76#CDROM_OPTS+=	v=1
77
78.if ${DUALIVE:L} != "no"
79LIVEBOOT_ARGS+=	DUALIVE=Yes
80.endif
81.if ${GRML:L} != "no"
82LIVEBOOT_ARGS+=	GRML=Yes
83.endif
84
85BOOTCFG_SRCS=	${TOPDIR}/common/boot.cfg.i386
86.if ${GRML:L} != "no"
87BOOTCFG_SRCS+=	${.CURDIR}/boot.cfg.grml
88.endif
89.if ${DUALIVE:L} != "no"
90BOOTCFG_SRCS+=	${.CURDIR}/boot.cfg.dual
91.endif
92BOOTCFG_SRCS+=	${.CURDIR}/boot.cfg.tail
93
94all install:
95
96do-cdrom: unpack addcontrib prepimg nukefiles makeimg
97
98it: do-cdrom
99
100unpack:
101	test ! -e ${TMPMOUNT} || (cd ${.CURDIR}; ${MAKE} unconfig)
102	${SUDO} rm -rf ${WRKDIR}
103	mkdir -p ${WRKDIR}/v${OSrev}/i386
104	# ensure they are releatively upfront on the CD
105.if ${DUALIVE:L} != "no"
106	touch ${WRKDIR}/{b_i386,b_sparc}.ldr
107.else
108	touch ${WRKDIR}/b_i386.ldr
109.endif
110.if ${GRML:L} != "no"
111	mkdir -p ${WRKDIR}/boot/grml
112.endif
113	# needed for the installer of MirOS-current snapshots
114	ln -s v${OSrev} ${WRKDIR}/current
115	# unpack the dist sets
116.for _i in base dev etc gnu xbase xetc xfont xserv
117	cd ${WRKDIR} && ${SUDO} tar xzphf ${STUFFDIR}/${_i}${OSrev}.ngz
118.endfor
119	cd ${STUFFDIR} && pax -rw . ${WRKDIR}/v${OSrev}/i386/
120.if ${DUALIVE:L} != "no"
121	cd ${DUALIVE} && pax -rw sparc ${WRKDIR}/v${OSrev}/
122.endif
123	${SUDO} chown -R 0:0 ${WRKDIR}/v${OSrev}
124	cp ${TOPDIR}/common/{00-README,01-3RDPTY} ${WRKDIR}/
125	cat ${BOOTCFG_SRCS} | sudo dd of=${WRKDIR}/boot.cfg
126	${SUDO} cp ${.CURDIR}/i386/boot.* ${WRKDIR}/
127.if ${GRML:L} == "no"
128	${SUDO} rm -f ${WRKDIR}/boot.9
129.endif
130	${SUDO} mkdir -p ${WRKDIR}/boot/grub
131	${SUDO} cp ${.CURDIR}/i386/loopback.* ${WRKDIR}/boot/grub/
132
133${IMAGE}:
134	test ! -e ${TMPMOUNT} || (cd ${.CURDIR}; ${MAKE} unconfig)
135	${SUDO} mkdir -p ${TMPMOUNT}
136	${SUDO} chown 0:0 ${TMPMOUNT}
137	${SUDO} cp ${WRKDIR}/dev/MAKEDEV ${TMPMOUNT}/
138	cd ${TMPMOUNT} && ${SUDO} ${MKSH} MAKEDEV all
139	-${SUDO} dd if=/dev/arandom bs=512 count=4 of=${TMPMOUNT}/.rs
140	${SUDO} makefs -s ${IMAGESIZE}b -o ${IMAGEOPTS} ${IMAGE} ${TMPMOUNT}
141	${SUDO} dd if=/dev/arandom bs=512 count=1 of=$@ conv=notrunc
142	sync
143	${SUDO} vnconfig -v -c ${VND} ${IMAGE}
144	${SUDO} disklabel -w ${RAWLABEL} ${VND} ${IMAGETYPE}
145	${SUDO} mount -r ${VND_DEV} ${TMPMOUNT}
146	${IMAGE_PREP}
147	@echo ""
148	@df -i ${TMPMOUNT}
149	@echo ""
150	${SUDO} umount ${TMPMOUNT}
151	${SUDO} fsck -fy ${VND_RDEV}
152	${SUDO} vnconfig -v -u ${VND}
153	${SUDO} rm -rf ${TMPMOUNT}
154
155addcontrib:
156	@if [[ ! -s ${BSDSRCDIR}/contrib/code/jupp/jupprc ]]; then \
157		print -u2 Aborted: your checkout is not complete; \
158		exit 1; \
159	fi
160	@if [[ ! -s ${BSDSRCDIR}/contrib/code/Snippets/tinyirc.c ]]; then \
161		print -u2 Aborted: your checkout is not complete; \
162		exit 1; \
163	fi
164	mkdir -p tempdir
165	cd tempdir; CC=${CC:Q} CFLAGS=${CFLAGS:Q}\ ${COPTS:Q}\ -Ddefutf8 \
166	    ${MKSH} ${BSDSRCDIR}/contrib/code/jupp/configure --disable-termidx \
167	    --sysconfdir=/etc --disable-dependency-tracking --prefix=/usr && \
168	    make && ${SUDO} make install DESTDIR=${WRKDIR:Q}
169	cd tempdir; cp ${BSDSRCDIR}/contrib/code/Snippets/tinyirc.c . && \
170	    make -f tinyirc.c && ${SUDO} make -f tinyirc.c install \
171	    DESTDIR=${WRKDIR:Q} BINDIR=/usr/bin
172	${SUDO} install -o 0 -g 0 -m 644 \
173	    ${BSDSRCDIR}/contrib/samples/dot.Xmodmap \
174	    ${WRKDIR}/etc/skel/.Xmodmap
175
176prepimg:
177	cd ${WRKDIR} && MACHINE=i386 \
178	    ${SUDO} ${MKSH} ${.CURDIR}/munge_it.sh
179
180bsd.gz: bsd ${IMAGE}
181	-rm -f bsd.tmp
182	gzip -d <bsd >bsd.tmp
183	${KERNEL_PREP}
184	${RDSETROOT} bsd.tmp <${IMAGE}
185	gzip -n9 <bsd.tmp >$@
186
187.if ${DUALIVE:L} != "no"
188bsd: ${DUALIVE}/i386/bsd
189.else
190bsd: ${BSDOBJDIR}/distrib/generic/bsd
191.endif
192	cp -f $> $@
193
194nukefiles:
195	cd ${WRKDIR} && ${SUDO} rm -rf etc/X11 usr/{local/lib/X11,releng} \
196	    usr/{,X11R6/}{doc,info,man} usr/X11R6/lib/X11/doc
197.if ${DEBUGLIBS:L} == "yes"
198	-for name in ${WRKDIR}/usr/{,X11R6/}lib/*@(.so.*|.a); do \
199		print -n stripping $${name##*/} ...; \
200		if [[ $$name = *.a ]]; then \
201			for i in $${name%a}so*; do \
202				if [[ -e $$i ]]; then \
203					print deleted for $${i##*/}; \
204					${SUDO} rm -f $$name; \
205				else \
206					${SUDO} strip --strip-unneeded \
207					    $$name && print; \
208				fi; \
209				break; \
210			done; \
211		else \
212			${SUDO} strip --strip-unneeded $$name && print; \
213		fi; \
214	done
215.endif
216
217makeimg: cdrom-prepare cdrom-generate
218
219cdrom-prepare: bsd.gz
220	${SUDO} chown $$(id -u) ${WRKDIR}
221	chmod 755 ${WRKDIR}
222	${SUDO} dd if=bsd.gz obs=2048 conv=osync of=${WRKDIR}/bsd
223.if ${DUALIVE:L} != "no"
224	${SUDO} cp ${DUALIVE}/sparc/boot ${WRKDIR}/b_sparc.ldr
225	# fix path to default kernel file in second-stage boot loader
226	set -A dump -- $$(dd if=${WRKDIR}/b_sparc.ldr bs=4 count=64 | \
227	    hexdump -ve '1/1 "%02X"' | sed 's/\(........\)/ \1/g'); i=0; \
228	while (( i < 64 )); do [[ $${dump[i++]} = 2035560? ]] && break; done; \
229	if [[ $$i = 64 || $${dump[i-1]} != 20355601 ]]; then \
230		print -u2 found invalid or no patch field version; exit 1; \
231	fi; ofs=$$((#0x$${dump[i+1]})); \
232	print -n v${OSrev}/sparc/bsd.rd\\0 | \
233	    ${SUDO} dd of=${WRKDIR}/b_sparc.ldr bs=1 seek=$$ofs conv=notrunc
234.endif
235.ifdef DO_LIVEBOOT
236	cd ${.CURDIR}/../../sys/arch/i386/stand/liveboot; \
237	    ${MAKE} ${LIVEBOOT_ARGS} cleandir && \
238	    ${MAKE} ${LIVEBOOT_ARGS} depend && \
239	    exec ${MAKE} ${LIVEBOOT_ARGS}
240.endif
241	cd ${WRKDIR}; \
242	    ${SUDO} cp ${BOOT} b_i386.ldr; \
243	    ${SUDO} rm -f CKSUM*; \
244	    if [[ -e v${OSrev}/i386/CKSUM ]]; then \
245		cat v${OSrev}/i386/CKSUM >CKSUM~; \
246	    else \
247		gzip -dc v${OSrev}/i386/CKSUM.gz >CKSUM~; \
248	    fi; \
249	    while IFS= read -r line; do \
250		if [[ $$line = *" = "+([0-9a-fA-F]) ]]; then \
251			two=$${line#+([A-Z0-9]) \(}; \
252		else \
253			two=$${line#+([0-9]) +([0-9]) }; \
254		fi; \
255		one=$${line%%$$two}; \
256		print -r "$${one}v${OSrev}/i386/$$two"; \
257	    done <CKSUM~ >>CKSUM
258.if ${DUALIVE:L} != "no"
259	cd ${WRKDIR}; \
260	    if [[ -e v${OSrev}/sparc/CKSUM ]]; then \
261		cat v${OSrev}/sparc/CKSUM >CKSUM~; \
262	    else \
263		gzip -dc v${OSrev}/sparc/CKSUM.gz >CKSUM~; \
264	    fi; \
265	    while IFS= read -r line; do \
266		if [[ $$line = *" = "+([0-9a-fA-F]) ]]; then \
267			two=$${line#+([A-Z0-9]) \(}; \
268		else \
269			two=$${line#+([0-9]) +([0-9]) }; \
270		fi; \
271		one=$${line%%$$two}; \
272		print -r "$${one}v${OSrev}/sparc/$$two"; \
273	    done <CKSUM~ >>CKSUM
274.endif
275	cd ${WRKDIR}; \
276	    cksum -a cksum -a rmd160 -a tiger 0* bsd b_* gzs* stand/* >>CKSUM
277	-${SUDO} rm -f ${CDROM}* ${WRKDIR}/CKSUM~
278
279cdrom-generate:
280.if ${BATCH:L} != "yes"
281	@print WRKDIR is \"${WRKDIR:Q}\"
282	@print Build coordination: press RETURN to continue...; read dummy
283.endif
284	${SUDO} chown $$(id -u) ${WRKDIR}
285	chmod 755 ${WRKDIR}
286	cd ${WRKDIR}; \
287	    [[ -e CKSUM && ! -e CKSUM.gz ]] || ${SUDO} gzip -d CKSUM; \
288	    sort -k3 |& exec 3>&p; exec 4<&p; \
289	    sort |& exec 5>&p; exec 6<&p; \
290	    while IFS= read -r line; do \
291		if [[ $$line = *" = "+([0-9a-fA-F]) ]]; then \
292			print -ru5 "$$line"; \
293		else \
294			print -ru3 "$$line"; \
295		fi; \
296	    done <CKSUM; ${SUDO} rm -f CKSUM*; \
297	    exec 3>&-; exec 5>&-; \
298	    (cat <&4; cat <&6) | gzip -n9 >CKSUM.gz; \
299	    dd if=/dev/zero bs=256 count=5 >>CKSUM.gz; \
300	    flst=; for f in 0?-* NONFREE.TXT CKSUM.gz b_* gzsig* ?oot* ?sd* \
301	    boot/grub/*; do [[ -e $$f ]] && flst="$$flst $$f"; done; \
302	    ${SUDO} chown 0:0 . $$flst; \
303	    for f in $$flst .; do if [[ -d $$f ]]; then \
304		${SUDO} chmod 555 $$f; else ${SUDO} chmod 444 $$f; fi; \
305	    done; \
306	    ${SUDO} ${MKSH} ${.CURDIR}/mklocatedb.sh ${REALOBJDIR}/${IMAGE}
307	(gzip -d <${WRKDIR}/CKSUM.gz | fgrep -v stand/locate.database; \
308	    cd ${WRKDIR}; cksum -a cksum -a rmd160 -a tiger \
309	    stand/locate.database) >tempdir/CKSUM
310	cd ${WRKDIR}; \
311	    sort -k3 |& exec 3>&p; exec 4<&p; \
312	    sort |& exec 5>&p; exec 6<&p; \
313	    while IFS= read -r line; do \
314		if [[ $$line = *" = "+([0-9a-fA-F]) ]]; then \
315			print -ru5 "$$line"; \
316		else \
317			print -ru3 "$$line"; \
318		fi; \
319	    done <${REALOBJDIR}/tempdir/CKSUM; \
320	    exec 3>&-; exec 5>&-; \
321	    ( (cat <&4; cat <&6) | gzip -n9; \
322	      dd if=/dev/zero bs=256 count=5 2>&- ) | \
323	    ${SUDO} dd of=CKSUM.gz
324	dd if=/dev/arandom bs=2048 count=1 of=b_torito.ldr
325	${SUDO} makefs -t cd9660 -o "$$(print -r -- ${CDROM_OPTS} | \
326	    tr ' ~' ', ')" ${CDROM} ${WRKDIR}
327	${SUDO} chown $$(id -u) ${CDROM} ${WRKDIR}
328	chmod 755 ${WRKDIR}
329	# pad the ISO with ]0;256K] NUL bytes, ie. for
330	# a geometry of 16 heads, 32 sectors per track
331	dd if=/dev/zero count=1 bs=$$((# (512 * 32 * 16) - \
332	    ($$(stat -f %z ${CDROM}) % (512 * 32 * 16)) )) 2>&- >>${CDROM}
333	getextent_cd9660 -f ${CDROM} b_i386.ldr | \
334	    ${MKSH} ${WRKDIR}/v${OSrev}/i386/bootxx.sh -B 11 | \
335	    dd of=${CDROM} conv=notrunc bs=2048 seek=$$(getextent_cd9660 \
336	    -f ${CDROM} -b '$$BootImage$$') 2>/dev/null
337.if ${DUALIVE:L} == "no"
338	getextent_cd9660 -f ${CDROM} b_i386.ldr | \
339	    ${MKSH} ${WRKDIR}/v${OSrev}/i386/bootxx.sh \
340	    -g $$((#$$(stat -f %z ${CDROM}) / (512 * 32 * 16))):16:32 \
341	    -A -M 4:0x96 -S 2 | \
342	    dd of=${CDROM} conv=notrunc bs=512 2>/dev/null
343.else
344	getextent_cd9660 -f ${CDROM} b_i386.ldr | \
345	    ${MKSH} ${WRKDIR}/v${OSrev}/i386/bootxx.sh -A -S 2 | \
346	    dd of=${CDROM} conv=notrunc bs=512 seek=${CHAINSECTOR} 2>/dev/null
347	getextent_cd9660 -f ${CDROM} b_sparc.ldr | \
348	    ${MKSH} ${WRKDIR}/v${OSrev}/sparc/bootxx.sh \
349	    -g $$((#$$(stat -f %z ${CDROM}) / (512 * 32 * 16))):16:32 \
350	    -0 ${CHAINSECTOR} -S 2 | \
351	    dd of=${CDROM} conv=notrunc 2>/dev/null
352.endif
353
354clean cleandir cleannobsd: cleanworkdir unconfig
355	-rm -f ${CDROM}* bsd{,.gz,.tmp} ${IMAGE}
356	-rm -rf tempdir
357
358cleanworkdir:
359	-test ! -e ${WRKDIR} || ${SUDO} rm -rf ${WRKDIR}
360
361tstmnt:
362	${SUDO} mkdir -p ${TMPMOUNT}
363	${SUDO} vnconfig svnd0 ${CDROM}
364	${SUDO} mount_cd9660 /dev/svnd0a ${TMPMOUNT}
365
366tstumnt: unconfig
367
368unconfig:
369	-${SUDO} umount -f ${VND_DEV}
370	-${SUDO} vnconfig -u ${VND}
371	-${SUDO} rm -rf ${TMPMOUNT}
372
373.include <bsd.obj.mk>
374.include <bsd.subdir.mk>
375