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