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