Makefile.bootcd revision 1.26
1#	$NetBSD: Makefile.bootcd,v 1.26 2015/05/18 06:25:04 martin Exp $
2#
3# Makefile snipped to create a CD/DVD ISO
4#
5
6# XXX TODO:
7# 1) merge with src/distrib/cdrom
8# 2) teach makefs to add data from more than 1 directory (see below)
9
10#
11# Required variables:
12#	CDBASE		Basename of the iso
13#
14# Optional variables:
15#	CDRELEASE	Set to 'true' to include $RELEASEDIR/$MACHINE on the CD
16#	CDRELEASE_NOISOS Excludes installation/cdrom directory if set
17#	CDSOURCE	Set to 'true' to include $RELEASEDIR/source on the CD
18#	CDEXTRA		Set to a list of files or directories containing extra
19#			stuff to put on CD (set by build.sh -C flag)
20#	CDBUILDEXTRA	Set to a list of files or directories containing extra
21#			stuff to put on CD (use in Makefiles)
22#	CDEXTRA_SKIP	A list of file exclusion paths to exclude when copying
23#			directories of extra stuff in CDEXTRA AND CDBUILDEXTRA
24#	BOOT		Defaults to $DESTDIR/usr/mdec/boot
25#	BOOTXX_CD9660	Defaults to $DESTDIR/usr/mdec/bootxx_cd9660
26#	CDBOOTOPTIONS	Options for installboot, eg -o console=com0,speed=9600
27#	CDMAKEFSOPTIONS	Options for makefs, eg bootimage=i386;bootxx,no-emul-boot
28#	CDMAKEFSEXTRAOPTS additional options for makefs, e.g. -F specfile
29#	CDROMS_RELEASEDIR Where to install ${CDBASE}.iso
30#	CDINSTKERNEL	instkernel directory (relative to ${.CURDIR})
31#	CDKERNELS	couples of the form:
32#				source	name_on_cd
33#	CDRUNTIME	files/directories to copy from $DESTDIR onto the CD
34#	CD_SETS		sets to be extracted onto the CD
35#			(default: base modules etc)
36#	SETS_DIR	where the CD_SETS are found (default provided)
37# source kernels are copied from ${CDINSTKERNEL} (or its obj dir)
38# note that as of yet, bootxx_cd9660 can't load kernel names of more than
39# 8 chars (though they can be in a sub-directory meaning the pathname is
40# longer than 8 chars)
41#
42
43BOOT?=		${DESTDIR}/usr/mdec/boot
44BOOTXX_CD9660?=	${DESTDIR}/usr/mdec/bootxx_cd9660
45CDRELEASE?=	false
46CDSOURCE?=	false
47.if ${CDRELEASE} == false
48CDROMS_RELEASEDIR?=	${MACHINE}/installation/cdrom
49.else
50CDROMS_RELEASEDIR?=	images
51.endif
52.if defined(CDRELEASE_NOISOS)
53CDRELEASE_EXCLUDE=	-s ',./installation/cdrom.*,,gp'
54.endif
55.if !defined(CDRELEASE_LIVEIMAGE)
56CDRELEASE_EXCLUDE+=	-s ',./installation/liveimage.*,,gp'
57.endif
58.if !defined(CDRELEASE_INSTALLIMAGE)
59CDRELEASE_EXCLUDE+=	-s ',./installation/installimage.*,,gp'
60.endif
61
62CD_SETS?=	base modules etc
63SETS_DIR?=	${RELEASEDIR}/${RELEASEMACHINEDIR}/binary/sets
64
65.include <bsd.own.mk> 		# For PRINTOBJDIR
66.include <bsd.kernobj.mk>	# For KERNSRCDIR
67
68DISTRIBVER!=	${HOST_SH} ${KERNSRCDIR}/conf/osrelease.sh
69DISTRIBREV!=	${HOST_SH} ${KERNSRCDIR}/conf/osrelease.sh -s
70CUROBJDIR!=	cd ${.CURDIR} && ${PRINTOBJDIR}
71ISO_VOLID!=	echo NETBSD_${DISTRIBREV} | tr a-z A-Z
72PUBLISHER?= The_NetBSD_Project
73.if defined(CDMAKEFSOPTIONS)
74_CDMAKEFSOPTIONS=	rockridge,label=${ISO_VOLID},publisher=${PUBLISHER},${CDMAKEFSOPTIONS}
75.else
76_CDMAKEFSOPTIONS=	rockridge,label=${ISO_VOLID},publisher=${PUBLISHER}
77.endif
78
79.if ${MKUNPRIVED} == "no"
80CD_METALOG.unpriv=
81.else
82CD_METALOG.unpriv=-M ${METALOG}.sanitised
83.endif
84
85# Stuff that should come from elsewhere - XXX where? - HF
86CP?=		cp
87RM?=		rm
88MKDIR?=		mkdir -p
89CHMOD?=		chmod
90ECHO?=		echo
91
92.if ${CDRELEASE} == false
93CDIMAGE=	${CDBASE}.iso
94.else
95CDIMAGE=	NetBSD-${DISTRIBVER}-${CDBASE:S/cd$//}.iso
96.endif
97WORKSPEC=	fs.spec
98CDMAKEFSEXTRAOPTS+=-F ${WORKSPEC}
99
100CLEANFILES+=	${CDIMAGE}
101CLEANFILES+=	bootxx.${MACHINE}
102CLEANFILES+=	${WORKSPEC}
103
104CDSETSENV=	DESTDIR=${DESTDIR:Q} \
105		MACHINE=${MACHINE:Q} \
106		MACHINE_ARCH=${MACHINE_ARCH:Q} \
107		AWK=${TOOL_AWK:Q} \
108		CKSUM=${TOOL_CKSUM:Q} \
109		DB=${TOOL_DB:Q} \
110		HOST_SH=${HOST_SH:Q} \
111		MAKE=${MAKE:Q} \
112		MKTEMP=${TOOL_MKTEMP:Q} \
113		MTREE=${TOOL_MTREE:Q} \
114		PAX=${TOOL_PAX:Q} \
115		COMPRESS_PROGRAM=${COMPRESS_PROGRAM:Q} \
116		GZIP=${GZIP_FLAGS:Q} \
117		PKG_CREATE=${TOOL_PKG_CREATE:Q} \
118		SED=${TOOL_SED:Q} \
119		TSORT=${TSORT:Q} \
120		MKRUMP=no \
121		MKCOMPAT=no \
122		MKDEBUG=no \
123		MKDEBUGLIB=no
124
125CDSETSCMD=	cd ${NETBSDSRCDIR}/distrib/sets && \
126		${CDSETSENV} \
127		${HOST_SH}
128
129.include "${NETBSDSRCDIR}/distrib/common/Makefile.distrib"
130
131.if defined(CDINSTKERNEL)
132_INSTKERNELNOBJDIR!=	cd ${.CURDIR}/${CDINSTKERNEL} && ${PRINTOBJDIR}
133.endif
134.if exists(${DESTDIR}/usr/mdec/bootxx_cd9660)
135.if exists(${DESTDIR}/usr/mdec/boot.${MACHINE})
136BOOT2=boot.${MACHINE}
137.else
138BOOT2=boot
139.endif
140.endif
141
142prepare:
143	${MKDIR} "${CUROBJDIR}/cdrom"
144.if defined(CDKERNELS)
145.for kernel target in ${CDKERNELS}
146	${CP} ${_INSTKERNELNOBJDIR}/${kernel} cdrom/${target}
147.endfor
148.if exists(${DESTDIR}/usr/mdec/bootxx_cd9660)
149	${RM} -f cdrom/${BOOT2}
150	${CP} ${DESTDIR}/usr/mdec/${BOOT2} cdrom/${BOOT2}
151	${RM} -f bootxx.${MACHINE}
152	${CP} ${DESTDIR}/usr/mdec/bootxx_cd9660 bootxx.${MACHINE}
153	${CHMOD} +w bootxx.${MACHINE}
154.if defined(CDBOOTOPTIONS)
155	${TOOL_INSTALLBOOT} -m${MACHINE} -e ${CDBOOTOPTIONS} bootxx.${MACHINE}
156.endif
157.endif
158.endif
159
160.if ${MAKEVERBOSE} >= 2
161PAX_v?= -v
162.else
163PAX_v?=
164.endif
165
166# Copy $RELEASEDIR/${MACHINE} in the CDROM dir
167#
168# XXX This could be done a lot easier if makefs(8) could
169# XXX include more than one directory on the image - HF
170#
171copy-releasedir:
172	${RM} -f ${RELEASEDIR}/${CDROMS_RELEASEDIR}/${CDIMAGE}
173	if ${CDRELEASE}; then 						\
174		if [ ! -d ${RELEASEDIR}/${RELEASEMACHINEDIR} ]; then 	\
175			echo "Missing ${RELEASEDIR}/${RELEASEMACHINEDIR}, aborting"; \
176			exit 1; 					\
177		fi; 							\
178		${MKDIR} "${CUROBJDIR}/cdrom/${MACHINE}"; 		\
179		release_destdir="${CUROBJDIR}/cdrom/${MACHINE}";	\
180		cd ${RELEASEDIR}/${RELEASEMACHINEDIR}; 			\
181		echo Copying $$(pwd) to $$release_destdir ...; 		\
182		${TOOL_PAX} 						\
183			-rw -pe ${PAX_v}				\
184			${CDRELEASE_EXCLUDE}				\
185			. $$release_destdir; 				\
186		cd "${CUROBJDIR}";					\
187	fi
188	if ${CDSOURCE}; then 						\
189		if [ ! -d ${RELEASEDIR}/source ]; then	 		\
190			echo "Missing ${RELEASEDIR}/source, aborting"; 	\
191			exit 1; 					\
192		fi; 							\
193		${MKDIR} "${CUROBJDIR}/cdrom/source"; 			\
194		release_destdir="${CUROBJDIR}/cdrom/source";	 	\
195		cd ${RELEASEDIR}/source; 				\
196		echo Copying $$(pwd) to $$release_destdir ...;		\
197		${TOOL_PAX} 						\
198			-rw -pe ${PAX_v}				\
199			. $$release_destdir; 				\
200		cd "${CUROBJDIR}";					\
201	fi
202	if [ "X${CDRUNTIME}" != "X" ]; then				\
203		release_destdir=$${curdir}/cdrom;			\
204		cd $$release_destdir;					\
205		cd ${DESTDIR};						\
206		for cde in ${CDRUNTIME};				\
207		do							\
208			${TOOL_PAX} -rw -pp ${PAX_v} $${cde} $$release_destdir;\
209		done;							\
210		cd "${CUROBJDIR}";					\
211	fi
212	if [ "X${CDEXTRA}${CDBUILDEXTRA}" != "X" ]; then		\
213		skipflag="";						\
214		cdextra_skip="${CDEXTRA_SKIP}";				\
215		if [ "X$${cdextra_skip}" != "X" ]; then			\
216			rm -f cdskip;					\
217			for skip in $${cdextra_skip};			\
218			do						\
219				echo $${skip} >> cdskip;		\
220			done;						\
221			skipflag="-X ${CUROBJDIR:Q}/cdskip";		\
222		fi;							\
223		cdextra="${CDEXTRA}"; 					\
224		cdbuildextra="${CDBUILDEXTRA}"; 			\
225		for cde in $${cdextra} $${cdbuildextra};		\
226		do							\
227			release_destdir="${CUROBJDIR}/cdrom";		\
228			if [ -f $${cde} ]; then				\
229				echo Copying $${cde} to $$release_destdir ...;	\
230				${CP} $${cde} $${release_destdir};	\
231			elif [ -d $${cde} ]; then			\
232				cd $${cde};				\
233				echo Copying $$(pwd) to $$release_destdir ...;	\
234				${TOOL_MTREE} -c $${skipflag} |		\
235					${TOOL_PAX} -rw -pe ${PAX_v} -M	\
236					$$release_destdir; 		\
237			else						\
238				echo "Missing $${cde}, aborting"; 	\
239				exit 1; 				\
240			fi; 						\
241			cd "${CUROBJDIR}";				\
242		done;							\
243	fi
244	${MKDIR} "${CUROBJDIR}/cdrom/etc/mtree"
245.for set in ${CD_SETS}
246	${CDSETSCMD} ./maketars -i "${CUROBJDIR}/cdrom"			\
247	    ${CD_METALOG.unpriv} -N ${NETBSDSRCDIR}/etc			\
248	    -F "${CUROBJDIR}/cdrom/etc/mtree"				\
249	    -d "${DESTDIR:S,^$,/,}" ${set}
250.endfor
251	${CHMOD} +r "${CUROBJDIR}/cdrom/var/spool/ftp/hidden"
252
253image:
254	@echo Preparing spec files for makefs...
255	${RM} -f ${WORKSPEC}
256	cat cdrom/etc/mtree/* |					\
257	    ${TOOL_SED} -e 's/ size=[0-9]*//'				\
258	     -e '/^\.\/etc\/gettytab/d' > ${WORKSPEC}
259	${HOST_SH} cdrom/dev/MAKEDEV -s all |			\
260	    ${TOOL_SED} -e '/^\. type=dir/d' -e 's,^\.,./dev,' >> ${WORKSPEC}
261.if defined(SPEC_IN)
262	cat ${SPEC_IN} >> ${WORKSPEC}
263.endif
264.if defined(SECONDARY_BOOT)
265	echo "./${SECONDARY_BOOT} type=file uname=root gname=wheel mode=0444" \
266	    >> ${WORKSPEC}
267.endif
268.if defined(SPEC_EXTRA)
269	cat ${SPEC_EXTRA} >> ${WORKSPEC}
270.endif
271	${TOOL_MAKEFS} -t cd9660 ${CDMAKEFSEXTRAOPTS} -o ${_CDMAKEFSOPTIONS:Q} ${CDIMAGE} cdrom
272
273.if ${CDRELEASE} == false
274release: prepare .WAIT prepare_md_post .WAIT copy-releasedir .WAIT image_md_pre .WAIT image .WAIT image_md_post
275	${MKDIR} ${RELEASEDIR}/${CDROMS_RELEASEDIR}
276	${RELEASE_INSTALL} ${CDIMAGE} ${RELEASEDIR}/${CDROMS_RELEASEDIR}
277
278iso_image:
279.else
280release:
281
282iso_image: prepare .WAIT prepare_md_post .WAIT copy-releasedir .WAIT image_md_pre .WAIT image .WAIT image_md_post
283	${MKDIR} ${RELEASEDIR}/${CDROMS_RELEASEDIR}
284	${RELEASE_INSTALL} ${CDIMAGE} ${RELEASEDIR}/${CDROMS_RELEASEDIR}
285.endif
286
287clean:
288	${RM} -fr cdrom
289
290prepare_md_post: .PHONY
291image_md_post: .PHONY
292image_md_pre: .PHONY
293
294.include <bsd.prog.mk>
295