Makefile.bootcd revision 1.29
1# $NetBSD: Makefile.bootcd,v 1.29 2015/05/27 09:27:40 martin 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/$MACHINE on the CD 16# CDRELEASE_NOISOS Excludes installation/cdrom directory if set 17# CDSOURCE Set to 'true' to include $RELEASEDIR/source on the CD 18# CDEXTRA Set to a list of files or directories containing extra 19# stuff to put on CD (set by build.sh -C flag) 20# CDBUILDEXTRA Set to a list of files or directories containing extra 21# stuff to put on CD (use in Makefiles) 22# CDEXTRA_SKIP A list of file exclusion paths to exclude when copying 23# directories of extra stuff in CDEXTRA AND CDBUILDEXTRA 24# BOOT Defaults to $DESTDIR/usr/mdec/boot 25# BOOTXX_CD9660 Defaults to $DESTDIR/usr/mdec/bootxx_cd9660 26# CDBOOTOPTIONS Options for installboot, eg -o console=com0,speed=9600 27# CDMAKEFSOPTIONS Options for makefs, eg bootimage=i386;bootxx,no-emul-boot 28# CDMAKEFSEXTRAOPTS additional options for makefs, e.g. -F specfile 29# CDROMS_RELEASEDIR Where to install ${CDBASE}.iso 30# CDINSTKERNEL instkernel directory (relative to ${.CURDIR}) 31# CDKERNELS couples of the form: 32# source name_on_cd 33# CDRUNTIME files/directories to copy from $DESTDIR onto the CD 34# CD_SETS sets to be extracted onto the CD 35# (default: base modules etc) 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_LIVEIMAGE) 56CDRELEASE_EXCLUDE+= -s ',./installation/liveimage.*,,gp' 57.endif 58.if !defined(CDRELEASE_INSTALLIMAGE) 59CDRELEASE_EXCLUDE+= -s ',./installation/installimage.*,,gp' 60.endif 61 62CD_SETS?= base modules etc 63SETS_DIR?= ${RELEASEDIR}/${RELEASEMACHINEDIR}/binary/sets 64 65.include <bsd.own.mk> # For PRINTOBJDIR 66.include <bsd.kernobj.mk> # For KERNSRCDIR 67 68DISTRIBVER!= ${HOST_SH} ${KERNSRCDIR}/conf/osrelease.sh 69DISTRIBREV!= ${HOST_SH} ${KERNSRCDIR}/conf/osrelease.sh -s 70CUROBJDIR!= cd ${.CURDIR} && ${PRINTOBJDIR} 71ISO_VOLID!= echo NETBSD_${DISTRIBREV} | tr a-z A-Z 72PUBLISHER?= The_NetBSD_Project 73.if defined(CDMAKEFSOPTIONS) 74_CDMAKEFSOPTIONS= rockridge,label=${ISO_VOLID},publisher=${PUBLISHER},${CDMAKEFSOPTIONS} 75.else 76_CDMAKEFSOPTIONS= rockridge,label=${ISO_VOLID},publisher=${PUBLISHER} 77.endif 78 79.if ${MKUNPRIVED} == "no" 80CD_METALOG.unpriv= 81mtunpriv="" 82.else 83CD_METALOG.unpriv=-M ${METALOG}.sanitised 84mtunpriv="-U" 85.endif 86 87# Stuff that should come from elsewhere - XXX where? - HF 88CP?= cp 89RM?= rm 90MKDIR?= mkdir -p 91CHMOD?= chmod 92ECHO?= echo 93 94.if ${CDRELEASE} == false 95CDIMAGE= ${CDBASE}.iso 96.else 97CDIMAGE= NetBSD-${DISTRIBVER}-${CDBASE:S/cd$//}.iso 98.endif 99WORKSPEC= fs.spec 100CDMAKEFSEXTRAOPTS+=-F ${WORKSPEC} 101 102CLEANFILES+= ${CDIMAGE} 103CLEANFILES+= bootxx.${MACHINE} 104CLEANFILES+= ${WORKSPEC} 105 106CDSETSENV= DESTDIR=${DESTDIR:Q} \ 107 MACHINE=${MACHINE:Q} \ 108 MACHINE_ARCH=${MACHINE_ARCH:Q} \ 109 AWK=${TOOL_AWK:Q} \ 110 CKSUM=${TOOL_CKSUM:Q} \ 111 DB=${TOOL_DB:Q} \ 112 HOST_SH=${HOST_SH:Q} \ 113 MAKE=${MAKE:Q} \ 114 MKTEMP=${TOOL_MKTEMP:Q} \ 115 MTREE=${TOOL_MTREE:Q} \ 116 PAX=${TOOL_PAX:Q} \ 117 COMPRESS_PROGRAM=${COMPRESS_PROGRAM:Q} \ 118 GZIP=${GZIP_FLAGS:Q} \ 119 PKG_CREATE=${TOOL_PKG_CREATE:Q} \ 120 SED=${TOOL_SED:Q} \ 121 TSORT=${TSORT:Q} \ 122 MKRUMP=no \ 123 MKCOMPAT=no \ 124 MKDEBUG=no \ 125 MKDEBUGLIB=no 126 127CDSETSCMD= cd ${NETBSDSRCDIR}/distrib/sets && \ 128 ${CDSETSENV} \ 129 ${HOST_SH} 130 131.include "${NETBSDSRCDIR}/distrib/common/Makefile.distrib" 132 133.if defined(CDINSTKERNEL) 134_INSTKERNELNOBJDIR!= cd ${.CURDIR}/${CDINSTKERNEL} && ${PRINTOBJDIR} 135.endif 136.if exists(${DESTDIR}/usr/mdec/bootxx_cd9660) 137.if exists(${DESTDIR}/usr/mdec/boot.${MACHINE}) 138BOOT2=boot.${MACHINE} 139.else 140BOOT2=boot 141.endif 142.endif 143 144prepare: 145 ${MKDIR} "${CUROBJDIR}/cdrom" 146.if defined(CDKERNELS) 147.for kernel target in ${CDKERNELS} 148 ${CP} ${_INSTKERNELNOBJDIR}/${kernel} cdrom/${target} 149.endfor 150.if exists(${DESTDIR}/usr/mdec/bootxx_cd9660) 151 ${RM} -f cdrom/${BOOT2} 152 ${CP} ${DESTDIR}/usr/mdec/${BOOT2} cdrom/${BOOT2} 153 ${RM} -f bootxx.${MACHINE} 154 ${CP} ${DESTDIR}/usr/mdec/bootxx_cd9660 bootxx.${MACHINE} 155 ${CHMOD} +w bootxx.${MACHINE} 156.if defined(CDBOOTOPTIONS) 157 ${TOOL_INSTALLBOOT} -m${MACHINE} -e ${CDBOOTOPTIONS} bootxx.${MACHINE} 158.endif 159.endif 160.endif 161 162.if ${MAKEVERBOSE} >= 2 163PAX_v?= -v 164.else 165PAX_v?= 166.endif 167 168# Copy $RELEASEDIR/${MACHINE} in the CDROM dir 169# 170# XXX This could be done a lot easier if makefs(8) could 171# XXX include more than one directory on the image - HF 172# 173copy-releasedir: 174 ${RM} -f ${RELEASEDIR}/${CDROMS_RELEASEDIR}/${CDIMAGE} 175 if ${CDRELEASE}; then \ 176 if [ ! -d ${RELEASEDIR}/${RELEASEMACHINEDIR} ]; then \ 177 echo "Missing ${RELEASEDIR}/${RELEASEMACHINEDIR}, aborting"; \ 178 exit 1; \ 179 fi; \ 180 ${MKDIR} "${CUROBJDIR}/cdrom/${MACHINE}"; \ 181 release_destdir="${CUROBJDIR}/cdrom/${MACHINE}"; \ 182 cd ${RELEASEDIR}/${RELEASEMACHINEDIR}; \ 183 echo Copying $$(pwd) to $$release_destdir ...; \ 184 ${TOOL_PAX} \ 185 -rw -pe ${PAX_v} \ 186 ${CDRELEASE_EXCLUDE} \ 187 . $$release_destdir; \ 188 cd "${CUROBJDIR}"; \ 189 fi 190 if ${CDSOURCE}; then \ 191 if [ ! -d ${RELEASEDIR}/source ]; then \ 192 echo "Missing ${RELEASEDIR}/source, aborting"; \ 193 exit 1; \ 194 fi; \ 195 ${MKDIR} "${CUROBJDIR}/cdrom/source"; \ 196 release_destdir="${CUROBJDIR}/cdrom/source"; \ 197 cd ${RELEASEDIR}/source; \ 198 echo Copying $$(pwd) to $$release_destdir ...; \ 199 ${TOOL_PAX} \ 200 -rw -pe ${PAX_v} \ 201 . $$release_destdir; \ 202 cd "${CUROBJDIR}"; \ 203 fi 204 if [ "X${CDRUNTIME}" != "X" ]; then \ 205 release_destdir=$${curdir}/cdrom; \ 206 cd $$release_destdir; \ 207 cd ${DESTDIR}; \ 208 for cde in ${CDRUNTIME}; \ 209 do \ 210 ${TOOL_PAX} -rw -pp ${PAX_v} $${cde} $$release_destdir;\ 211 done; \ 212 cd "${CUROBJDIR}"; \ 213 fi 214 if [ "X${CDEXTRA}${CDBUILDEXTRA}" != "X" ]; then \ 215 skipflag=""; \ 216 cdextra_skip="${CDEXTRA_SKIP}"; \ 217 if [ "X$${cdextra_skip}" != "X" ]; then \ 218 rm -f cdskip; \ 219 for skip in $${cdextra_skip}; \ 220 do \ 221 echo $${skip} >> cdskip; \ 222 done; \ 223 skipflag="-X ${CUROBJDIR:Q}/cdskip"; \ 224 fi; \ 225 cdextra="${CDEXTRA}"; \ 226 cdbuildextra="${CDBUILDEXTRA}"; \ 227 for cde in $${cdextra} $${cdbuildextra}; \ 228 do \ 229 release_destdir="${CUROBJDIR}/cdrom"; \ 230 if [ -f $${cde} ]; then \ 231 echo Copying $${cde} to $$release_destdir ...; \ 232 ${CP} $${cde} $${release_destdir}; \ 233 elif [ -d $${cde} ]; then \ 234 cd $${cde}; \ 235 echo Copying $$(pwd) to $$release_destdir ...; \ 236 ${TOOL_MTREE} -c $${skipflag} | \ 237 ${TOOL_PAX} -rw -pe ${PAX_v} -M \ 238 $$release_destdir; \ 239 else \ 240 echo "Missing $${cde}, aborting"; \ 241 exit 1; \ 242 fi; \ 243 cd "${CUROBJDIR}"; \ 244 done; \ 245 fi 246.if !empty(CD_SETS) 247 ${MKDIR} "${CUROBJDIR}/cdrom/etc/mtree" 248.for set in ${CD_SETS} 249 if [ -f ${CUROBJDIR:Q}/cdrom/etc/mtree/set.${set} ]; then \ 250 ${CHMOD} +w ${CUROBJDIR:Q}/cdrom/etc/mtree/set.${set}; \ 251 fi; \ 252 ${CDSETSCMD} ./maketars -i "${CUROBJDIR}/cdrom" \ 253 ${CD_METALOG.unpriv} ${mtunpriv} -N ${NETBSDSRCDIR}/etc \ 254 -F "${CUROBJDIR}/cdrom/etc/mtree" \ 255 -d "${DESTDIR:S,^$,/,}" ${set} 256.endfor 257 if [ -d "${CUROBJDIR}/cdrom/var/spool/ftp/hidden" ]; then \ 258 ${CHMOD} +r "${CUROBJDIR}/cdrom/var/spool/ftp/hidden"; \ 259 fi 260.endif 261 262image: 263 @echo Preparing spec files for makefs... 264 ${RM} -f ${WORKSPEC} 265 cat cdrom/etc/mtree/* | \ 266 ${TOOL_SED} -e 's/ size=[0-9]*//' \ 267 -e '/^\.\/etc\/gettytab/d' > ${WORKSPEC} 268 ${HOST_SH} cdrom/dev/MAKEDEV -s all | \ 269 ${TOOL_SED} -e '/^\. type=dir/d' -e 's,^\.,./dev,' >> ${WORKSPEC} 270.if defined(SPEC_IN) 271 cat ${SPEC_IN} >> ${WORKSPEC} 272.endif 273.if defined(SECONDARY_BOOT) 274 echo "./${SECONDARY_BOOT} type=file uname=root gname=wheel mode=0444" \ 275 >> ${WORKSPEC} 276.endif 277.if defined(SPEC_EXTRA) 278 cat ${SPEC_EXTRA} >> ${WORKSPEC} 279.endif 280 ${TOOL_MAKEFS} -N ${NETBSDSRCDIR}/etc -t cd9660 ${CDMAKEFSEXTRAOPTS} -o ${_CDMAKEFSOPTIONS:Q} ${CDIMAGE} cdrom 281 282.if ${CDRELEASE} == false 283release: prepare .WAIT prepare_md_post .WAIT copy-releasedir .WAIT image_md_pre .WAIT image .WAIT image_md_post 284 ${MKDIR} ${RELEASEDIR}/${CDROMS_RELEASEDIR} 285 ${RELEASE_INSTALL} ${CDIMAGE} ${RELEASEDIR}/${CDROMS_RELEASEDIR} 286 287iso_image: 288.else 289release: 290 291iso_image: prepare .WAIT prepare_md_post .WAIT copy-releasedir .WAIT image_md_pre .WAIT image .WAIT image_md_post 292 ${MKDIR} ${RELEASEDIR}/${CDROMS_RELEASEDIR} 293 ${RELEASE_INSTALL} ${CDIMAGE} ${RELEASEDIR}/${CDROMS_RELEASEDIR} 294.endif 295 296clean: 297 @if [ -d cdrom/var/spool/ftp/hidden ]; then \ 298 ${CHMOD} +r cdrom/var/spool/ftp/hidden; \ 299 fi # XXX 300 ${RM} -fr cdrom 301 302prepare_md_post: .PHONY 303image_md_post: .PHONY 304image_md_pre: .PHONY 305 306.include <bsd.prog.mk> 307