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