Makefile revision 7079
1#	$Id$
2#
3# How to roll a release:
4#
5#	make release CHROOTDIR=<lots of disk> [ RELEASETAG=something ]
6#
7# As far as I know, this will roll everything nicely into the "stage"
8# directory.  I still need to write the two rules to move that into
9# the "cdrom" and "ftp" directories.
10# I also need to "make ports" and install those, but I'm not going to do
11# that on a 14.4 line just yet...
12
13# Things which without too much trouble can be considered variables
14EXTRADISTRIBUTIONS=	secure games manpages proflibs dict info
15CPIO1=			etc/services etc/protocols
16CPIO2=  scripts/miscfuncs.sh scripts/instdist.sh scripts/netinst.sh \
17	scripts/adduser.sh scripts/bininst.sh scripts/setup.sh
18
19FAQS=	README README-2.0 MIRROR.SITES
20
21# define this to use a vn device instead of the floppy drive
22VNDEVICE=		vn0
23
24# work dir for floppies
25MNT=			/mnt
26# define FDFORMAT to format physical floppies
27#FDFORMAT=		yes
28
29FDDEVICE=		fd0
30FDCYLS=			80
31FDCYLSIZE=		15k
32FDLABEL=		fd1200
33
34NEWFSARGS=		-c 80 -b 4096 -f 512 -i 9000 -m 0 -t 0 -u 0 \
35				-o space -T ${FDLABEL}
36
37ZIPNSPLIT=		gzip --no-name -9 -c | split -b 240640 -
38
39
40# Things which will get you into trouble if you change them
41DISTRIBUTIONS=		bin ${EXTRADISTRIBUTIONS}                      
42MTREEFILES=		${.CURDIR}/../etc/mtree
43RD=			${RELEASEDIR}/stage
44FD=			${RELEASEDIR}/ftp
45CD=			${RELEASEDIR}/cdrom
46
47release:
48.if !defined(CHROOTDIR)
49	@echo "To make a release you must set CHROOTDIR" && false
50.endif
51	-mkdir ${CHROOTDIR}
52	chflags -R noschg ${CHROOTDIR}/.
53	rm -rf ${CHROOTDIR}/*
54	cd ${.CURDIR}/../etc ; ${MAKE} distrib-dirs DESTDIR=${CHROOTDIR}
55	cd ${.CURDIR}/../etc ; ${MAKE} distribution DESTDIR=${CHROOTDIR}
56	cd ${.CURDIR}/.. ; ${MAKE} -k install DESTDIR=${CHROOTDIR}
57	echo "#!/bin/sh"			> ${CHROOTDIR}/mk
58	echo "set -ex"				>> ${CHROOTDIR}/mk
59	echo "cd /usr/src"			>> ${CHROOTDIR}/mk
60	echo "make world"			>> ${CHROOTDIR}/mk
61	echo "cd sbin/sysinstall"		>> ${CHROOTDIR}/mk
62	echo "make obj"				>> ${CHROOTDIR}/mk
63	echo "cd ../../release"			>> ${CHROOTDIR}/mk
64	echo "make obj"				>> ${CHROOTDIR}/mk
65	echo "make doRELEASE"			>> ${CHROOTDIR}/mk
66	echo "RELEASEDIR=/R"			>> ${CHROOTDIR}/etc/make.conf
67.if !defined(RELEASETAG)
68	cd ${CHROOTDIR}/usr ; cvs co -P src
69.else
70	cd ${CHROOTDIR}/usr ; cvs export -r ${RELEASETAG} src
71.endif
72	chmod 755 ${CHROOTDIR}/mk
73	chroot ${CHROOTDIR} /mk
74
75clean:
76	rm -rf cpio_crunch boot_crunch release.[0-9] release.1[0]
77
78# Clean out ${RELEASEDIR} and make the directory structure.
79release.1:
80	@cd ${.CURDIR} ; $(MAKE) ckRELEASEDIR
81	-mkdir ${RELEASEDIR}
82	chflags -R noschg ${RELEASEDIR}/.
83	rm -rf ${RELEASEDIR}/*
84	mkdir ${RD}
85	mkdir ${RD}/bootfd
86	mkdir ${RD}/bootfd/dev
87	mkdir ${RD}/bootfd/mnt
88	mkdir ${RD}/bootfd/stand
89	mkdir ${RD}/cpiofd
90	mkdir ${RD}/cpiofd/stand
91	mkdir ${RD}/cpiofd/stand/scripts
92	mkdir ${RD}/fixitfd
93	mkdir ${RD}/fixitfd/stand
94	mkdir ${RD}/fixitfd/bin
95	mkdir ${RD}/fixitfd/sbin
96	mkdir ${RD}/fixitfd/mnt
97	mkdir ${RD}/fixitfd/etc
98	mkdir ${RD}/floppies
99	mkdir ${RD}/trees
100	mkdir ${RD}/trees/bin
101	mkdir ${RD}/dists
102	mkdir ${RD}/dists/bin
103	cd ${.CURDIR}/../etc && make distrib-dirs DESTDIR=${RD}/trees/bin
104	for i in ${EXTRADISTRIBUTIONS} ; do \
105		mkdir ${RD}/trees/$$i ; \
106		mkdir ${RD}/dists/$$i ; \
107		mtree -deU -f ${MTREEFILES}/BSD.root.dist \
108		    -p ${RD}/trees/$$i > /dev/null ; \
109		mtree -deU -f ${MTREEFILES}/BSD.usr.dist \
110		    -p ${RD}/trees/$$i/usr > /dev/null ; \
111		mtree -deU -f ${MTREEFILES}/BSD.var.dist \
112		    -p ${RD}/trees/$$i/var > /dev/null ; \
113	done
114	touch release.1
115
116# Install the system into the various distributions.
117release.2:
118	@cd ${.CURDIR} ; $(MAKE) ckRELEASEDIR
119	cd ${.CURDIR}/.. ; make distribute DISTDIR=${RD}/trees
120	touch release.2
121
122# Make and install a couple of kernels we need.
123release.3:
124	@cd ${.CURDIR} ; $(MAKE) ckRELEASEDIR
125	cd ${.CURDIR}/../sys/i386/conf ; \
126		config GENERIC ; \
127		config BOOTFLP
128	cd ${.CURDIR}/../sys/compile/GENERIC ; \
129		make depend ; \
130		make kernel ; \
131		install -c kernel ${RD}/trees/bin/kernel.GENERIC
132	ln -f ${RD}/trees/bin/kernel.GENERIC ${RD}/cpiofd/kernel
133	cd ${.CURDIR}/../sys/compile/BOOTFLP ; \
134		make depend ; \
135		make kernel ; \
136		install -s -c kernel ${RD}/bootfd/kernel
137	ln -f ${RD}/bootfd/kernel ${RD}/fixitfd/kernel
138	touch release.3
139
140# Make and install the two crunched binaries which live on the floppies.
141# You are not supposed to like this :-)
142release.4:
143	@cd ${.CURDIR} ; $(MAKE) ckRELEASEDIR
144	for j in boot cpio fixit; do \
145		rm -rf $${j}_crunch ; \
146		mkdir $${j}_crunch ; \
147		( cd $${j}_crunch ; \
148		crunchgen ${.CURDIR}/$${j}_crunch.conf ; \
149		${MAKE} -f $${j}_crunch.mk objs exe NOCRYPT=yes ) ; \
150		if [ $$j = cpio ] ; then \
151			cat < $${j}_crunch/$${j}_crunch \
152				> ${RD}/$${j}fd/stand/$${j}_crunch ; \
153		else \
154			gzip -9 < $${j}_crunch/$${j}_crunch \
155				> ${RD}/$${j}fd/stand/$${j}_crunch ; \
156		fi ; \
157		rm -rf $${j}_crunch ; \
158		chmod 555 ${RD}/$${j}fd/stand/$${j}_crunch ; \
159		for i in `crunchgen -l ${.CURDIR}/$${j}_crunch.conf` ; do \
160			ln -f ${RD}/$${j}fd/stand/$${j}_crunch \
161				${RD}/$${j}fd/stand/$$i ; \
162		done ; \
163	done
164	touch release.4
165
166# Fix up the distributions.
167release.5:
168	@cd ${.CURDIR} ; $(MAKE) ckRELEASEDIR
169	if [ -d ${RD}/trees/bin/usr/share/man ] ; then \
170		rm -rf ${RD}/trees/manpages/usr/share/man ;\
171		mv ${RD}/trees/bin/usr/share/man \
172			${RD}/trees/manpages/usr/share/man ;\
173	fi
174	if [ -d ${RD}/trees/bin/usr/games ] ; then \
175		rm -rf ${RD}/trees/games/usr/games ;\
176		mv ${RD}/trees/bin/usr/games \
177			${RD}/trees/games/usr/games ;\
178	fi
179	if [ -d ${RD}/trees/bin/usr/share/games ] ; then \
180		rm -rf ${RD}/trees/games/usr/share/games ;\
181		mv ${RD}/trees/bin/usr/share/games \
182			${RD}/trees/games/usr/share/games ;\
183	fi
184	if [ -d ${RD}/trees/bin/var/games ] ; then \
185		rm -rf ${RD}/trees/games/var/games ;\
186		mv ${RD}/trees/bin/var/games \
187			${RD}/trees/games/var/games ;\
188	fi
189	if [ -d ${RD}/trees/bin/usr/share/dict ] ; then \
190		rm -rf ${RD}/trees/dict/usr/share/dict ;\
191		mv ${RD}/trees/bin/usr/share/dict \
192			${RD}/trees/dict/usr/share/dict ;\
193	fi
194	for i in airport birthtoken flowers na.phone zipcodes ; do \
195		if [ -f ${RD}/trees/bin/usr/share/misc/$$i ] ; then \
196			mv ${RD}/trees/bin/usr/share/misc/$$i \
197				${RD}/trees/dict/usr/share/misc ; \
198		fi ; \
199	done
200	for i in ${RD}/trees/bin/usr/lib/*_p.a ; do \
201		if [ -f $$i ] ; then \
202			mv $$i \
203				${RD}/trees/proflibs/usr/lib ; \
204		fi ; \
205	done
206	-cd ${RD}/trees ; \
207		find ${EXTRADISTRIBUTIONS} -depth -type d -print | xargs rmdir
208
209	touch release.5
210
211# Complete the bootfd 
212release.6:
213	@cd ${.CURDIR} ; $(MAKE) ckRELEASEDIR
214	( cd ${RD}/trees/bin/dev ; \
215		ls console tty ttyv1 null zero \
216		sd[0123][a-h] wd[0123][a-h] fd[01] \
217		rsd[0123][a-h] rwd[0123][a-h] rfd[01] | \
218	cpio -dump ${RD}/bootfd/dev )
219	install -c ${.CURDIR}/../COPYRIGHT ${RD}/bootfd
220	cd ${RD}/trees/bin/usr/share/FAQ ; \
221		install -c diskspace.FAQ ${RD}/bootfd/DISKSPACE.FAQ ;\
222		install -c RELNOTES.FreeBSD ${RD}/bootfd ;\
223		install -c TROUBLESHOOTING ${RD}/bootfd ;\
224		install -c README-2.0 ${RD}/bootfd/README
225	touch ${RD}/bootfd/this_is_boot_flp
226	cd ${.CURDIR} ; ${MAKE} doFLOPPY FLOPPY=boot
227	touch release.6
228
229# Complete the cpiofd directory
230# XXX a lot of stuff is missing here...
231release.7:
232	@cd ${.CURDIR} ; $(MAKE) ckRELEASEDIR
233	cd ${RD}/trees/bin ; ls ${CPIO1} | cpio -dump ${RD}/cpiofd/stand
234	cd ${.CURDIR} ; ls ${CPIO2} | cpio -dumpv ${RD}/cpiofd/stand
235	chmod 755 ${RD}/cpiofd/stand/scripts/*
236	cp ${RD}/trees/bin/usr/sbin/tzsetup ${RD}/cpiofd/stand
237	( cd ${RD}/cpiofd ; \
238		( rm -f OK ; find . -print ; touch OK ; echo OK ) | \
239		cpio -H newc -oa | gzip -9 -c | dd conv=osync ) \
240		> ${RD}/floppies/cpio.flp
241	gzip -1 -c < ${RD}/floppies/cpio.flp > ${RD}/floppies/cpio.flp.gz
242	touch release.7
243
244# Make binary dists
245release.8:
246	@cd ${.CURDIR} ; $(MAKE) ckRELEASEDIR
247	rm -rf ${RD}/dists
248	mkdir -p ${RD}/dists
249	@for i in ${DISTRIBUTIONS} ; \
250	do \
251		if [ -d ${RD}/trees/$${i} ] ; then \
252			cd ${.CURDIR} ; \
253				$(MAKE) doTARBALL SD=${RD}/trees/$${i} \
254					TD=$$i ARG="." ; \
255			( cd ${RD}/dists/$${i}; \
256			sh -e ${.CURDIR}/scripts/mkchecksums.sh ) ; \
257			cp ${.CURDIR}/scripts/extract_$${i}.sh \
258				${RD}/dists/$${i}/extract.sh;\
259			echo "$${i} distribution is finished."; \
260		fi ; \
261	done                                                 
262	touch release.8
263
264
265# Make source dists
266release.9:
267	@cd ${.CURDIR} ; $(MAKE) ckRELEASEDIR
268	@cd ${.CURDIR} ; $(MAKE) doTARBALL SD=/usr/src TD=src/base ARG="[A-Z]*"
269	@for i in bin etc games gnu include lib libexec release sbin \
270		secure lkm eBones share sys usrbin usrsbin ; do \
271		if [ -d /usr/src/$$i ] ; then \
272			cd ${.CURDIR} ; \
273				$(MAKE) doTARBALL SD=/usr/src \
274					TD=src/$$i ARG="$$i" ; \
275		fi ; \
276	done
277	( cd ${RD}/dists/src; \
278	sh -e ${.CURDIR}/scripts/mkchecksums.sh ) ; \
279	cp ${.CURDIR}/scripts/extract_src.sh \
280		${RD}/dists/src/extract.sh;\
281	echo "src distribution is finished."; \
282	touch release.9
283
284# Complete the fixitfd
285release.10:
286	@cd ${.CURDIR} ; $(MAKE) ckRELEASEDIR
287	( cd ${RD}/trees/bin/dev ; \
288		ls console tty ttyv1 null zero \
289		sd[0123][a-h] wd[0123][a-h] fd[01] \
290		rsd[0123][a-h] rwd[0123][a-h] rfd[01] | \
291	cpio -dump ${RD}/fixitfd/dev )
292	ln -f ${RD}/fixitfd/stand/init ${RD}/fixitfd/sbin
293	ln -f ${RD}/fixitfd/stand/sh ${RD}/fixitfd/bin
294	cp ${RD}/trees/bin/usr/mdec/fdboot ${RD}/fixitfd/etc/boot1
295	cp ${RD}/trees/bin/usr/mdec/bootfd ${RD}/fixitfd/etc/boot2
296	cp ${.CURDIR}/fixit.profile ${RD}/fixitfd/.profile
297	echo 'echo /etc/rc'	> ${RD}/fixitfd/etc/rc
298	echo 'exit 1'		>> ${RD}/fixitfd/etc/rc
299	touch ${RD}/fixitfd/etc/spwd.db
300	cd ${.CURDIR} ; ${MAKE} doFLOPPY FLOPPY=fixit
301	touch release.10
302
303ftp.1:
304	rm -rf ${FD}
305	mkdir ${FD}
306	cd ${RD} && find floppies dists -print | cpio -dumplv ${FD}
307	cd ${RD}/trees/bin/usr/share/FAQ && ln -f ${FAQS} ${FD}
308
309# Various "subroutine" and other supporting targets.
310
311doTARBALL:
312.if !defined(SD)
313	@echo "SD undefined in doTARBALL" ; exit 1
314.endif               
315.if !defined(TD)
316	@echo "TB undefined in doTARBALL" ; exit 1
317.endif               
318.if !defined(ARG)
319	@echo "ARG undefined in doTARBALL" ; exit 1
320.endif               
321	rm -rf ${RD}/dists/${TD}
322	mkdir -p ${RD}/dists/${TD}
323	( cd ${SD} ; \
324		echo rolling ${TD} tarball ;\
325		tar --exclude CVS -cf - ${ARG} | \
326		${ZIPNSPLIT} ${RD}/dists/${TD}/`basename ${TD}`. )
327
328doRELEASE:  release.1 release.2 release.3 release.4 release.5 release.6 \
329		release.7 release.8 release.9 release.10
330	@echo "Release done"
331
332ckRELEASEDIR:
333.if !defined(RELEASEDIR)
334	@echo "To make a release RELEASEDIR must be defined" && false
335.endif               
336
337doFLOPPY:
338.if !defined(FLOPPY)
339	@echo "FLOPPY undefined in doFLOPPY" ; exit 1
340.endif
341	rm -f ${RD}/floppies/${FLOPPY}.tmp ${RD}/floppies/${FLOPPY}.flp
342.if defined(VNDEVICE)
343	if [ ! -b /dev/${VNDEVICE} -o ! -c /dev/r${VNDEVICE} ] ; then \
344		cd /dev && sh MAKEDEV ${VNDEVICE} ; fi
345	@umount /dev/${VNDEVICE} 2>/dev/null || true
346	@umount ${MNT} 2>/dev/null || true
347	@vnconfig -u /dev/r${VNDEVICE} 2>/dev/null || true
348	dd of=${RD}/floppies/${FLOPPY}.tmp if=/dev/zero \
349		bs=${FDCYLSIZE} count=${FDCYLS} 2>/dev/null
350	sync && sleep 5
351	vnconfig -c /dev/r${VNDEVICE} ${RD}/floppies/${FLOPPY}.tmp
352	disklabel -w -r -B \
353		-b ${RD}/trees/bin/usr/mdec/fdboot \
354		-s ${RD}/trees/bin/usr/mdec/bootfd \
355		/dev/r${VNDEVICE} ${FDLABEL}
356	newfs ${NEWFSARGS} /dev/r${VNDEVICE}
357	mount /dev/${VNDEVICE} ${MNT}
358	cd ${RD}/${FLOPPY}fd ; find . -print | cpio -dump ${MNT}
359	umount ${MNT}
360	fsck  /dev/r${VNDEVICE} < /dev/null
361.else
362	-umount /dev/${FDDEVICE}
363	-umount ${MNT}
364.if !defined(FDFORMAT)
365	echo y | fdformat /dev/r${FDDEVICE}
366.endif
367	disklabel -w -r -B \
368		-b ${RD}/trees/bin/usr/mdec/fdboot \
369		-s ${RD}/trees/bin/usr/mdec/bootfd \
370		/dev/r${FDDEVICE} ${FDLABEL}
371	newfs ${NEWFSARGS} /dev/r${FDDEVICE}
372	mount /dev/${FDDEVICE} ${MNT}
373	cd ${RD}/${FLOPPY}fd ; find . -print | cpio -dump ${MNT}
374	umount ${MNT}
375	fsck -n /dev/r${FDDEVICE} < /dev/null
376	dd if=/dev/r${FDDEVICE} of=${RD}/floppies/${FLOPPY}.tmp \
377		bs=${FDCYLSIZE} count=${FDCYLS}
378.endif
379	mv ${RD}/floppies/${FLOPPY}.tmp ${RD}/floppies/${FLOPPY}.flp
380	gzip -9 -c < ${RD}/floppies/${FLOPPY}.flp \
381		> ${RD}/floppies/${FLOPPY}.flp.gz
382
383.include <bsd.prog.mk>
384