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