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