Makefile.bootcd revision 1.29
11.29Smartin#	$NetBSD: Makefile.bootcd,v 1.29 2015/05/27 09:27:40 martin Exp $
21.1Shubertf#
31.1Shubertf# Makefile snipped to create a CD/DVD ISO
41.1Shubertf#
51.1Shubertf
61.1Shubertf# XXX TODO:
71.1Shubertf# 1) merge with src/distrib/cdrom
81.1Shubertf# 2) teach makefs to add data from more than 1 directory (see below)
91.1Shubertf
101.1Shubertf#
111.1Shubertf# Required variables:
121.1Shubertf#	CDBASE		Basename of the iso
131.1Shubertf#
141.1Shubertf# Optional variables:
151.1Shubertf#	CDRELEASE	Set to 'true' to include $RELEASEDIR/$MACHINE on the CD
161.7Shubertf#	CDRELEASE_NOISOS Excludes installation/cdrom directory if set
171.9Schristos#	CDSOURCE	Set to 'true' to include $RELEASEDIR/source on the CD
181.13Ssborrill#	CDEXTRA		Set to a list of files or directories containing extra
191.13Ssborrill#			stuff to put on CD (set by build.sh -C flag)
201.13Ssborrill#	CDBUILDEXTRA	Set to a list of files or directories containing extra
211.13Ssborrill#			stuff to put on CD (use in Makefiles)
221.13Ssborrill#	CDEXTRA_SKIP	A list of file exclusion paths to exclude when copying
231.13Ssborrill#			directories of extra stuff in CDEXTRA AND CDBUILDEXTRA
241.1Shubertf#	BOOT		Defaults to $DESTDIR/usr/mdec/boot
251.1Shubertf#	BOOTXX_CD9660	Defaults to $DESTDIR/usr/mdec/bootxx_cd9660
261.1Shubertf#	CDBOOTOPTIONS	Options for installboot, eg -o console=com0,speed=9600
271.8Sbouyer#	CDMAKEFSOPTIONS	Options for makefs, eg bootimage=i386;bootxx,no-emul-boot
281.25Smartin#	CDMAKEFSEXTRAOPTS additional options for makefs, e.g. -F specfile
291.1Shubertf#	CDROMS_RELEASEDIR Where to install ${CDBASE}.iso
301.8Sbouyer#	CDINSTKERNEL	instkernel directory (relative to ${.CURDIR})
311.8Sbouyer#	CDKERNELS	couples of the form:
321.8Sbouyer#				source	name_on_cd
331.15Sad#	CDRUNTIME	files/directories to copy from $DESTDIR onto the CD
341.28Smartin#	CD_SETS		sets to be extracted onto the CD
351.28Smartin#			(default: base modules etc)
361.28Smartin#	SETS_DIR	where the CD_SETS are found (default provided)
371.12Ssborrill# source kernels are copied from ${CDINSTKERNEL} (or its obj dir)
381.12Ssborrill# note that as of yet, bootxx_cd9660 can't load kernel names of more than
391.12Ssborrill# 8 chars (though they can be in a sub-directory meaning the pathname is
401.12Ssborrill# longer than 8 chars)
411.1Shubertf#
421.1Shubertf
431.1ShubertfBOOT?=		${DESTDIR}/usr/mdec/boot
441.1ShubertfBOOTXX_CD9660?=	${DESTDIR}/usr/mdec/bootxx_cd9660
451.1ShubertfCDRELEASE?=	false
461.9SchristosCDSOURCE?=	false
471.8Sbouyer.if ${CDRELEASE} == false
481.8SbouyerCDROMS_RELEASEDIR?=	${MACHINE}/installation/cdrom
491.8Sbouyer.else
501.20SrizCDROMS_RELEASEDIR?=	images
511.8Sbouyer.endif
521.7Shubertf.if defined(CDRELEASE_NOISOS)
531.7ShubertfCDRELEASE_EXCLUDE=	-s ',./installation/cdrom.*,,gp'
541.7Shubertf.endif
551.19Stsutsui.if !defined(CDRELEASE_LIVEIMAGE)
561.19StsutsuiCDRELEASE_EXCLUDE+=	-s ',./installation/liveimage.*,,gp'
571.19Stsutsui.endif
581.19Stsutsui.if !defined(CDRELEASE_INSTALLIMAGE)
591.19StsutsuiCDRELEASE_EXCLUDE+=	-s ',./installation/installimage.*,,gp'
601.19Stsutsui.endif
611.1Shubertf
621.28SmartinCD_SETS?=	base modules etc
631.28SmartinSETS_DIR?=	${RELEASEDIR}/${RELEASEMACHINEDIR}/binary/sets
641.28Smartin
651.8Sbouyer.include <bsd.own.mk> 		# For PRINTOBJDIR
661.8Sbouyer.include <bsd.kernobj.mk>	# For KERNSRCDIR
671.8Sbouyer
681.18SjmcneillDISTRIBVER!=	${HOST_SH} ${KERNSRCDIR}/conf/osrelease.sh
691.8SbouyerDISTRIBREV!=	${HOST_SH} ${KERNSRCDIR}/conf/osrelease.sh -s
701.28SmartinCUROBJDIR!=	cd ${.CURDIR} && ${PRINTOBJDIR}
711.8SbouyerISO_VOLID!=	echo NETBSD_${DISTRIBREV} | tr a-z A-Z
721.8SbouyerPUBLISHER?= The_NetBSD_Project
731.8Sbouyer.if defined(CDMAKEFSOPTIONS)
741.22Schristos_CDMAKEFSOPTIONS=	rockridge,label=${ISO_VOLID},publisher=${PUBLISHER},${CDMAKEFSOPTIONS}
751.8Sbouyer.else
761.22Schristos_CDMAKEFSOPTIONS=	rockridge,label=${ISO_VOLID},publisher=${PUBLISHER}
771.8Sbouyer.endif
781.8Sbouyer
791.28Smartin.if ${MKUNPRIVED} == "no"
801.28SmartinCD_METALOG.unpriv=
811.29Smartinmtunpriv=""
821.28Smartin.else
831.28SmartinCD_METALOG.unpriv=-M ${METALOG}.sanitised
841.29Smartinmtunpriv="-U"
851.28Smartin.endif
861.28Smartin
871.1Shubertf# Stuff that should come from elsewhere - XXX where? - HF
881.1ShubertfCP?=		cp
891.1ShubertfRM?=		rm
901.1ShubertfMKDIR?=		mkdir -p
911.1ShubertfCHMOD?=		chmod
921.17SchristosECHO?=		echo
931.1Shubertf
941.18Sjmcneill.if ${CDRELEASE} == false
951.18SjmcneillCDIMAGE=	${CDBASE}.iso
961.18Sjmcneill.else
971.18SjmcneillCDIMAGE=	NetBSD-${DISTRIBVER}-${CDBASE:S/cd$//}.iso
981.18Sjmcneill.endif
991.28SmartinWORKSPEC=	fs.spec
1001.28SmartinCDMAKEFSEXTRAOPTS+=-F ${WORKSPEC}
1011.1Shubertf
1021.18SjmcneillCLEANFILES+=	${CDIMAGE}
1031.8SbouyerCLEANFILES+=	bootxx.${MACHINE}
1041.28SmartinCLEANFILES+=	${WORKSPEC}
1051.1Shubertf
1061.28SmartinCDSETSENV=	DESTDIR=${DESTDIR:Q} \
1071.28Smartin		MACHINE=${MACHINE:Q} \
1081.28Smartin		MACHINE_ARCH=${MACHINE_ARCH:Q} \
1091.28Smartin		AWK=${TOOL_AWK:Q} \
1101.28Smartin		CKSUM=${TOOL_CKSUM:Q} \
1111.28Smartin		DB=${TOOL_DB:Q} \
1121.28Smartin		HOST_SH=${HOST_SH:Q} \
1131.28Smartin		MAKE=${MAKE:Q} \
1141.28Smartin		MKTEMP=${TOOL_MKTEMP:Q} \
1151.28Smartin		MTREE=${TOOL_MTREE:Q} \
1161.28Smartin		PAX=${TOOL_PAX:Q} \
1171.28Smartin		COMPRESS_PROGRAM=${COMPRESS_PROGRAM:Q} \
1181.28Smartin		GZIP=${GZIP_FLAGS:Q} \
1191.28Smartin		PKG_CREATE=${TOOL_PKG_CREATE:Q} \
1201.28Smartin		SED=${TOOL_SED:Q} \
1211.28Smartin		TSORT=${TSORT:Q} \
1221.28Smartin		MKRUMP=no \
1231.28Smartin		MKCOMPAT=no \
1241.28Smartin		MKDEBUG=no \
1251.28Smartin		MKDEBUGLIB=no
1261.28Smartin
1271.28SmartinCDSETSCMD=	cd ${NETBSDSRCDIR}/distrib/sets && \
1281.28Smartin		${CDSETSENV} \
1291.28Smartin		${HOST_SH}
1301.1Shubertf
1311.1Shubertf.include "${NETBSDSRCDIR}/distrib/common/Makefile.distrib"
1321.1Shubertf
1331.8Sbouyer.if defined(CDINSTKERNEL)
1341.8Sbouyer_INSTKERNELNOBJDIR!=	cd ${.CURDIR}/${CDINSTKERNEL} && ${PRINTOBJDIR}
1351.8Sbouyer.endif
1361.8Sbouyer.if exists(${DESTDIR}/usr/mdec/bootxx_cd9660)
1371.8Sbouyer.if exists(${DESTDIR}/usr/mdec/boot.${MACHINE})
1381.8SbouyerBOOT2=boot.${MACHINE}
1391.8Sbouyer.else
1401.8SbouyerBOOT2=boot
1411.8Sbouyer.endif
1421.8Sbouyer.endif
1431.1Shubertf
1441.1Shubertfprepare:
1451.28Smartin	${MKDIR} "${CUROBJDIR}/cdrom"
1461.8Sbouyer.if defined(CDKERNELS)
1471.8Sbouyer.for kernel target in ${CDKERNELS}
1481.8Sbouyer	${CP} ${_INSTKERNELNOBJDIR}/${kernel} cdrom/${target}
1491.8Sbouyer.endfor
1501.8Sbouyer.if exists(${DESTDIR}/usr/mdec/bootxx_cd9660)
1511.8Sbouyer	${RM} -f cdrom/${BOOT2}
1521.8Sbouyer	${CP} ${DESTDIR}/usr/mdec/${BOOT2} cdrom/${BOOT2}
1531.8Sbouyer	${RM} -f bootxx.${MACHINE}
1541.8Sbouyer	${CP} ${DESTDIR}/usr/mdec/bootxx_cd9660 bootxx.${MACHINE}
1551.8Sbouyer	${CHMOD} +w bootxx.${MACHINE}
1561.8Sbouyer.if defined(CDBOOTOPTIONS)
1571.8Sbouyer	${TOOL_INSTALLBOOT} -m${MACHINE} -e ${CDBOOTOPTIONS} bootxx.${MACHINE}
1581.8Sbouyer.endif
1591.8Sbouyer.endif
1601.8Sbouyer.endif
1611.1Shubertf
1621.24Sdsl.if ${MAKEVERBOSE} >= 2
1631.24SdslPAX_v?= -v
1641.24Sdsl.else
1651.24SdslPAX_v?=
1661.24Sdsl.endif
1671.24Sdsl
1681.1Shubertf# Copy $RELEASEDIR/${MACHINE} in the CDROM dir
1691.1Shubertf#
1701.1Shubertf# XXX This could be done a lot easier if makefs(8) could
1711.1Shubertf# XXX include more than one directory on the image - HF
1721.1Shubertf#
1731.1Shubertfcopy-releasedir:
1741.18Sjmcneill	${RM} -f ${RELEASEDIR}/${CDROMS_RELEASEDIR}/${CDIMAGE}
1751.9Schristos	if ${CDRELEASE}; then 						\
1761.28Smartin		if [ ! -d ${RELEASEDIR}/${RELEASEMACHINEDIR} ]; then 	\
1771.14Smatt			echo "Missing ${RELEASEDIR}/${RELEASEMACHINEDIR}, aborting"; \
1781.9Schristos			exit 1; 					\
1791.9Schristos		fi; 							\
1801.28Smartin		${MKDIR} "${CUROBJDIR}/cdrom/${MACHINE}"; 		\
1811.28Smartin		release_destdir="${CUROBJDIR}/cdrom/${MACHINE}";	\
1821.15Sad		cd ${RELEASEDIR}/${RELEASEMACHINEDIR}; 			\
1831.9Schristos		echo Copying $$(pwd) to $$release_destdir ...; 		\
1841.7Shubertf		${TOOL_PAX} 						\
1851.24Sdsl			-rw -pe ${PAX_v}				\
1861.7Shubertf			${CDRELEASE_EXCLUDE}				\
1871.9Schristos			. $$release_destdir; 				\
1881.28Smartin		cd "${CUROBJDIR}";					\
1891.9Schristos	fi
1901.9Schristos	if ${CDSOURCE}; then 						\
1911.9Schristos		if [ ! -d ${RELEASEDIR}/source ]; then	 		\
1921.9Schristos			echo "Missing ${RELEASEDIR}/source, aborting"; 	\
1931.9Schristos			exit 1; 					\
1941.9Schristos		fi; 							\
1951.28Smartin		${MKDIR} "${CUROBJDIR}/cdrom/source"; 			\
1961.28Smartin		release_destdir="${CUROBJDIR}/cdrom/source";	 	\
1971.9Schristos		cd ${RELEASEDIR}/source; 				\
1981.9Schristos		echo Copying $$(pwd) to $$release_destdir ...;		\
1991.9Schristos		${TOOL_PAX} 						\
2001.24Sdsl			-rw -pe ${PAX_v}				\
2011.9Schristos			. $$release_destdir; 				\
2021.28Smartin		cd "${CUROBJDIR}";					\
2031.1Shubertf	fi
2041.28Smartin	if [ "X${CDRUNTIME}" != "X" ]; then				\
2051.15Sad		release_destdir=$${curdir}/cdrom;			\
2061.15Sad		cd $$release_destdir;					\
2071.15Sad		cd ${DESTDIR};						\
2081.15Sad		for cde in ${CDRUNTIME};				\
2091.15Sad		do							\
2101.24Sdsl			${TOOL_PAX} -rw -pp ${PAX_v} $${cde} $$release_destdir;\
2111.15Sad		done;							\
2121.28Smartin		cd "${CUROBJDIR}";					\
2131.15Sad	fi
2141.13Ssborrill	if [ "X${CDEXTRA}${CDBUILDEXTRA}" != "X" ]; then		\
2151.13Ssborrill		skipflag="";						\
2161.16Shubertf		cdextra_skip="${CDEXTRA_SKIP}";				\
2171.16Shubertf		if [ "X$${cdextra_skip}" != "X" ]; then			\
2181.13Ssborrill			rm -f cdskip;					\
2191.16Shubertf			for skip in $${cdextra_skip};			\
2201.13Ssborrill			do						\
2211.13Ssborrill				echo $${skip} >> cdskip;		\
2221.13Ssborrill			done;						\
2231.28Smartin			skipflag="-X ${CUROBJDIR:Q}/cdskip";		\
2241.13Ssborrill		fi;							\
2251.16Shubertf		cdextra="${CDEXTRA}"; 					\
2261.16Shubertf		cdbuildextra="${CDBUILDEXTRA}"; 			\
2271.16Shubertf		for cde in $${cdextra} $${cdbuildextra};		\
2281.13Ssborrill		do							\
2291.28Smartin			release_destdir="${CUROBJDIR}/cdrom";		\
2301.13Ssborrill			if [ -f $${cde} ]; then				\
2311.13Ssborrill				echo Copying $${cde} to $$release_destdir ...;	\
2321.13Ssborrill				${CP} $${cde} $${release_destdir};	\
2331.13Ssborrill			elif [ -d $${cde} ]; then			\
2341.13Ssborrill				cd $${cde};				\
2351.13Ssborrill				echo Copying $$(pwd) to $$release_destdir ...;	\
2361.13Ssborrill				${TOOL_MTREE} -c $${skipflag} |		\
2371.24Sdsl					${TOOL_PAX} -rw -pe ${PAX_v} -M	\
2381.13Ssborrill					$$release_destdir; 		\
2391.13Ssborrill			else						\
2401.13Ssborrill				echo "Missing $${cde}, aborting"; 	\
2411.13Ssborrill				exit 1; 				\
2421.13Ssborrill			fi; 						\
2431.28Smartin			cd "${CUROBJDIR}";				\
2441.13Ssborrill		done;							\
2451.11Sjnemeth	fi
2461.28Smartin.if !empty(CD_SETS)
2471.28Smartin	${MKDIR} "${CUROBJDIR}/cdrom/etc/mtree"
2481.28Smartin.for set in ${CD_SETS}
2491.28Smartin	if [ -f ${CUROBJDIR:Q}/cdrom/etc/mtree/set.${set} ]; then	\
2501.28Smartin		${CHMOD} +w ${CUROBJDIR:Q}/cdrom/etc/mtree/set.${set};	\
2511.28Smartin	fi;								\
2521.28Smartin	${CDSETSCMD} ./maketars -i "${CUROBJDIR}/cdrom"			\
2531.29Smartin	    ${CD_METALOG.unpriv} ${mtunpriv} -N ${NETBSDSRCDIR}/etc	\
2541.28Smartin	    -F "${CUROBJDIR}/cdrom/etc/mtree"				\
2551.28Smartin	    -d "${DESTDIR:S,^$,/,}" ${set}
2561.28Smartin.endfor
2571.28Smartin	if [ -d "${CUROBJDIR}/cdrom/var/spool/ftp/hidden" ]; then	\
2581.28Smartin		${CHMOD} +r "${CUROBJDIR}/cdrom/var/spool/ftp/hidden";	\
2591.28Smartin	fi
2601.28Smartin.endif
2611.1Shubertf
2621.1Shubertfimage:
2631.28Smartin	@echo Preparing spec files for makefs...
2641.28Smartin	${RM} -f ${WORKSPEC}
2651.28Smartin	cat cdrom/etc/mtree/* |					\
2661.28Smartin	    ${TOOL_SED} -e 's/ size=[0-9]*//'				\
2671.28Smartin	     -e '/^\.\/etc\/gettytab/d' > ${WORKSPEC}
2681.28Smartin	${HOST_SH} cdrom/dev/MAKEDEV -s all |			\
2691.28Smartin	    ${TOOL_SED} -e '/^\. type=dir/d' -e 's,^\.,./dev,' >> ${WORKSPEC}
2701.28Smartin.if defined(SPEC_IN)
2711.28Smartin	cat ${SPEC_IN} >> ${WORKSPEC}
2721.28Smartin.endif
2731.28Smartin.if defined(SECONDARY_BOOT)
2741.28Smartin	echo "./${SECONDARY_BOOT} type=file uname=root gname=wheel mode=0444" \
2751.28Smartin	    >> ${WORKSPEC}
2761.28Smartin.endif
2771.28Smartin.if defined(SPEC_EXTRA)
2781.28Smartin	cat ${SPEC_EXTRA} >> ${WORKSPEC}
2791.28Smartin.endif
2801.28Smartin	${TOOL_MAKEFS} -N ${NETBSDSRCDIR}/etc -t cd9660 ${CDMAKEFSEXTRAOPTS} -o ${_CDMAKEFSOPTIONS:Q} ${CDIMAGE} cdrom
2811.8Sbouyer
2821.8Sbouyer.if ${CDRELEASE} == false
2831.15Sadrelease: prepare .WAIT prepare_md_post .WAIT copy-releasedir .WAIT image_md_pre .WAIT image .WAIT image_md_post
2841.8Sbouyer	${MKDIR} ${RELEASEDIR}/${CDROMS_RELEASEDIR}
2851.18Sjmcneill	${RELEASE_INSTALL} ${CDIMAGE} ${RELEASEDIR}/${CDROMS_RELEASEDIR}
2861.1Shubertf
2871.8Sbouyeriso_image:
2881.8Sbouyer.else
2891.1Shubertfrelease:
2901.8Sbouyer
2911.15Sadiso_image: prepare .WAIT prepare_md_post .WAIT copy-releasedir .WAIT image_md_pre .WAIT image .WAIT image_md_post
2921.8Sbouyer	${MKDIR} ${RELEASEDIR}/${CDROMS_RELEASEDIR}
2931.18Sjmcneill	${RELEASE_INSTALL} ${CDIMAGE} ${RELEASEDIR}/${CDROMS_RELEASEDIR}
2941.8Sbouyer.endif
2951.1Shubertf
2961.1Shubertfclean:
2971.28Smartin	@if [ -d cdrom/var/spool/ftp/hidden ]; then 		\
2981.28Smartin		${CHMOD} +r cdrom/var/spool/ftp/hidden;		\
2991.28Smartin	fi	# XXX
3001.1Shubertf	${RM} -fr cdrom
3011.1Shubertf
3021.8Sbouyerprepare_md_post: .PHONY
3031.8Sbouyerimage_md_post: .PHONY
3041.15Sadimage_md_pre: .PHONY
3051.8Sbouyer
3061.1Shubertf.include <bsd.prog.mk>
307