Makefile revision 7450
1#	$Id: Makefile,v 1.126 1995/03/28 18:14:03 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		cd .. && rm -rf GENERIC
141	ln -f ${RD}/trees/bin/kernel.GENERIC ${RD}/cpiofd/kernel
142	cd ${.CURDIR}/../sys/compile/BOOTFLP && \
143		make depend && \
144		make kernel && \
145		install -s -c kernel ${RD}/bootfd/kernel && \
146		cd .. && rm -rf BOOTFLP
147	ln -f ${RD}/bootfd/kernel ${RD}/fixitfd/kernel
148	touch release.3
149
150# Make and install the two crunched binaries which live on the floppies.
151# You are not supposed to like this :-)
152release.4:
153	@cd ${.CURDIR} ; $(MAKE) ckRELEASEDIR
154	for j in boot cpio fixit; do \
155		rm -rf $${j}_crunch ; \
156		mkdir $${j}_crunch ; \
157		( cd $${j}_crunch ; \
158		crunchgen ${.CURDIR}/$${j}_crunch.conf ; \
159		${MAKE} -f $${j}_crunch.mk objs exe NOCRYPT=yes ) ; \
160		if [ $$j = cpio ] ; then \
161			cat < $${j}_crunch/$${j}_crunch \
162				> ${RD}/$${j}fd/stand/$${j}_crunch ; \
163		else \
164			gzip -9 < $${j}_crunch/$${j}_crunch \
165				> ${RD}/$${j}fd/stand/$${j}_crunch ; \
166		fi ; \
167		rm -rf $${j}_crunch ; \
168		chmod 555 ${RD}/$${j}fd/stand/$${j}_crunch ; \
169		for i in `crunchgen -l ${.CURDIR}/$${j}_crunch.conf` ; do \
170			ln -f ${RD}/$${j}fd/stand/$${j}_crunch \
171				${RD}/$${j}fd/stand/$$i ; \
172		done ; \
173	done
174	touch release.4
175
176# Fix up the distributions.
177release.5:
178	@cd ${.CURDIR} ; $(MAKE) ckRELEASEDIR
179	if [ -d ${RD}/trees/bin/usr/share/man ] ; then \
180		rm -rf ${RD}/trees/manpages/usr/share/man ;\
181		mv ${RD}/trees/bin/usr/share/man \
182			${RD}/trees/manpages/usr/share/man ;\
183	fi
184	if [ -d ${RD}/trees/bin/usr/games ] ; then \
185		rm -rf ${RD}/trees/games/usr/games ;\
186		mv ${RD}/trees/bin/usr/games \
187			${RD}/trees/games/usr/games ;\
188	fi
189	if [ -d ${RD}/trees/bin/usr/share/games ] ; then \
190		rm -rf ${RD}/trees/games/usr/share/games ;\
191		mv ${RD}/trees/bin/usr/share/games \
192			${RD}/trees/games/usr/share/games ;\
193	fi
194	if [ -d ${RD}/trees/bin/var/games ] ; then \
195		rm -rf ${RD}/trees/games/var/games ;\
196		mv ${RD}/trees/bin/var/games \
197			${RD}/trees/games/var/games ;\
198	fi
199	if [ -d ${RD}/trees/bin/usr/share/dict ] ; then \
200		rm -rf ${RD}/trees/dict/usr/share/dict ;\
201		mv ${RD}/trees/bin/usr/share/dict \
202			${RD}/trees/dict/usr/share/dict ;\
203	fi
204	for i in airport birthtoken flowers na.phone zipcodes ; do \
205		if [ -f ${RD}/trees/bin/usr/share/misc/$$i ] ; then \
206			mv ${RD}/trees/bin/usr/share/misc/$$i \
207				${RD}/trees/dict/usr/share/misc ; \
208		fi ; \
209	done
210	mv ${RD}/trees/bin/usr/share/info/* \
211		${RD}/trees/info/usr/share/info
212	for i in ${RD}/trees/bin/usr/lib/*_p.a ; do \
213		if [ -f $$i ] ; then \
214			mv $$i \
215				${RD}/trees/proflibs/usr/lib ; \
216		fi ; \
217	done
218	cd ${RD}/usr/share/misc && rm -f termcap.db vgrindefs.db
219	-cd ${RD}/trees ; \
220		find bin ${EXPORT_DISTS} -depth -type d -print | xargs rmdir
221
222	touch release.5
223
224# Complete the bootfd 
225release.6:
226	@cd ${.CURDIR} ; $(MAKE) ckRELEASEDIR
227	( cd ${RD}/trees/bin/dev ; \
228		ls console tty ttyv1 null zero \
229		sd[0123][a-h] wd[0123][a-h] fd[01] \
230		rsd[0123][a-h] rwd[0123][a-h] rfd[01] | \
231	cpio -dump ${RD}/bootfd/dev )
232	install -c ${.CURDIR}/../COPYRIGHT ${RD}/bootfd
233	cd ${RD}/trees/bin/usr/share/FAQ/Text ; \
234		install -c diskspace.FAQ ${RD}/bootfd/DISKSPACE.FAQ ;\
235		install -c RELNOTES.FreeBSD ${RD}/bootfd ;\
236		install -c TROUBLESHOOTING ${RD}/bootfd ;\
237		install -c README ${RD}/bootfd/README
238	touch ${RD}/bootfd/this_is_boot_flp
239	cd ${.CURDIR} ; ${MAKE} doFLOPPY FLOPPY=boot
240	touch release.6
241
242# Complete the cpiofd directory
243# XXX a lot of stuff is missing here...
244release.7:
245	@cd ${.CURDIR} ; $(MAKE) ckRELEASEDIR
246	cd ${RD}/trees/bin ; ls ${CPIO1} | cpio -dump ${RD}/cpiofd/stand
247	cd ${.CURDIR} ; ls ${CPIO2} | cpio -dumpv ${RD}/cpiofd/stand
248	( JUST_TELL_ME=please ; . ${.CURDIR}/../sys/conf/newvers.sh ; \
249	sed "/DISTNAME=/s/FOOBAR/$$DISTNAME/" \
250		< ${RD}/cpiofd/stand/scripts/miscfuncs.sh \
251		> ${RD}/cpiofd/stand/scripts/tmp ;\
252	)
253	mv ${RD}/cpiofd/stand/scripts/tmp \
254		${RD}/cpiofd/stand/scripts/miscfuncs.sh
255	chmod 755 ${RD}/cpiofd/stand/scripts/*
256	cp ${RD}/trees/bin/usr/sbin/tzsetup ${RD}/cpiofd/stand
257	( cd ${RD}/cpiofd ; \
258		( rm -f OK ; find . -print ; touch OK ; echo OK ) | \
259		cpio -H newc -oa | gzip -9 -c | dd conv=osync ) \
260		> ${RD}/floppies/cpio.flp
261	gzip -1 -c < ${RD}/floppies/cpio.flp > ${RD}/floppies/cpio.flp.gz
262	touch release.7
263
264# Make binary dists
265release.8:
266	@cd ${.CURDIR} ; $(MAKE) ckRELEASEDIR
267	rm -rf ${RD}/dists
268	mkdir -p ${RD}/dists
269	@for i in ${DISTRIBUTIONS} ; \
270	do \
271		if [ -d ${RD}/trees/$${i} ] ; then \
272			cd ${.CURDIR} ; \
273				$(MAKE) doTARBALL SD=${RD}/trees/$${i} \
274					TN=$$i TD=$$i ARG="." ; \
275			( cd ${RD}/dists/$${i}; \
276			sh -e ${.CURDIR}/scripts/mkchecksums.sh ) ; \
277			cp ${.CURDIR}/scripts/extract_$${i}.sh \
278				${RD}/dists/$${i}/extract.sh;\
279			echo "$${i} distribution is finished."; \
280		fi ; \
281	done                                                 
282	touch release.8
283
284
285# Make source dists
286release.9:
287	@cd ${.CURDIR} ; $(MAKE) ckRELEASEDIR
288	@cd ${.CURDIR} ; $(MAKE) doTARBALL SD=/usr/src \
289		TD=src TN=srcbase ARG="[A-Z]*"
290	@for i in `cd /usr/src ; echo *` ; do \
291		if [ -d /usr/src/$$i -a "$$i" != "CVS" ] ; then \
292			cd ${.CURDIR} ; \
293			$(MAKE) doTARBALL SD=/usr/src \
294				TN=`echo src$$i | tr -d '.' | sed 's/usr/u/'` \
295				TD=src ARG="$$i" ; \
296		fi ; \
297	done
298	( cd ${RD}/dists/src; \
299	sh -e ${.CURDIR}/scripts/mkchecksums.sh ) ; \
300	cp ${.CURDIR}/scripts/extract_src.sh \
301		${RD}/dists/src/extract.sh;\
302	echo "src distribution is finished."; \
303	touch release.9
304
305# Complete the fixitfd
306release.10:
307	@cd ${.CURDIR} ; $(MAKE) ckRELEASEDIR
308	( cd ${RD}/trees/bin/dev ; \
309		ls console tty ttyv1 null zero \
310		sd[0123][a-h] wd[0123][a-h] fd[01] \
311		rsd[0123][a-h] rwd[0123][a-h] rfd[01] | \
312	cpio -dump ${RD}/fixitfd/dev )
313	ln -f ${RD}/fixitfd/stand/init ${RD}/fixitfd/sbin
314	ln -f ${RD}/fixitfd/stand/sh ${RD}/fixitfd/bin
315	cp ${RD}/trees/bin/usr/mdec/fdboot ${RD}/fixitfd/etc/boot1
316	cp ${RD}/trees/bin/usr/mdec/bootfd ${RD}/fixitfd/etc/boot2
317	cp ${.CURDIR}/fixit.profile ${RD}/fixitfd/.profile
318	echo 'echo /etc/rc'	> ${RD}/fixitfd/etc/rc
319	echo 'exit 1'		>> ${RD}/fixitfd/etc/rc
320	touch ${RD}/fixitfd/etc/spwd.db
321	cd ${.CURDIR} ; ${MAKE} doFLOPPY FLOPPY=fixit
322	touch release.10
323
324ftp.1:
325	rm -rf ${FD}
326	mkdir ${FD}
327	cd ${RD} && find floppies -print | cpio -dumpl ${FD}
328	cd ${RD}/dists && find . -print | cpio -dumpl ${FD}
329	cd ${RD}/trees/bin/usr/share/FAQ/Text && ln -f ${FAQS} ${FD}
330
331cdrom.1:
332	rm -rf ${CD}
333	mkdir ${CD}
334	mkdir ${CD}/filesys
335	cd ${RD} && find floppies dists bootfd -print | cpio -dumpl ${CD}
336	cd ${CD} && mv bootfd bootcd
337	for i in ${DISTRIBUTIONS} ; \
338	do \
339		if [ -d ${RD}/trees/$${i} ] ; then \
340			( cd ${RD}/trees/$${i}; \
341			find . -depth -print | cpio -dumpl ${CD}/filesys ) ; \
342		fi \
343	done
344
345# Various "subroutine" and other supporting targets.
346
347doTARBALL:
348.if !defined(SD)
349	@echo "SD undefined in doTARBALL" ; exit 1
350.endif               
351.if !defined(TD)
352	@echo "TB undefined in doTARBALL" ; exit 1
353.endif               
354.if !defined(ARG)
355	@echo "ARG undefined in doTARBALL" ; exit 1
356.endif               
357	rm -rf ${RD}/dists/${TD}/${TN}*
358	mkdir -p ${RD}/dists/${TD}
359	( cd ${SD} ; \
360		echo rolling ${TD}/${TN} tarball ;\
361		tar --exclude CVS --exclude obj -cf - ${ARG} | \
362		${ZIPNSPLIT} ${RD}/dists/${TD}/${TN}. )
363
364doRELEASE:  release.1 release.2 release.3 release.4 release.5 release.6 \
365		release.7 release.8 release.9 release.10
366	@echo "Release done"
367
368ckRELEASEDIR:
369.if !defined(RELEASEDIR)
370	@echo "To make a release RELEASEDIR must be defined" && false
371.endif               
372
373doFLOPPY:
374.if !defined(FLOPPY)
375	@echo "FLOPPY undefined in doFLOPPY" ; exit 1
376.endif
377	rm -f ${RD}/floppies/${FLOPPY}.tmp ${RD}/floppies/${FLOPPY}.flp
378.if defined(VNDEVICE)
379	if [ ! -b /dev/${VNDEVICE} -o ! -c /dev/r${VNDEVICE} ] ; then \
380		cd /dev && sh MAKEDEV ${VNDEVICE} ; fi
381	@umount /dev/${VNDEVICE} 2>/dev/null || true
382	@umount ${MNT} 2>/dev/null || true
383	@vnconfig -u /dev/r${VNDEVICE} 2>/dev/null || true
384	dd of=${RD}/floppies/${FLOPPY}.tmp if=/dev/zero \
385		bs=${FDCYLSIZE} count=${FDCYLS} 2>/dev/null
386	sync && sleep 5
387	vnconfig -c /dev/r${VNDEVICE} ${RD}/floppies/${FLOPPY}.tmp
388	disklabel -w -r -B \
389		-b ${RD}/trees/bin/usr/mdec/fdboot \
390		-s ${RD}/trees/bin/usr/mdec/bootfd \
391		/dev/r${VNDEVICE} ${FDLABEL}
392	newfs ${NEWFSARGS} /dev/r${VNDEVICE}
393	mount /dev/${VNDEVICE} ${MNT}
394	cd ${RD}/${FLOPPY}fd ; find . -print | cpio -dump ${MNT}
395	umount ${MNT}
396	fsck  /dev/r${VNDEVICE} < /dev/null
397.else
398	-umount /dev/${FDDEVICE}
399	-umount ${MNT}
400.if !defined(FDFORMAT)
401	echo y | fdformat /dev/r${FDDEVICE}
402.endif
403	disklabel -w -r -B \
404		-b ${RD}/trees/bin/usr/mdec/fdboot \
405		-s ${RD}/trees/bin/usr/mdec/bootfd \
406		/dev/r${FDDEVICE} ${FDLABEL}
407	newfs ${NEWFSARGS} /dev/r${FDDEVICE}
408	mount /dev/${FDDEVICE} ${MNT}
409	cd ${RD}/${FLOPPY}fd ; find . -print | cpio -dump ${MNT}
410	umount ${MNT}
411	fsck -n /dev/r${FDDEVICE} < /dev/null
412	dd if=/dev/r${FDDEVICE} of=${RD}/floppies/${FLOPPY}.tmp \
413		bs=${FDCYLSIZE} count=${FDCYLS}
414.endif
415	mv ${RD}/floppies/${FLOPPY}.tmp ${RD}/floppies/${FLOPPY}.flp
416	gzip -9 -c < ${RD}/floppies/${FLOPPY}.flp \
417		> ${RD}/floppies/${FLOPPY}.flp.gz
418
419.include <bsd.prog.mk>
420