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