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